diff --git a/OAgents.sln b/OAgents.sln
index 1dbbf08c..09acdc64 100644
--- a/OAgents.sln
+++ b/OAgents.sln
@@ -1,4 +1,5 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
@@ -28,7 +29,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Oagents.Dapr", "src\Oagents
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Oagents.Orleans", "src\Oagents.Orleans\Oagents.Orleans.csproj", "{8E900786-270D-4010-A279-CEDDB52B7422}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupportCenter", "samples\support-center\src\backend\SupportCenter.csproj", "{A6DCD7B2-8347-4C52-A808-B5E0A5CD453D}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "support-center", "support-center", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupportCenter.ApiService", "samples\support-center\SupportCenter.ApiService\SupportCenter.ApiService.csproj", "{585569C8-C856-AEE4-1C3C-A4C0563AE1E1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupportCenter.AppHost", "samples\support-center\SupportCenter.AppHost\SupportCenter.AppHost.csproj", "{CD5BEDC0-7828-3D9C-C122-2E1F91F6857D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupportCenter.Seed.Memory", "samples\support-center\SupportCenter.Seed.Memory\SupportCenter.Seed.Memory.csproj", "{8A0CBD24-EF97-3A62-2546-0A8C6EFC2394}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupportCenter.ServiceDefaults", "samples\support-center\SupportCenter.ServiceDefaults\SupportCenter.ServiceDefaults.csproj", "{D514E56F-1EBE-8DAC-F6E6-36110B95DF80}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupportCenter.Shared", "samples\support-center\SupportCenter.Shared\SupportCenter.Shared.csproj", "{09C02E5F-8DDF-119D-A093-FFF12F4C7AEF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -64,10 +75,26 @@ Global
{8E900786-270D-4010-A279-CEDDB52B7422}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8E900786-270D-4010-A279-CEDDB52B7422}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8E900786-270D-4010-A279-CEDDB52B7422}.Release|Any CPU.Build.0 = Release|Any CPU
- {A6DCD7B2-8347-4C52-A808-B5E0A5CD453D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A6DCD7B2-8347-4C52-A808-B5E0A5CD453D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A6DCD7B2-8347-4C52-A808-B5E0A5CD453D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A6DCD7B2-8347-4C52-A808-B5E0A5CD453D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {585569C8-C856-AEE4-1C3C-A4C0563AE1E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {585569C8-C856-AEE4-1C3C-A4C0563AE1E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {585569C8-C856-AEE4-1C3C-A4C0563AE1E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {585569C8-C856-AEE4-1C3C-A4C0563AE1E1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CD5BEDC0-7828-3D9C-C122-2E1F91F6857D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CD5BEDC0-7828-3D9C-C122-2E1F91F6857D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CD5BEDC0-7828-3D9C-C122-2E1F91F6857D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CD5BEDC0-7828-3D9C-C122-2E1F91F6857D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8A0CBD24-EF97-3A62-2546-0A8C6EFC2394}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8A0CBD24-EF97-3A62-2546-0A8C6EFC2394}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8A0CBD24-EF97-3A62-2546-0A8C6EFC2394}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8A0CBD24-EF97-3A62-2546-0A8C6EFC2394}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D514E56F-1EBE-8DAC-F6E6-36110B95DF80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D514E56F-1EBE-8DAC-F6E6-36110B95DF80}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D514E56F-1EBE-8DAC-F6E6-36110B95DF80}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D514E56F-1EBE-8DAC-F6E6-36110B95DF80}.Release|Any CPU.Build.0 = Release|Any CPU
+ {09C02E5F-8DDF-119D-A093-FFF12F4C7AEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {09C02E5F-8DDF-119D-A093-FFF12F4C7AEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {09C02E5F-8DDF-119D-A093-FFF12F4C7AEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {09C02E5F-8DDF-119D-A093-FFF12F4C7AEF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -84,6 +111,14 @@ Global
{B05CE76A-63ED-4F94-A531-A761BD8D6E52} = {290F9824-BAD3-4703-B9B7-FE9C4BE3A1CF}
{3D2FDE8E-EB13-4686-B662-1DD5FFFC0366} = {290F9824-BAD3-4703-B9B7-FE9C4BE3A1CF}
{8E900786-270D-4010-A279-CEDDB52B7422} = {290F9824-BAD3-4703-B9B7-FE9C4BE3A1CF}
- {A6DCD7B2-8347-4C52-A808-B5E0A5CD453D} = {943853E7-513D-45EA-870F-549CFC0AF8E8}
+ {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {943853E7-513D-45EA-870F-549CFC0AF8E8}
+ {585569C8-C856-AEE4-1C3C-A4C0563AE1E1} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {CD5BEDC0-7828-3D9C-C122-2E1F91F6857D} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {8A0CBD24-EF97-3A62-2546-0A8C6EFC2394} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {D514E56F-1EBE-8DAC-F6E6-36110B95DF80} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {09C02E5F-8DDF-119D-A093-FFF12F4C7AEF} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {B5B698EF-0ABD-4DB0-9C3B-31E9C739A00B}
EndGlobalSection
EndGlobal
diff --git a/nuget.config b/nuget.config
new file mode 100644
index 00000000..48f06d20
--- /dev/null
+++ b/nuget.config
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/Architect/Architect.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/Architect/Architect.cs
deleted file mode 100644
index 66812798..00000000
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/Architect/Architect.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using Dapr.Actors.Runtime;
-using Dapr.Client;
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Dapr;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-
-namespace Microsoft.AI.DevTeam.Dapr;
-
-
-// The architect has Org+Repo scope and is holding the knowledge of the high level architecture of the project
-public class Architect : AiAgent,IDaprAgent
-{
- public Architect(ActorHost host, DaprClient client, ISemanticTextMemory memory, Kernel kernel)
- : base(host, client, memory, kernel)
- {
- }
-
- public override Task HandleEvent(Event item)
- {
- return Task.CompletedTask;
- }
-}
-
-public class ArchitectState
-{
- public string FilesTree { get; set; }
- public string HighLevelArchitecture { get; set; }
-}
\ No newline at end of file
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/Developer/Developer.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/Developer/Developer.cs
index 8648cb60..7f1f01c9 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/Developer/Developer.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/Developer/Developer.cs
@@ -1,19 +1,17 @@
-using Dapr.Actors;
using Dapr.Actors.Runtime;
using Dapr.Client;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Dapr;
using Microsoft.AI.DevTeam.Dapr.Events;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
+using Microsoft.Extensions.AI;
namespace Microsoft.AI.DevTeam.Dapr;
public class Dev : AiAgent, IDaprAgent
{
private readonly ILogger _logger;
- public Dev(ActorHost host, DaprClient client, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(host, client, memory, kernel)
+ public Dev(ActorHost host, DaprClient client, IChatClient chatClient, ILogger logger)
+ : base(host, client, chatClient)
{
_logger = logger;
}
@@ -59,10 +57,8 @@ public async Task GenerateCode(string ask)
try
{
// TODO: ask the architect for the high level architecture as well as the files structure of the project
- var context = new KernelArguments { ["input"] = AppendChatHistory(ask)};
- var instruction = "Consider the following architectural guidelines:!waf!";
- var enhancedContext = await AddKnowledge(instruction, "waf",context);
- return await CallFunction(DeveloperSkills.Implement, enhancedContext);
+
+ return await CallFunction(DeveloperSkills.Implement);
}
catch (Exception ex)
{
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/DeveloperLead/DeveloperLead.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/DeveloperLead/DeveloperLead.cs
index bae10596..e6cf2b30 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/DeveloperLead/DeveloperLead.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/DeveloperLead/DeveloperLead.cs
@@ -1,19 +1,17 @@
-using Dapr.Actors;
using Dapr.Actors.Runtime;
using Dapr.Client;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Dapr;
using Microsoft.AI.DevTeam.Dapr.Events;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
+using Microsoft.Extensions.AI;
namespace Microsoft.AI.DevTeam.Dapr;
public class DeveloperLead : AiAgent, IDaprAgent
{
private readonly ILogger _logger;
- public DeveloperLead(ActorHost host, DaprClient client, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(host, client, memory, kernel)
+ public DeveloperLead(ActorHost host, DaprClient client,IChatClient chatClient, ILogger logger)
+ : base(host, client, chatClient)
{
_logger = logger;
}
@@ -58,12 +56,8 @@ public async Task CreatePlan(string ask)
{
try
{
- // TODO: Ask the architect for the existing high level architecture
- // as well as the file structure
- var context = new KernelArguments { ["input"] = AppendChatHistory(ask) };
- var instruction = "Consider the following architectural guidelines:!waf!";
- var enhancedContext = await AddKnowledge(instruction, "waf", context);
- return await CallFunction(DevLeadSkills.Plan, enhancedContext);
+
+ return await CallFunction(DevLeadSkills.Plan);
}
catch (Exception ex)
{
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/ProductManager/ProductManager.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/ProductManager/ProductManager.cs
index ce08c1d1..6f96a1b6 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/ProductManager/ProductManager.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Agents/ProductManager/ProductManager.cs
@@ -4,8 +4,7 @@
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Dapr;
using Microsoft.AI.DevTeam.Dapr.Events;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
+using Microsoft.Extensions.AI;
namespace Microsoft.AI.DevTeam.Dapr;
@@ -13,8 +12,8 @@ public class ProductManager : AiAgent, IDaprAgent
{
private readonly ILogger _logger;
- public ProductManager(ActorHost host, DaprClient client, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(host, client, memory, kernel)
+ public ProductManager(ActorHost host, DaprClient client, IChatClient chatClient, ILogger logger)
+ : base(host, client, chatClient)
{
_logger = logger;
}
@@ -59,10 +58,7 @@ public async Task CreateReadme(string ask)
{
try
{
- var context = new KernelArguments { ["input"] = AppendChatHistory(ask) };
- var instruction = "Consider the following architectural guidelines:!waf!";
- var enhancedContext = await AddKnowledge(instruction, "waf", context);
- return await CallFunction(PMSkills.Readme, enhancedContext);
+ return await CallFunction(PMSkills.Readme);
}
catch (Exception ex)
{
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Microsoft.AI.DevTeam.Dapr.csproj b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Microsoft.AI.DevTeam.Dapr.csproj
index 0173aa2f..0923d88e 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Microsoft.AI.DevTeam.Dapr.csproj
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Microsoft.AI.DevTeam.Dapr.csproj
@@ -13,29 +13,21 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
-
-
-
+
+
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Program.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Program.cs
index 8c938d18..dd9f9e68 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Program.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam.Dapr/Program.cs
@@ -1,16 +1,9 @@
using System.Text.Json;
-using Azure;
-using Azure.AI.OpenAI;
using Microsoft.Extensions.Options;
-using Microsoft.SemanticKernel;
using Octokit.Webhooks;
using Octokit.Webhooks.AspNetCore;
using Azure.Identity;
using Microsoft.Extensions.Azure;
-using Microsoft.Extensions.Http.Resilience;
-using Microsoft.SemanticKernel.Memory;
-using Microsoft.SemanticKernel.Connectors.Qdrant;
-using Microsoft.SemanticKernel.Connectors.OpenAI;
using Dapr;
using Dapr.Actors.Client;
using Dapr.Actors;
@@ -19,8 +12,6 @@
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton();
-builder.Services.AddTransient(CreateKernel);
-builder.Services.AddTransient(CreateMemory);
builder.Services.AddHttpClient();
builder.Services.AddSingleton(s =>
@@ -162,44 +153,4 @@ static async Task HandleEvent(IActorProxyFactory proxyFactory, string type, stri
{
throw;
}
-}
-
-static ISemanticTextMemory CreateMemory(IServiceProvider provider)
-{
- var openAiConfig = provider.GetService>().Value;
- var qdrantConfig = provider.GetService>().Value;
-
- var loggerFactory = LoggerFactory.Create(builder =>
- {
- builder
- .SetMinimumLevel(LogLevel.Debug)
- .AddConsole()
- .AddDebug();
- });
-
- var memoryBuilder = new MemoryBuilder();
- return memoryBuilder.WithLoggerFactory(loggerFactory)
- .WithQdrantMemoryStore(qdrantConfig.Endpoint, qdrantConfig.VectorSize)
- .WithAzureOpenAITextEmbeddingGeneration(openAiConfig.EmbeddingDeploymentOrModelId, openAiConfig.Endpoint, openAiConfig.ApiKey)
- .Build();
-}
-
-static Kernel CreateKernel(IServiceProvider provider)
-{
- var openAiConfig = provider.GetService>().Value;
- var clientOptions = new OpenAIClientOptions();
- clientOptions.Retry.NetworkTimeout = TimeSpan.FromMinutes(5);
- var openAIClient = new OpenAIClient(new Uri(openAiConfig.Endpoint), new AzureKeyCredential(openAiConfig.ApiKey), clientOptions);
- var builder = Kernel.CreateBuilder();
- builder.Services.AddLogging(c => c.AddConsole().AddDebug().SetMinimumLevel(LogLevel.Debug));
- builder.Services.AddAzureOpenAIChatCompletion(openAiConfig.DeploymentOrModelId, openAIClient);
- builder.Services.ConfigureHttpClientDefaults(c =>
- {
- c.AddStandardResilienceHandler().Configure(o =>
- {
- o.Retry.MaxRetryAttempts = 5;
- o.Retry.BackoffType = Polly.DelayBackoffType.Exponential;
- });
- });
- return builder.Build();
}
\ No newline at end of file
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Architect/Architect.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Architect/Architect.cs
deleted file mode 100644
index 5fa20dc5..00000000
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Architect/Architect.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
-
-namespace Microsoft.AI.DevTeam;
-
-
-// The architect has Org+Repo scope and is holding the knowledge of the high level architecture of the project
-[ImplicitStreamSubscription(Consts.MainNamespace)]
-public class Architect : AiAgent
-{
- protected override string Namespace => Consts.MainNamespace;
- public Architect([PersistentState("state", "messages")] IPersistentState> state, ISemanticTextMemory memory, Kernel kernel)
- : base(state, memory, kernel)
- {
- }
-
- public override Task HandleEvent(Event item)
- {
- return Task.CompletedTask;
- }
-}
-
-[GenerateSerializer]
-public class ArchitectState
-{
- [Id(0)]
- public string FilesTree { get; set; }
- [Id(1)]
- public string HighLevelArchitecture { get; set; }
-}
\ No newline at end of file
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer/Developer.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer.cs
similarity index 65%
rename from samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer/Developer.cs
rename to samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer.cs
index eed41e55..7bd4a594 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer/Developer.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer.cs
@@ -1,26 +1,15 @@
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
using Microsoft.AI.DevTeam.Events;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Connectors.OpenAI;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
+using Microsoft.Extensions.AI;
-namespace Microsoft.AI.DevTeam;
+namespace Microsoft.AI.DevTeam.Agents;
[ImplicitStreamSubscription(Consts.MainNamespace)]
-public class Dev : AiAgent, IDevelopApps
+public class Dev([PersistentState("state", "messages")] IPersistentState> state, IChatClient chatClient, ILogger logger) : AiAgent(state), IDevelopApps
{
protected override string Namespace => Consts.MainNamespace;
- private readonly ILogger _logger;
-
- public Dev([PersistentState("state", "messages")] IPersistentState> state, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(state, memory, kernel)
- {
- _logger = logger;
- }
-
public async override Task HandleEvent(Event item)
{
switch (item.Type)
@@ -65,20 +54,24 @@ public async Task GenerateCode(string ask)
try
{
// TODO: ask the architect for the high level architecture as well as the files structure of the project
- var context = new KernelArguments { ["input"] = AppendChatHistory(ask) };
+ var input = AppendChatHistory(ask);
var instruction = "Consider the following architectural guidelines:!waf!";
- var enhancedContext = await AddKnowledge(instruction, "waf", context);
- var settings = new OpenAIPromptExecutionSettings{
- ResponseFormat = "json_object",
- MaxTokens = 32768,
- Temperature = 0.4,
- TopP = 1
- };
- return await CallFunction(DeveloperSkills.Implement, enhancedContext);
+ var guidelines = "";// await AddKnowledge(instruction, "waf"); // TODO: fetch from Vector Store
+ var prompt = $"""
+ You are a Developer for an application.
+ Please output the code required to accomplish the task assigned to you below and wrap it in a bash script that creates the files.
+ Do not use any IDE commands and do not build and run the code.
+ Make specific choices about implementation. Do not offer a range of options.
+ Use comments in the code to describe the intent. Do not include other text other than code and code comments.
+ Input: {input}
+ {guidelines}
+ """;
+ var result = await chatClient.GetResponseAsync(prompt);
+ return result.Message.Text!;
}
catch (Exception ex)
{
- _logger.LogError(ex, "Error generating code");
+ logger.LogError(ex, "Error generating code");
return default;
}
}
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer/DeveloperPrompts.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer/DeveloperPrompts.cs
deleted file mode 100644
index d9d66602..00000000
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Developer/DeveloperPrompts.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-
-namespace Microsoft.AI.DevTeam;
-public static class DeveloperSkills {
- public static string Implement = """
- You are a Developer for an application.
- Please output the code required to accomplish the task assigned to you below and wrap it in a bash script that creates the files.
- Do not use any IDE commands and do not build and run the code.
- Make specific choices about implementation. Do not offer a range of options.
- Use comments in the code to describe the intent. Do not include other text other than code and code comments.
- Input: {{$input}}
- {{$waf}}
- """;
-
- public static string Improve = """
- You are a Developer for an application. Your job is to imrove the code that you are given in the input below.
- Please output a new version of code that fixes any problems with this version.
- If there is an error message in the input you should fix that error in the code.
- Wrap the code output up in a bash script that creates the necessary files by overwriting any previous files.
- Do not use any IDE commands and do not build and run the code.
- Make specific choices about implementation. Do not offer a range of options.
- Use comments in the code to describe the intent. Do not include other text other than code and code comments.
- Input: {{$input}}
- {{$waf}}
- """;
-
- public static string Explain = """
- You are an experienced software developer, with strong experience in Azure and Microsoft technologies.
- Extract the key features and capabilities of the code file below, with the intent to build an understanding of an entire code repository.
- You can include references or documentation links in your explanation. Also where appropriate please output a list of keywords to describe the code or its capabilities.
- Example:
- Keywords: Azure, networking, security, authentication
-
- ===code===
- {{$input}}
- ===end-code===
- Only include the points in a bullet point format and DON'T add anything outside of the bulleted list.
- Be short and concise.
- If the code's purpose is not clear output an error:
- Error: The model could not determine the purpose of the code.
- """;
-
- public static string ConsolidateUnderstanding = """
- You are an experienced software developer, with strong experience in Azure and Microsoft technologies.
- You are trying to build an understanding of the codebase from code files. This is the current understanding of the project:
- ===current-understanding===
- {{$input}}
- ===end-current-understanding===
- and this is the new information that surfaced
- ===new-understanding===
- {{$newUnderstanding}}
- ===end-new-understanding===
- Your job is to update your current understanding with the new information.
- Only include the points in a bullet point format and DON'T add anything outside of the bulleted list.
- Be short and concise.
- """;
-}
\ No newline at end of file
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead.cs
new file mode 100644
index 00000000..cbaee662
--- /dev/null
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead.cs
@@ -0,0 +1,140 @@
+using Microsoft.AI.Agents.Abstractions;
+using Microsoft.AI.Agents.Orleans;
+using Microsoft.AI.DevTeam.Events;
+using Microsoft.Extensions.AI;
+using System.Text.Json;
+
+namespace Microsoft.AI.DevTeam.Agents;
+[ImplicitStreamSubscription(Consts.MainNamespace)]
+public class DeveloperLead([PersistentState("state", "messages")] IPersistentState> state, IChatClient chatClient, ILogger logger) : AiAgent(state), ILeadDevelopers
+{
+ protected override string Namespace => Consts.MainNamespace;
+
+ public async override Task HandleEvent(Event item)
+ {
+ switch (item.Type)
+ {
+ case nameof(GithubFlowEventType.DevPlanRequested):
+ {
+ var context = item.ToGithubContext();
+ var plan = await CreatePlan(item.Data["input"]);
+ var data = context.ToData();
+ data["result"] = JsonSerializer.Serialize(plan);
+ await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event
+ {
+ Type = nameof(GithubFlowEventType.DevPlanGenerated),
+ Subject = context.Subject,
+ Data = data
+ });
+ }
+
+ break;
+ case nameof(GithubFlowEventType.DevPlanChainClosed):
+ {
+ var context = item.ToGithubContext();
+ var latestPlan = _state.State.History.Last().Message;
+ var data = context.ToData();
+ data["plan"] = latestPlan;
+ await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event
+ {
+ Type = nameof(GithubFlowEventType.DevPlanCreated),
+ Subject = context.Subject,
+ Data = data
+ });
+ }
+
+ break;
+ default:
+ break;
+ }
+ }
+ public async Task CreatePlan(string ask)
+ {
+ try
+ {
+ // TODO: Ask the architect for the existing high level architecture
+ // as well as the file structure
+ var input = AppendChatHistory(ask);
+ var instruction = "Consider the following architectural guidelines:!waf!";
+ var guidelines = ""; // await AddKnowledge(instruction, "waf");
+ var prompt = $$"""
+ You are a Dev Lead for an application team, building the application described below.
+ Please break down the steps and modules required to develop the complete application, describe each step in detail.
+ Make prescriptive architecture, language, and frameowrk choices, do not provide a range of choices.
+ For each step or module then break down the steps or subtasks required to complete that step or module.
+ For each subtask write an LLM prompt that would be used to tell a model to write the coee that will accomplish that subtask. If the subtask involves taking action/running commands tell the model to write the script that will run those commands.
+ In each LLM prompt restrict the model from outputting other text that is not in the form of code or code comments.
+ Please output a JSON array data structure, in the precise schema shown below, with a list of steps and a description of each step, and the steps or subtasks that each requires, and the LLM prompts for each subtask.
+ Example:
+ {
+ "steps": [
+ {
+ "step": "1",
+ "description": "This is the first step",
+ "subtasks": [
+ {
+ "subtask": "Subtask 1",
+ "description": "This is the first subtask",
+ "prompt": "Write the code to do the first subtask"
+ },
+ {
+ "subtask": "Subtask 2",
+ "description": "This is the second subtask",
+ "prompt": "Write the code to do the second subtask"
+ }
+ ]
+ }
+ ]
+ }
+ Do not output any other text.
+ Do not wrap the JSON in any other text, output the JSON format described above, making sure it's a valid JSON.
+ Input: {{input}}
+ {{guidelines}}
+ """;
+ var result = await chatClient.GetResponseAsync(prompt);
+ return result.Result;
+ }
+ catch (Exception ex)
+ {
+ logger.LogError(ex, "Error creating development plan");
+ return null;
+ }
+ }
+}
+
+public interface ILeadDevelopers
+{
+ public Task CreatePlan(string ask);
+}
+
+[GenerateSerializer]
+public class DevLeadPlanResponse
+{
+ [Id(0)]
+ public List steps { get; set; }
+}
+
+[GenerateSerializer]
+public class Step
+{
+ [Id(0)]
+ public string description { get; set; }
+ [Id(1)]
+ public string step { get; set; }
+ [Id(2)]
+ public List subtasks { get; set; }
+}
+
+[GenerateSerializer]
+public class Subtask
+{
+ [Id(0)]
+ public string subtask { get; set; }
+ [Id(1)]
+ public string prompt { get; set; }
+}
+
+public class DeveloperLeadState
+{
+ public string Plan { get; set; }
+}
\ No newline at end of file
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead/DevLeadPrompts.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead/DevLeadPrompts.cs
deleted file mode 100644
index 2c20812a..00000000
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead/DevLeadPrompts.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-namespace Microsoft.AI.DevTeam;
-public static class DevLeadSkills {
- public static string Plan = """
- You are a Dev Lead for an application team, building the application described below.
- Please break down the steps and modules required to develop the complete application, describe each step in detail.
- Make prescriptive architecture, language, and frameowrk choices, do not provide a range of choices.
- For each step or module then break down the steps or subtasks required to complete that step or module.
- For each subtask write an LLM prompt that would be used to tell a model to write the coee that will accomplish that subtask. If the subtask involves taking action/running commands tell the model to write the script that will run those commands.
- In each LLM prompt restrict the model from outputting other text that is not in the form of code or code comments.
- Please output a JSON array data structure, in the precise schema shown below, with a list of steps and a description of each step, and the steps or subtasks that each requires, and the LLM prompts for each subtask.
- Example:
- {
- "steps": [
- {
- "step": "1",
- "description": "This is the first step",
- "subtasks": [
- {
- "subtask": "Subtask 1",
- "description": "This is the first subtask",
- "prompt": "Write the code to do the first subtask"
- },
- {
- "subtask": "Subtask 2",
- "description": "This is the second subtask",
- "prompt": "Write the code to do the second subtask"
- }
- ]
- }
- ]
- }
- Do not output any other text.
- Do not wrap the JSON in any other text, output the JSON format described above, making sure it's a valid JSON.
- Input: {{$input}}
- {{$waf}}
- """;
-
- public static string Explain = """
- You are a Dev Lead.
- Please explain the code that is in the input below. You can include references or documentation links in your explanation.
- Also where appropriate please output a list of keywords to describe the code or its capabilities.
- example:
- Keywords: Azure, networking, security, authentication
-
- If the code's purpose is not clear output an error:
- Error: The model could not determine the purpose of the code.
-
- --
- Input: {{$input}}
- """;
-}
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead/DeveloperLead.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead/DeveloperLead.cs
deleted file mode 100644
index bb87db69..00000000
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead/DeveloperLead.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Orleans;
-using Microsoft.AI.DevTeam.Events;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Connectors.OpenAI;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
-
-namespace Microsoft.AI.DevTeam;
-[ImplicitStreamSubscription(Consts.MainNamespace)]
-public class DeveloperLead : AiAgent, ILeadDevelopers
-{
- protected override string Namespace => Consts.MainNamespace;
- private readonly ILogger _logger;
-
- public DeveloperLead([PersistentState("state", "messages")] IPersistentState> state, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(state, memory, kernel)
- {
- _logger = logger;
- }
-
- public async override Task HandleEvent(Event item)
- {
- switch (item.Type)
- {
- case nameof(GithubFlowEventType.DevPlanRequested):
- {
- var context = item.ToGithubContext();
- var plan = await CreatePlan(item.Data["input"]);
- var data = context.ToData();
- data["result"] = plan;
- await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event
- {
- Type = nameof(GithubFlowEventType.DevPlanGenerated),
- Subject = context.Subject,
- Data = data
- });
- }
-
- break;
- case nameof(GithubFlowEventType.DevPlanChainClosed):
- {
- var context = item.ToGithubContext();
- var latestPlan = _state.State.History.Last().Message;
- var data = context.ToData();
- data["plan"] = latestPlan;
- await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event
- {
- Type = nameof(GithubFlowEventType.DevPlanCreated),
- Subject = context.Subject,
- Data = data
- });
- }
-
- break;
- default:
- break;
- }
- }
- public async Task CreatePlan(string ask)
- {
- try
- {
- // TODO: Ask the architect for the existing high level architecture
- // as well as the file structure
- var context = new KernelArguments { ["input"] = AppendChatHistory(ask) };
- var instruction = "Consider the following architectural guidelines:!waf!";
- var enhancedContext = await AddKnowledge(instruction, "waf", context);
- var settings = new OpenAIPromptExecutionSettings{
- ResponseFormat = "json_object",
- MaxTokens = 4096,
- Temperature = 0.8,
- TopP = 1
- };
- return await CallFunction(DevLeadSkills.Plan, enhancedContext, settings);
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Error creating development plan");
- return default;
- }
- }
-}
-
-public interface ILeadDevelopers
-{
- public Task CreatePlan(string ask);
-}
-
-[GenerateSerializer]
-public class DevLeadPlanResponse
-{
- [Id(0)]
- public List steps { get; set; }
-}
-
-[GenerateSerializer]
-public class Step
-{
- [Id(0)]
- public string description { get; set; }
- [Id(1)]
- public string step { get; set; }
- [Id(2)]
- public List subtasks { get; set; }
-}
-
-[GenerateSerializer]
-public class Subtask
-{
- [Id(0)]
- public string subtask { get; set; }
- [Id(1)]
- public string prompt { get; set; }
-}
-
-public class DeveloperLeadState
-{
- public string Plan { get; set; }
-}
\ No newline at end of file
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Hubber.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Hubber.cs
index 0069f212..94887fcf 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Hubber.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Hubber.cs
@@ -2,6 +2,7 @@
using System.Text.Json;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
+using Microsoft.AI.DevTeam.Agents;
using Microsoft.AI.DevTeam.Events;
namespace Microsoft.AI.DevTeam;
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager/ProductManager.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager.cs
similarity index 60%
rename from samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager/ProductManager.cs
rename to samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager.cs
index 3ffbc8a5..37bab1c3 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager/ProductManager.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager.cs
@@ -1,23 +1,14 @@
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
using Microsoft.AI.DevTeam.Events;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
+using Microsoft.Extensions.AI;
namespace Microsoft.AI.DevTeam;
[ImplicitStreamSubscription(Consts.MainNamespace)]
-public class ProductManager : AiAgent, IManageProducts
+public class ProductManager([PersistentState("state", "messages")] IPersistentState> state, IChatClient chatClient, ILogger logger) : AiAgent(state), IManageProducts
{
protected override string Namespace => Consts.MainNamespace;
- private readonly ILogger _logger;
-
- public ProductManager([PersistentState("state", "messages")] IPersistentState> state, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(state, memory, kernel)
- {
- _logger = logger;
- }
public async override Task HandleEvent(Event item)
{
@@ -60,14 +51,24 @@ public async Task CreateReadme(string ask)
{
try
{
- var context = new KernelArguments { ["input"] = AppendChatHistory(ask)};
+ var input = AppendChatHistory(ask);
var instruction = "Consider the following architectural guidelines:!waf!";
- var enhancedContext = await AddKnowledge(instruction, "waf",context);
- return await CallFunction(PMSkills.Readme, enhancedContext);
+ var guidelines = "";// await AddKnowledge(instruction, "waf");
+ var prompt = $$$""""
+ """
+ You are a program manager on a software development team. You are working on an app described below.
+ Based on the input below, and any dialog or other context, please output a raw README.MD markdown file documenting the main features of the app and the architecture or code organization.
+ Do not describe how to create the application.
+ Write the README as if it were documenting the features and architecture of the application. You may include instructions for how to run the application.
+ Input: {{input}}
+ {{guidelines}}
+ """";
+ var result = await chatClient.GetResponseAsync(prompt);
+ return result.Message.Text!;
}
catch (Exception ex)
{
- _logger.LogError(ex, "Error creating readme");
+ logger.LogError(ex, "Error creating readme");
return default;
}
}
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager/PMPrompts.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager/PMPrompts.cs
deleted file mode 100644
index 7683010e..00000000
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/ProductManager/PMPrompts.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-namespace Microsoft.AI.DevTeam;
-public static class PMSkills
-{
-public static string BootstrapProject = """
- Please write a bash script with the commands that would be required to generate applications as described in the following input.
- You may add comments to the script and the generated output but do not add any other text except the bash script.
- You may include commands to build the applications but do not run them.
- Do not include any git commands.
- Input: {{$input}}
- {{$waf}}
- """;
- public static string Readme = """
- You are a program manager on a software development team. You are working on an app described below.
- Based on the input below, and any dialog or other context, please output a raw README.MD markdown file documenting the main features of the app and the architecture or code organization.
- Do not describe how to create the application.
- Write the README as if it were documenting the features and architecture of the application. You may include instructions for how to run the application.
- Input: {{$input}}
- {{$waf}}
- """;
-
- public static string Explain = """
- You are a Product Manager.
- Please explain the code that is in the input below. You can include references or documentation links in your explanation.
- Also where appropriate please output a list of keywords to describe the code or its capabilities.
- example:
- Keywords: Azure, networking, security, authentication
-
- If the code's purpose is not clear output an error:
- Error: The model could not determine the purpose of the code.
-
- --
- Input: {{$input}}
- """;
-}
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Microsoft.AI.DevTeam.csproj b/samples/gh-flow/src/Microsoft.AI.DevTeam/Microsoft.AI.DevTeam.csproj
index 542b6246..53c042e0 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Microsoft.AI.DevTeam.csproj
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam/Microsoft.AI.DevTeam.csproj
@@ -13,34 +13,23 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/samples/gh-flow/src/Microsoft.AI.DevTeam/Program.cs b/samples/gh-flow/src/Microsoft.AI.DevTeam/Program.cs
index 03c77b5d..c6917712 100644
--- a/samples/gh-flow/src/Microsoft.AI.DevTeam/Program.cs
+++ b/samples/gh-flow/src/Microsoft.AI.DevTeam/Program.cs
@@ -1,24 +1,13 @@
using System.Text.Json;
-using Azure;
-using Azure.AI.OpenAI;
using Microsoft.AI.DevTeam;
using Microsoft.Extensions.Options;
-using Microsoft.SemanticKernel;
using Octokit.Webhooks;
using Octokit.Webhooks.AspNetCore;
using Azure.Identity;
using Microsoft.Extensions.Azure;
-using Microsoft.Extensions.Http.Resilience;
-using Microsoft.SemanticKernel.Memory;
-using Microsoft.SemanticKernel.Connectors.Qdrant;
-using Microsoft.SemanticKernel.Connectors.OpenAI;
-using Orleans.Configuration;
-using Orleans.Serialization;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton();
-builder.Services.AddTransient(CreateKernel);
-builder.Services.AddTransient(CreateMemory);
builder.Services.AddHttpClient();
@@ -87,64 +76,7 @@
builder.Host.UseOrleans(siloBuilder =>
{
siloBuilder.UseDashboard(x => x.HostSelf = true);
- if (builder.Environment.IsDevelopment())
- {
- siloBuilder.UseLocalhostClustering()
- .AddMemoryStreams("StreamProvider")
- .AddMemoryGrainStorage("PubSubStore")
- .AddMemoryGrainStorage("messages");
-
- siloBuilder.UseInMemoryReminderService();
- siloBuilder.UseDashboard(x => x.HostSelf = true);
-
- siloBuilder.UseInMemoryReminderService();
- }
- else
- {
- var cosmosDbconnectionString = builder.Configuration.GetValue("AzureOptions:CosmosConnectionString");
- siloBuilder.Configure(options =>
- {
- options.ClusterId = "ai-dev-cluster";
- options.ServiceId = "ai-dev-cluster";
- });
- siloBuilder.Configure(options =>
- {
- options.ResponseTimeout = TimeSpan.FromMinutes(3);
- options.SystemResponseTimeout = TimeSpan.FromMinutes(3);
- });
- siloBuilder.Configure(options =>
- {
- options.ResponseTimeout = TimeSpan.FromMinutes(3);
- });
- siloBuilder.UseCosmosClustering(o =>
- {
- o.ConfigureCosmosClient(cosmosDbconnectionString);
- o.ContainerName = "devteam";
- o.DatabaseName = "clustering";
- o.IsResourceCreationEnabled = true;
- });
-
- siloBuilder.UseCosmosReminderService(o =>
- {
- o.ConfigureCosmosClient(cosmosDbconnectionString);
- o.ContainerName = "devteam";
- o.DatabaseName = "reminders";
- o.IsResourceCreationEnabled = true;
- });
- siloBuilder.AddCosmosGrainStorage(
- name: "messages",
- configureOptions: o =>
- {
- o.ConfigureCosmosClient(cosmosDbconnectionString);
- o.ContainerName = "devteam";
- o.DatabaseName = "persistence";
- o.IsResourceCreationEnabled = true;
- });
- //TODO: replace with EventHub
- siloBuilder
- .AddMemoryStreams("StreamProvider")
- .AddMemoryGrainStorage("PubSubStore");
- }
+
});
builder.Services.Configure(options =>
@@ -162,44 +94,4 @@
app.Map("/dashboard", x => x.UseOrleansDashboard());
-app.Run();
-
-static ISemanticTextMemory CreateMemory(IServiceProvider provider)
-{
- var openAiConfig = provider.GetService>().Value;
- var qdrantConfig = provider.GetService>().Value;
-
- var loggerFactory = LoggerFactory.Create(builder =>
- {
- builder
- .SetMinimumLevel(LogLevel.Debug)
- .AddConsole()
- .AddDebug();
- });
-
- var memoryBuilder = new MemoryBuilder();
- return memoryBuilder.WithLoggerFactory(loggerFactory)
- .WithQdrantMemoryStore(qdrantConfig.Endpoint, qdrantConfig.VectorSize)
- .WithAzureOpenAITextEmbeddingGeneration(openAiConfig.EmbeddingDeploymentOrModelId, openAiConfig.Endpoint, openAiConfig.ApiKey)
- .Build();
-}
-
-static Kernel CreateKernel(IServiceProvider provider)
-{
- var openAiConfig = provider.GetService>().Value;
- var clientOptions = new OpenAIClientOptions();
- clientOptions.Retry.NetworkTimeout = TimeSpan.FromMinutes(5);
- var openAIClient = new OpenAIClient(new Uri(openAiConfig.Endpoint), new AzureKeyCredential(openAiConfig.ApiKey), clientOptions);
- var builder = Kernel.CreateBuilder();
- builder.Services.AddLogging(c => c.AddConsole().AddDebug().SetMinimumLevel(LogLevel.Debug));
- builder.Services.AddAzureOpenAIChatCompletion(openAiConfig.DeploymentOrModelId, openAIClient);
- builder.Services.ConfigureHttpClientDefaults(c =>
- {
- c.AddStandardResilienceHandler().Configure(o =>
- {
- o.Retry.MaxRetryAttempts = 5;
- o.Retry.BackoffType = Polly.DelayBackoffType.Exponential;
- });
- });
- return builder.Build();
-}
\ No newline at end of file
+app.Run();
\ No newline at end of file
diff --git a/samples/gh-flow/src/seed-memory/Program.cs b/samples/gh-flow/src/seed-memory/Program.cs
index af9fc428..8934f981 100644
--- a/samples/gh-flow/src/seed-memory/Program.cs
+++ b/samples/gh-flow/src/seed-memory/Program.cs
@@ -24,7 +24,7 @@ static async Task Main(string[] args)
var memoryBuilder = new MemoryBuilder();
var memory = memoryBuilder.WithLoggerFactory(loggerFactory)
.WithQdrantMemoryStore(kernelSettings.QdrantEndpoint, 1536)
- .WithAzureOpenAITextEmbeddingGeneration(kernelSettings.EmbeddingDeploymentOrModelId,kernelSettings.Endpoint, kernelSettings.ApiKey)
+ //.WithAzureOpenAITextEmbeddingGeneration(kernelSettings.EmbeddingDeploymentOrModelId,kernelSettings.Endpoint, kernelSettings.ApiKey)
.Build();
await ImportDocumentAsync(memory, WafFileName);
diff --git a/samples/gh-flow/src/seed-memory/seed-memory.csproj b/samples/gh-flow/src/seed-memory/seed-memory.csproj
index ec8d3327..ac299119 100644
--- a/samples/gh-flow/src/seed-memory/seed-memory.csproj
+++ b/samples/gh-flow/src/seed-memory/seed-memory.csproj
@@ -10,16 +10,16 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/marketing/src/backend/Agents/Auditor/Auditor.cs b/samples/marketing/src/backend/Agents/Auditor/Auditor.cs
index 98ce95f6..be51bd7b 100644
--- a/samples/marketing/src/backend/Agents/Auditor/Auditor.cs
+++ b/samples/marketing/src/backend/Agents/Auditor/Auditor.cs
@@ -1,45 +1,45 @@
-using Marketing.Controller;
using Marketing.Events;
using Marketing.Options;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
+using Microsoft.Extensions.AI;
namespace Marketing.Agents;
[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class Auditor : AiAgent
+public class Auditor([PersistentState("state", "messages")] IPersistentState> state, IChatClient chatClient, ILogger logger) : AiAgent(state)
{
protected override string Namespace => Consts.OrleansNamespace;
- private readonly ILogger _logger;
-
- public Auditor([PersistentState("state", "messages")] IPersistentState> state, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(state, memory, kernel)
- {
- _logger = logger;
- }
-
public async override Task HandleEvent(Event item)
{
switch (item.Type)
{
case nameof(EventTypes.AuditText):
- {
- string text = item.Data["text"];
- _logger.LogInformation($"[{nameof(Auditor)}] Event {nameof(EventTypes.AuditText)}. Text: {text}");
-
- var context = new KernelArguments { ["input"] = AppendChatHistory(text) };
- string auditorAnswer = await CallFunction(AuditorPrompts.AuditText, context);
- if (auditorAnswer.Contains("NOTFORME"))
{
- return;
+ string text = item.Data["text"];
+ logger.LogInformation($"[{nameof(Auditor)}] Event {nameof(EventTypes.AuditText)}. Text: {text}");
+
+ var input = AppendChatHistory(text);
+ var prompt = $"""
+ You are an Auditor in a Marketing team
+ Audit the text bello and make sure we do not give discounts larger than 10%
+ If the text talks about a larger than 10% discount, reply with a message to the user saying that the discount is too large, and by company policy we are not allowed.
+ If the message says who wrote it, add that information in the response as well
+ In any other case, reply with NOTFORME
+ ---
+ Input: {input}
+ ---
+ """;
+ var result = await chatClient.GetResponseAsync(prompt);
+ var auditorAnswer = result.Message.Text!;
+ if (auditorAnswer.Contains("NOTFORME"))
+ {
+ return;
+ }
+ await SendAuditorAlertEvent(auditorAnswer, item.Data["UserId"]);
+ break;
}
- await SendAuditorAlertEvent(auditorAnswer, item.Data["UserId"]);
- break;
- }
default:
break;
}
diff --git a/samples/marketing/src/backend/Agents/Auditor/AuditorPrompts.cs b/samples/marketing/src/backend/Agents/Auditor/AuditorPrompts.cs
deleted file mode 100644
index 821fd558..00000000
--- a/samples/marketing/src/backend/Agents/Auditor/AuditorPrompts.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace Marketing.Agents;
-
-public static class AuditorPrompts
-{
- public static string AuditText = """
- You are an Auditor in a Marketing team
- Audit the text bello and make sure we do not give discounts larger than 10%
- If the text talks about a larger than 10% discount, reply with a message to the user saying that the discount is too large, and by company policy we are not allowed.
- If the message says who wrote it, add that information in the response as well
- In any other case, reply with NOTFORME
- ---
- Input: {{$input}}
- ---
- """;
-}
\ No newline at end of file
diff --git a/samples/marketing/src/backend/Agents/CommunityManager/CommunityManager.cs b/samples/marketing/src/backend/Agents/CommunityManager/CommunityManager.cs
index 152f2503..fbdc03e6 100644
--- a/samples/marketing/src/backend/Agents/CommunityManager/CommunityManager.cs
+++ b/samples/marketing/src/backend/Agents/CommunityManager/CommunityManager.cs
@@ -1,27 +1,16 @@
-using Marketing.Controller;
using Marketing.Events;
using Marketing.Options;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
+using Microsoft.Extensions.AI;
namespace Marketing.Agents;
[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class CommunityManager : AiAgent
+public class CommunityManager([PersistentState("state", "messages")] IPersistentState> state, IChatClient chatClient, ILogger logger) : AiAgent(state)
{
protected override string Namespace => Consts.OrleansNamespace;
- private readonly ILogger _logger;
-
- public CommunityManager([PersistentState("state", "messages")] IPersistentState> state, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(state, memory, kernel)
- {
- _logger = logger;
- }
-
public async override Task HandleEvent(Event item)
{
switch (item.Type)
@@ -51,7 +40,7 @@ public async override Task HandleEvent(Event item)
article = _state.State.Data.Article;
}
else
- {
+ {
// No article yet
return;
}
@@ -60,10 +49,22 @@ public async override Task HandleEvent(Event item)
{
article += "| USER REQUEST: " + item.Data["userMessage"];
}
- _logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.ArticleCreated)}. Article: {article}");
+ logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.ArticleCreated)}. Article: {article}");
- var context = new KernelArguments { ["input"] = AppendChatHistory(article) };
- string socialMediaPost = await CallFunction(CommunityManagerPrompts.WritePost, context);
+ var input = AppendChatHistory(article);
+ var prompt = $"""
+ You are a Marketing community manager writer.
+ If the request from the user is to write a post to promote a new product, or if it is specifically talking to you (community manager)
+ then you should write a post based on the user request
+ Your writings are going to be posted on Tweeter. So be informal, friendly and add some hashtags and emojis.
+ Remember, the tweet cannot be longer than 280 characters.
+ If the request was not intedend for you. reply with "
+ ---
+ Input: {input}
+ ---
+ """;
+ var result = await chatClient.GetResponseAsync(prompt);
+ var socialMediaPost = result.Message.Text!;
if (socialMediaPost.Contains("NOTFORME"))
{
return;
diff --git a/samples/marketing/src/backend/Agents/CommunityManager/CommunityManagerPrompts.cs b/samples/marketing/src/backend/Agents/CommunityManager/CommunityManagerPrompts.cs
deleted file mode 100644
index ada868d6..00000000
--- a/samples/marketing/src/backend/Agents/CommunityManager/CommunityManagerPrompts.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace Marketing.Agents;
-
-public static class CommunityManagerPrompts
-{
- public static string WritePost = """
- You are a Marketing community manager writer.
- If the request from the user is to write a post to promote a new product, or if it is specifically talking to you (community manager)
- then you should write a post based on the user request
- Your writings are going to be posted on Tweeter. So be informal, friendly and add some hashtags and emojis.
- Remember, the tweet cannot be longer than 280 characters.
- If the request was not intedend for you. reply with "
- ---
- Input: {{$input}}
- ---
- """;
-}
\ No newline at end of file
diff --git a/samples/marketing/src/backend/Agents/GraphicDesigner/GraphicDesigner.cs b/samples/marketing/src/backend/Agents/GraphicDesigner/GraphicDesigner.cs
index f72f7449..e1511807 100644
--- a/samples/marketing/src/backend/Agents/GraphicDesigner/GraphicDesigner.cs
+++ b/samples/marketing/src/backend/Agents/GraphicDesigner/GraphicDesigner.cs
@@ -2,28 +2,17 @@
using Marketing.Options;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Microsoft.SemanticKernel.TextToImage;
-using Orleans.Runtime;
+using Microsoft.Extensions.AI;
+using OpenAI;
+using OpenAI.Images;
namespace Marketing.Agents;
[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class GraphicDesigner : AiAgent
+public class GraphicDesigner([PersistentState("state", "messages")] IPersistentState> state, OpenAIClient openAiClient, ILogger logger, IConfiguration configuration) : AiAgent(state)
{
protected override string Namespace => Consts.OrleansNamespace;
- private readonly ILogger _logger;
- private readonly IConfiguration _configuration;
-
- public GraphicDesigner([PersistentState("state", "messages")] IPersistentState> state, Kernel kernel, ISemanticTextMemory memory, ILogger logger, IConfiguration configuration)
- : base(state, memory, kernel)
- {
- _logger = logger;
- _configuration = configuration;
- }
-
public async override Task HandleEvent(Event item)
{
string lastMessage;
@@ -49,10 +38,13 @@ public async override Task HandleEvent(Event item)
return;
}
- _logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.ArticleCreated)}.");
+ logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.ArticleCreated)}.");
var article = item.Data["article"];
- var dallEService = _kernel.GetRequiredService();
- var imageUri = await dallEService.GenerateImageAsync(article, 1024, 1024);
+
+ var imageClient = openAiClient.GetImageClient("dall-e");
+ var result = imageClient.GenerateImageAsync(article, new ImageGenerationOptions { Size = OpenAI.Images.GeneratedImageSize.W1024xH1024});
+
+ var imageUri = ""; // TODO: Reimplement using OpenAI directly await dallEService.GenerateImageAsync(article, 1024, 1024);
_state.State.Data.imageUrl = imageUri;
diff --git a/samples/marketing/src/backend/Agents/SignalR/SignalR.cs b/samples/marketing/src/backend/Agents/SignalR/SignalR.cs
index 9afa6fa6..f0366a0e 100644
--- a/samples/marketing/src/backend/Agents/SignalR/SignalR.cs
+++ b/samples/marketing/src/backend/Agents/SignalR/SignalR.cs
@@ -3,8 +3,6 @@
using Marketing.SignalRHub;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
-using System;
-using System.Security.Policy;
namespace Marketing.Agents;
diff --git a/samples/marketing/src/backend/Agents/Writer/Writer.cs b/samples/marketing/src/backend/Agents/Writer/Writer.cs
index 904d248a..42750012 100644
--- a/samples/marketing/src/backend/Agents/Writer/Writer.cs
+++ b/samples/marketing/src/backend/Agents/Writer/Writer.cs
@@ -2,30 +2,17 @@
using Marketing.Options;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
+using Microsoft.Extensions.AI;
namespace Marketing.Agents;
[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class Writer : AiAgent, IWriter
+public class Writer([PersistentState("state", "messages")] IPersistentState> state, IChatClient chatClient, ILogger logger) : AiAgent(state), IWriter
{
protected override string Namespace => Consts.OrleansNamespace;
- private readonly ILogger _logger;
-
- public Writer([PersistentState("state", "messages")] IPersistentState> state, Kernel kernel, ISemanticTextMemory memory, ILogger logger)
- : base(state, memory, kernel)
- {
- _logger = logger;
- }
-
public async override Task HandleEvent(Event item)
{
- KernelArguments context;
- string newArticle;
-
switch (item.Type)
{
case nameof(EventTypes.UserConnected):
@@ -41,33 +28,56 @@ public async override Task HandleEvent(Event item)
break;
case nameof(EventTypes.UserChatInput):
- var userMessage = item.Data["userMessage"];
- _logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.UserChatInput)}. UserMessage: {userMessage}");
-
- context = new KernelArguments { ["input"] = AppendChatHistory(userMessage) };
- newArticle = await CallFunction(WriterPrompts.Write, context);
-
- if (newArticle.Contains("NOTFORME"))
{
- return;
+ var userMessage = item.Data["userMessage"];
+ logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.UserChatInput)}. UserMessage: {userMessage}");
+
+ var input = AppendChatHistory(userMessage);
+ var prompt = $"""
+ This is a multi agent app. You are a Marketing Campaign writer Agent.
+ If the request is not for you, answer with .
+ If the request is about writing or modifying an existing campaing, then you should write a campain based on the user request.
+ Write up to three paragraphs to promote the product the user is asking for.
+ Bellow are a series of inputs from the user that you can use.
+ If the input talks about twitter or images, dismiss it and return
+ Input: {input}
+ """;
+ var result = await chatClient.GetResponseAsync(prompt);
+ var newArticle = result.Message.Text!;
+
+ if (newArticle.Contains("NOTFORME"))
+ {
+ return;
+ }
+ await SendArticleCreatedEvent(newArticle, item.Data["UserId"]);
+ break;
}
- await SendArticleCreatedEvent(newArticle, item.Data["UserId"]);
- break;
-
case nameof(EventTypes.AuditorAlert):
- var auditorAlertMessage = item.Data["auditorAlertMessage"];
- _logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.AuditorAlert)}. auditorAlertMessage: {auditorAlertMessage}");
-
- context = new KernelArguments { ["input"] = AppendChatHistory(auditorAlertMessage) };
- newArticle = await CallFunction(WriterPrompts.Adjust, context);
-
- if (newArticle.Contains("NOTFORME"))
{
- return;
+ var auditorAlertMessage = item.Data["auditorAlertMessage"];
+ logger.LogInformation($"[{nameof(GraphicDesigner)}] Event {nameof(EventTypes.AuditorAlert)}. auditorAlertMessage: {auditorAlertMessage}");
+
+ var input = AppendChatHistory(auditorAlertMessage);
+ var prompt = $"""
+ This is a multi agent app. You are a Marketing Campaign writer Agent.
+ If the request is not for you, answer with .
+ If the request is about writing or modifying an existing campaing, then you should write a campain based on the user request.
+ The campaign is not compliant with the company policy, and you need to adjust it. This is the message from the automatic auditor agent regarding what is wrong with the original campaing
+ ---
+ Input: {input}
+ ---
+ Return only the new campaign text but adjusted to the auditor request
+ """;
+ var result = await chatClient.GetResponseAsync(prompt);
+ var newArticle = result.Message.Text!;
+
+ if (newArticle.Contains("NOTFORME"))
+ {
+ return;
+ }
+ await SendArticleCreatedEvent(newArticle, item.Data["UserId"]);
+ break;
}
- await SendArticleCreatedEvent(newArticle, item.Data["UserId"]);
- break;
-
default:
break;
}
diff --git a/samples/marketing/src/backend/Agents/Writer/WriterPrompts.cs b/samples/marketing/src/backend/Agents/Writer/WriterPrompts.cs
deleted file mode 100644
index 8fd3553e..00000000
--- a/samples/marketing/src/backend/Agents/Writer/WriterPrompts.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-
-namespace Marketing.Agents;
-public static class WriterPrompts
-{
- public static string Write = """
- This is a multi agent app. You are a Marketing Campaign writer Agent.
- If the request is not for you, answer with .
- If the request is about writing or modifying an existing campaing, then you should write a campain based on the user request.
- Write up to three paragraphs to promote the product the user is asking for.
- Bellow are a series of inputs from the user that you can use.
- If the input talks about twitter or images, dismiss it and return
- Input: {{$input}}
- """;
-
- public static string Adjust = """
- This is a multi agent app. You are a Marketing Campaign writer Agent.
- If the request is not for you, answer with .
- If the request is about writing or modifying an existing campaing, then you should write a campain based on the user request.
- The campaign is not compliant with the company policy, and you need to adjust it. This is the message from the automatic auditor agent regarding what is wrong with the original campaing
- ---
- Input: {{$input}}
- ---
- Return only the new campaign text but adjusted to the auditor request
- """;
-}
\ No newline at end of file
diff --git a/samples/marketing/src/backend/Controller/Articles.cs b/samples/marketing/src/backend/Controller/Articles.cs
index 78cd09fc..e1c5b729 100644
--- a/samples/marketing/src/backend/Controller/Articles.cs
+++ b/samples/marketing/src/backend/Controller/Articles.cs
@@ -41,7 +41,7 @@ public async Task Get(string id)
[HttpPut("{UserId}")]
public async Task Put(string UserId, [FromBody] string userMessage)
{
- var streamProvider = _client.GetStreamProvider("StreamProvider");
+ var streamProvider = _client.GetStreamProvider(Consts.StreamProvider);
var streamId = StreamId.Create(Consts.OrleansNamespace, UserId);
var stream = streamProvider.GetStream(streamId);
diff --git a/samples/marketing/src/backend/Marketing.csproj b/samples/marketing/src/backend/Marketing.csproj
index 36c6d09e..ca4d3dbf 100644
--- a/samples/marketing/src/backend/Marketing.csproj
+++ b/samples/marketing/src/backend/Marketing.csproj
@@ -19,40 +19,43 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
diff --git a/samples/marketing/src/backend/Options/Consts.cs b/samples/marketing/src/backend/Options/Consts.cs
index 7effc35f..2c92de90 100644
--- a/samples/marketing/src/backend/Options/Consts.cs
+++ b/samples/marketing/src/backend/Options/Consts.cs
@@ -3,4 +3,6 @@
public static class Consts
{
public const string OrleansNamespace = "DevPersonas";
+
+ public static string StreamProvider = "StreamProvider";
}
diff --git a/samples/marketing/src/backend/Program.cs b/samples/marketing/src/backend/Program.cs
index 1de489f4..1fd090cf 100644
--- a/samples/marketing/src/backend/Program.cs
+++ b/samples/marketing/src/backend/Program.cs
@@ -1,20 +1,8 @@
using System.Text.Json;
-using Azure;
-using Azure.AI.OpenAI;
-using Microsoft.Extensions.Options;
-using Microsoft.SemanticKernel;
-using Microsoft.Extensions.Http.Resilience;
-using Microsoft.SemanticKernel.Memory;
-using Microsoft.SemanticKernel.Connectors.Qdrant;
-using Microsoft.SemanticKernel.Connectors.OpenAI;
using Marketing.SignalRHub;
using Marketing.Options;
-using Marketing;
-using Orleans.Serialization;
var builder = WebApplication.CreateBuilder(args);
-builder.Services.AddTransient(CreateKernel);
-builder.Services.AddTransient(CreateMemory);
builder.Services.AddHttpClient();
builder.Services.AddControllers();
builder.Services.AddApplicationInsightsTelemetry();
@@ -82,77 +70,4 @@
app.Map("/dashboard", x => x.UseOrleansDashboard());
app.MapHub("/articlehub");
-app.Run();
-
-static ISemanticTextMemory CreateMemory(IServiceProvider provider)
-{
- OpenAIOptions openAiConfig = provider.GetService>().Value;
- QdrantOptions qdrantConfig = provider.GetService>().Value;
-
- var loggerFactory = LoggerFactory.Create(builder =>
- {
- builder
- .SetMinimumLevel(LogLevel.Debug)
- .AddConsole()
- .AddDebug();
- });
-
- var memoryBuilder = new MemoryBuilder();
- return memoryBuilder.WithLoggerFactory(loggerFactory)
- .WithQdrantMemoryStore(qdrantConfig.Endpoint, qdrantConfig.VectorSize)
- .WithAzureOpenAITextEmbeddingGeneration(openAiConfig.EmbeddingsDeploymentOrModelId, openAiConfig.EmbeddingsEndpoint, openAiConfig.EmbeddingsApiKey)
- .Build();
-}
-
-static Kernel CreateKernel(IServiceProvider provider)
-{
- OpenAIOptions openAiConfig = provider.GetService>().Value;
- var clientOptions = new OpenAIClientOptions();
- clientOptions.Retry.NetworkTimeout = TimeSpan.FromMinutes(5);
- var builder = Kernel.CreateBuilder();
- builder.Services.AddLogging(c => c.AddConsole().AddDebug().SetMinimumLevel(LogLevel.Debug));
-
- // Chat
- var openAIClient = new OpenAIClient(new Uri(openAiConfig.ChatEndpoint), new AzureKeyCredential(openAiConfig.ChatApiKey), clientOptions);
- if (openAiConfig.ChatEndpoint.Contains(".azure", StringComparison.OrdinalIgnoreCase))
- {
- builder.Services.AddAzureOpenAIChatCompletion(openAiConfig.ChatDeploymentOrModelId, openAIClient);
- }
- else
- {
- builder.Services.AddOpenAIChatCompletion(openAiConfig.ChatDeploymentOrModelId, openAIClient);
- }
-
- // Text to Image
- openAIClient = new OpenAIClient(new Uri(openAiConfig.ImageEndpoint), new AzureKeyCredential(openAiConfig.ImageApiKey), clientOptions);
- if (openAiConfig.ImageEndpoint.Contains(".azure", StringComparison.OrdinalIgnoreCase))
- {
- Throw.IfNullOrEmpty(nameof(openAiConfig.ImageDeploymentOrModelId), openAiConfig.ImageDeploymentOrModelId);
- builder.Services.AddAzureOpenAITextToImage(openAiConfig.ImageDeploymentOrModelId, openAIClient);
- }
- else
- {
- builder.Services.AddOpenAITextToImage(openAiConfig.ImageApiKey);
- }
-
- // Embeddings
- openAIClient = new OpenAIClient(new Uri(openAiConfig.EmbeddingsEndpoint), new AzureKeyCredential(openAiConfig.EmbeddingsApiKey), clientOptions);
- if (openAiConfig.EmbeddingsEndpoint.Contains(".azure", StringComparison.OrdinalIgnoreCase))
- {
- builder.Services.AddAzureOpenAITextEmbeddingGeneration(openAiConfig.EmbeddingsDeploymentOrModelId, openAIClient);
- }
- else
- {
- builder.Services.AddOpenAITextEmbeddingGeneration(openAiConfig.EmbeddingsDeploymentOrModelId, openAIClient);
- }
-
- builder.Services.ConfigureHttpClientDefaults(c =>
- {
- c.AddStandardResilienceHandler().Configure(o =>
- {
- o.Retry.MaxRetryAttempts = 5;
- o.Retry.BackoffType = Polly.DelayBackoffType.Exponential;
- });
- });
- return builder.Build();
-}
\ No newline at end of file
+app.Run();
\ No newline at end of file
diff --git a/samples/marketing/src/backend/SignalRHub/ArticleHub.cs b/samples/marketing/src/backend/SignalRHub/ArticleHub.cs
index f60876a2..78c9732b 100644
--- a/samples/marketing/src/backend/SignalRHub/ArticleHub.cs
+++ b/samples/marketing/src/backend/SignalRHub/ArticleHub.cs
@@ -28,7 +28,7 @@ public override async Task OnDisconnectedAsync(Exception exception)
///
public async Task ProcessMessage(FrontEndMessage frontEndMessage, IClusterClient clusterClient)
{
- var streamProvider = clusterClient.GetStreamProvider("StreamProvider");
+ var streamProvider = clusterClient.GetStreamProvider(Consts.StreamProvider);
var streamId = StreamId.Create(Consts.OrleansNamespace, frontEndMessage.UserId);
var stream = streamProvider.GetStream(streamId);
@@ -58,7 +58,7 @@ public async Task ConnectToAgent(string UserId, IClusterClient clusterClient)
SignalRConnectionsDB.ConnectionIdByUser.AddOrUpdate(UserId, Context.ConnectionId, (key, oldValue) => Context.ConnectionId);
// Notify the agents that a new user got connected.
- var streamProvider = clusterClient.GetStreamProvider("StreamProvider");
+ var streamProvider = clusterClient.GetStreamProvider(Consts.StreamProvider);
var streamId = StreamId.Create(Consts.OrleansNamespace, frontEndMessage.UserId);
var stream = streamProvider.GetStream(streamId);
var data = new Dictionary
diff --git a/samples/support-center/.gitignore b/samples/support-center/.gitignore
new file mode 100644
index 00000000..8e843802
--- /dev/null
+++ b/samples/support-center/.gitignore
@@ -0,0 +1 @@
+.azure
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/Conversation/Conversation.cs b/samples/support-center/SupportCenter.ApiService/Agents/Conversation/Conversation.cs
new file mode 100644
index 00000000..ab69e976
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/Conversation/Conversation.cs
@@ -0,0 +1,68 @@
+using Microsoft.AI.Agents.Abstractions;
+using Microsoft.AI.Agents.Orleans;
+using Microsoft.Extensions.AI;
+using SupportCenter.ApiService.Events;
+using SupportCenter.ApiService.Extensions;
+using SupportCenter.ApiService.SignalRHub;
+using static SupportCenter.ApiService.Consts;
+
+namespace SupportCenter.ApiService.Agents.Conversation;
+[ImplicitStreamSubscription(OrleansNamespace)]
+public class Conversation([PersistentState("state", "messages")] IPersistentState> state,
+ ILogger logger, [FromKeyedServices(Gpt4oMini)] IChatClient chatClient) : AiAgent(state)
+{
+ protected override string Namespace => OrleansNamespace;
+ protected override string StreamProvider => OrleansStreamProvider;
+
+ public async override Task HandleEvent(Event item)
+ {
+ switch (item.Type)
+ {
+ case nameof(EventType.UserConnected):
+ // The user reconnected, let's send the last message if we have one
+ string? lastMessage = _state.State.History.LastOrDefault()?.Message;
+ if (lastMessage == null)
+ {
+ return;
+ }
+ break;
+ case nameof(EventType.ConversationRequested):
+ string? userId = item.Data.GetValueOrDefault("userId");
+ string? message = item.Data.GetValueOrDefault("message");
+ string? input = AppendChatHistory(message);
+
+ var registry = GrainFactory.GetGrain(userId);
+ var connection = await registry.GetConnection();
+ string id = $"{userId}/{connection.ConversationId}";
+ logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(Conversation), nameof(EventType.ConversationRequested), message);
+
+
+
+ var prompt = $""""
+ """
+ You are a helpful customer support/service agent at Contoso Electronics. Be polite, friendly and professional and answer briefly.
+ Answer with a plain string ONLY, without any extra words or characters like '.
+ Input: {input}
+ """";
+ var result = await chatClient.GetResponseAsync(prompt);
+ var answer = result.Message.Text!;
+ await SendAnswerEvent(id, userId, answer);
+ break;
+ default:
+ break;
+ }
+ }
+
+ private async Task SendAnswerEvent(string id, string userId, string message)
+ {
+ await PublishEvent(Consts.OrleansNamespace, id, new Event
+ {
+ Type = nameof(EventType.ConversationRetrieved),
+ Data = new Dictionary {
+ { nameof(id), id },
+ { nameof(userId), userId },
+ { nameof(message), message }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/Conversation/ConversationState.cs b/samples/support-center/SupportCenter.ApiService/Agents/Conversation/ConversationState.cs
new file mode 100644
index 00000000..cb73f1f8
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/Conversation/ConversationState.cs
@@ -0,0 +1,6 @@
+namespace SupportCenter.ApiService.Agents.Conversation;
+
+public class ConversationState
+{
+}
+
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfo.cs b/samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfo.cs
new file mode 100644
index 00000000..cc8d6c5d
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfo.cs
@@ -0,0 +1,142 @@
+using Microsoft.AI.Agents.Abstractions;
+using Microsoft.AI.Agents.Orleans;
+using Microsoft.Extensions.AI;
+using SupportCenter.ApiService.Data;
+using SupportCenter.ApiService.Events;
+using SupportCenter.ApiService.Extensions;
+using SupportCenter.ApiService.SignalRHub;
+using System.ComponentModel;
+using static SupportCenter.ApiService.Consts;
+
+namespace SupportCenter.ApiService.Agents.CustomerInfo;
+
+[ImplicitStreamSubscription(OrleansNamespace)]
+public class CustomerInfo(
+ [PersistentState("state", "messages")] IPersistentState> state,
+ ILogger logger,
+ IServiceProvider serviceProvider,
+ ICustomerRepository customerRepository,
+ [FromKeyedServices(Gpt4oMini)] IChatClient chatClient) : AiAgent(state)
+{
+ protected override string Namespace => OrleansNamespace;
+ protected override string StreamProvider => OrleansStreamProvider;
+
+ public async override Task HandleEvent(Event item)
+ {
+ switch (item.Type)
+ {
+ case nameof(EventType.UserNewConversation):
+ // The user started a new conversation.
+ _state.State.History.Clear();
+ break;
+ case nameof(EventType.CustomerInfoRequested):
+ {
+ var registry = GrainFactory.GetGrain(item.Data.GetValueOrDefault("userId"));
+ var connection = await registry.GetConnection();
+ var ssc = item.GetAgentData(connection.ConversationId);
+ string? userId = ssc.UserId;
+ string? message = ssc.UserMessage;
+ string? id = ssc.Id;
+
+ logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(CustomerInfo), item.Type, item.Data);
+ await PublishEvent(Namespace, id, new Event
+ {
+ Type = nameof(EventType.CustomerInfoNotification),
+ Data = new Dictionary
+ {
+ { nameof(userId), userId },
+ { nameof(message), "I'm working on the user's request..." }
+ }
+ });
+
+ // Get the customer info via the planners.
+ var prompt = $"""
+ Here is the user message:
+ userId: {userId}
+ userMessage: {message}
+
+ Here is the history of all messages (including the last one):
+ {AppendChatHistory(message)}
+ """;
+
+
+ var chatOptions = new ChatOptions
+ {
+ Tools = [AIFunctionFactory.Create(GetCustomerDataAsync),
+ AIFunctionFactory.Create(GetAllCustomersAsync),
+ AIFunctionFactory.Create(InsertCustomerDataAsync),
+ AIFunctionFactory.Create(UpdateCustomerDataAsync)
+ ]
+ };
+
+ List chatHistory = [new(ChatRole.System, """
+ You are a Customer Info agent, working with the Support Center.
+ You can help customers working with their own information.
+ Read the customer's message carefully, and then decide the appropriate plan to create.
+ A history of the conversation is available to help you building a correct plan.
+ If you don't know how to proceed, don't guess; instead ask for more information and use it as a final answer.
+ If you think that the message is not clear, you can ask the customer for more information.
+ """)];
+
+ chatHistory.Add(new Microsoft.Extensions.AI.ChatMessage(ChatRole.User, prompt));
+
+ var response = await chatClient.GetResponseAsync(chatHistory, chatOptions);
+ var result = response.Message.Contents.Last();
+ AddToHistory($"{result}", ChatUserType.Agent);
+
+ logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(CustomerInfo), item.Type, result);
+
+ await PublishEvent(Namespace, id, new Event
+ {
+ Type = nameof(EventType.CustomerInfoRetrieved),
+ Data = new Dictionary
+ {
+ { nameof(userId), userId },
+ { nameof(message), $"{result}" }
+ }
+ });
+
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ [Description("Get customer data")]
+ public async Task GetCustomerDataAsync(
+ [Description("The customer id")] string customerId)
+ {
+ logger.LogInformation("Executing {FunctionName} function. Params: {parameters}", nameof(GetCustomerDataAsync), string.Join(", ", [customerId]));
+ var customer = await customerRepository.GetCustomerByIdAsync(customerId);
+ if (customer == null)
+ {
+ logger.LogWarning("Customer with id {customerId} not found", customerId);
+ }
+ return customer ?? new Customer();
+ }
+
+ [Description("Get all customers")]
+ public async Task> GetAllCustomersAsync()
+ {
+ logger.LogInformation("Executing {FunctionName} function", nameof(GetAllCustomersAsync));
+ return await customerRepository.GetCustomersAsync();
+ }
+
+ [Description("Insert customer data")]
+ public async Task InsertCustomerDataAsync(
+ [Description("The customer data")] Customer customer)
+ {
+ logger.LogInformation("Executing {FunctionName} function. Params: {parameters}", nameof(InsertCustomerDataAsync), customer.ToStringCustom());
+ await customerRepository.InsertCustomerAsync(customer);
+ }
+
+ [Description("Update customer data")]
+ public async Task UpdateCustomerDataAsync(
+ [Description("The customer data")] Customer customer)
+ {
+ logger.LogInformation("Executing {FunctionName} function. Params: {parameters}", nameof(UpdateCustomerDataAsync), customer.ToStringCustom());
+ await customerRepository.UpdateCustomerAsync(customer);
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfoPrompts.cs b/samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfoPrompts.cs
similarity index 93%
rename from samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfoPrompts.cs
rename to samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfoPrompts.cs
index 2f25b941..69d96854 100644
--- a/samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfoPrompts.cs
+++ b/samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfoPrompts.cs
@@ -1,4 +1,4 @@
-namespace SupportCenter.Agents;
+namespace SupportCenter.ApiService.Agents.CustomerInfo;
public class CustomerInfoPrompts
{
diff --git a/samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfoState.cs b/samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfoState.cs
similarity index 83%
rename from samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfoState.cs
rename to samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfoState.cs
index 5396121c..fbde344d 100644
--- a/samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfoState.cs
+++ b/samples/support-center/SupportCenter.ApiService/Agents/CustomerInfo/CustomerInfoState.cs
@@ -1,4 +1,4 @@
-namespace SupportCenter.Agents;
+namespace SupportCenter.ApiService.Agents.CustomerInfo;
public class CustomerInfoState
{
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/Discount/Discount.cs b/samples/support-center/SupportCenter.ApiService/Agents/Discount/Discount.cs
new file mode 100644
index 00000000..e0f93f97
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/Discount/Discount.cs
@@ -0,0 +1,32 @@
+using Microsoft.AI.Agents.Abstractions;
+using Microsoft.AI.Agents.Orleans;
+using Microsoft.Extensions.AI;
+using SupportCenter.ApiService.Events;
+using static SupportCenter.ApiService.Consts;
+
+namespace SupportCenter.ApiService.Agents.Discount;
+
+[ImplicitStreamSubscription(OrleansNamespace)]
+public class Discount([PersistentState("state", "messages")] IPersistentState> state,
+ ILogger logger, [FromKeyedServices(Gpt4oMini)] IChatClient chatClient) : AiAgent(state)
+{
+ protected override string Namespace => OrleansNamespace;
+ protected override string StreamProvider => OrleansStreamProvider;
+
+ public async override Task HandleEvent(Event item)
+ {
+ switch (item.Type)
+ {
+ case nameof(EventType.UserConnected):
+ // The user reconnected, let's send the last message if we have one
+ string? lastMessage = _state.State.History.LastOrDefault()?.Message;
+ if (lastMessage == null)
+ {
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/Discount/DiscountState.cs b/samples/support-center/SupportCenter.ApiService/Agents/Discount/DiscountState.cs
new file mode 100644
index 00000000..972d162e
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/Discount/DiscountState.cs
@@ -0,0 +1,6 @@
+namespace SupportCenter.ApiService.Agents.Discount;
+
+public class DiscountState
+{
+}
+
diff --git a/samples/support-center/src/backend/Agents/Dispatcher/Dispatcher.cs b/samples/support-center/SupportCenter.ApiService/Agents/Dispatcher/Dispatcher.cs
similarity index 57%
rename from samples/support-center/src/backend/Agents/Dispatcher/Dispatcher.cs
rename to samples/support-center/SupportCenter.ApiService/Agents/Dispatcher/Dispatcher.cs
index 835812da..c02b1021 100644
--- a/samples/support-center/src/backend/Agents/Dispatcher/Dispatcher.cs
+++ b/samples/support-center/SupportCenter.ApiService/Agents/Dispatcher/Dispatcher.cs
@@ -1,54 +1,48 @@
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Orleans.Runtime;
-using SupportCenter.Attributes;
-using SupportCenter.Events;
-using SupportCenter.Extensions;
-using SupportCenter.Options;
+using Microsoft.Extensions.AI;
+using Microsoft.Win32;
+using SupportCenter.ApiService.Attributes;
+using SupportCenter.ApiService.Events;
+using SupportCenter.ApiService.Extensions;
+using SupportCenter.ApiService.SignalRHub;
using System.Reflection;
+using static SupportCenter.ApiService.Consts;
-namespace SupportCenter.Agents;
+namespace SupportCenter.ApiService.Agents.Dispatcher;
-[ImplicitStreamSubscription(Consts.OrleansNamespace)]
+[ImplicitStreamSubscription(OrleansNamespace)]
[DispatcherChoice("QnA", "The customer is asking a question related to internal Contoso knowledge base.", EventType.QnARequested)]
[DispatcherChoice("Discount", "The customer is asking for a discount about a product or service.", EventType.DiscountRequested)]
[DispatcherChoice("Invoice", "The customer is asking for an invoice.", EventType.InvoiceRequested)]
[DispatcherChoice("CustomerInfo", "The customer is asking for reading or updating his or her personal data.", EventType.CustomerInfoRequested)]
[DispatcherChoice("Conversation", "The customer is having a generic conversation. When the request is generic or can't be classified differently, use this choice.", EventType.ConversationRequested)]
-public class Dispatcher : AiAgent
-{
- private readonly ILogger _logger;
-
- protected override string Namespace => Consts.OrleansNamespace;
-
- public Dispatcher(
+public class Dispatcher(
ILogger logger,
[PersistentState("state", "messages")] IPersistentState> state,
- [FromKeyedServices("DispatcherKernel")] Kernel kernel
- )
- : base(state, default, kernel)
- {
- _logger = logger ?? throw new ArgumentNullException(nameof(logger));
- }
-
+ [FromKeyedServices(Gpt4oMini)] IChatClient chatClient) : AiAgent(state)
+{
+ protected override string Namespace => OrleansNamespace;
+ protected override string StreamProvider => OrleansStreamProvider;
public async override Task HandleEvent(Event item)
{
- _logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(Dispatcher), item.Type, item.Data);
+ logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(Dispatcher), item.Type, item.Data);
- var ssc = item.GetAgentData();
+ var registry = GrainFactory.GetGrain(item.Data.GetValueOrDefault("userId"));
+ var connection = await registry.GetConnection();
+ var ssc = item.GetAgentData(connection.ConversationId);
string? userId = ssc.UserId;
string? message = ssc.UserMessage;
string? id = ssc.Id;
string? intent;
- _logger.LogInformation($"userId: {userId}, message: {message}");
+ logger.LogInformation($"userId: {userId}, message: {message}");
if (userId == null || message == null)
{
- _logger.LogWarning("[{Agent}]:[{EventType}]:[{EventData}]. Input is missing.", nameof(Dispatcher), item.Type, item.Data);
+ logger.LogWarning("[{Agent}]:[{EventType}]:[{EventData}]. Input is missing.", nameof(Dispatcher), item.Type, item.Data);
return;
}
-
+
switch (item.Type)
{
case nameof(EventType.UserConnected):
@@ -56,7 +50,7 @@ public async override Task HandleEvent(Event item)
string? lastMessage = _state.State.History.LastOrDefault()?.Message;
if (lastMessage == null)
{
- _logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]. Last message is missing.", nameof(Dispatcher), item.Type, item.Data);
+ logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]. Last message is missing.", nameof(Dispatcher), item.Type, item.Data);
return;
}
intent = (await ExtractIntentAsync(lastMessage))?.Trim(' ', '\"', '.') ?? string.Empty;
@@ -90,10 +84,10 @@ public async override Task HandleEvent(Event item)
var answer = item.Data.GetValueOrDefault("message");
if (answer == null)
{
- _logger.LogWarning("[{Agent}]:[{EventType}]:[{EventData}]. Answer from agent is missing.", nameof(Dispatcher), item.Type, item.Data);
+ logger.LogWarning("[{Agent}]:[{EventType}]:[{EventData}]. Answer from agent is missing.", nameof(Dispatcher), item.Type, item.Data);
return;
}
- _logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(Dispatcher), item.Type, answer);
+ logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(Dispatcher), item.Type, answer);
AddToHistory(answer, ChatUserType.Agent);
break;
default:
@@ -104,12 +98,37 @@ public async override Task HandleEvent(Event item)
private async Task ExtractIntentAsync(string message)
{
var input = AppendChatHistory(message);
-
- var context = new KernelArguments { ["input"] = input };
- context.Add("choices", GetAndSerializeChoices());
- return await CallFunction(DispatcherPrompts.GetIntent, context);
+ var choices = GetAndSerializeChoices();
+ var prompt = $"""
+ You are a dispatcher agent, working with the Support Center of the Contoso organization.
+ You can help customers with their issues, and you can also assign tickets to other AI agents.
+ Read the customer's message carefully, and then decide the appropriate intent from the following list.
+ A history of the conversation is available to help you make a decision.
+
+ If you don't know the intent, please don't guess; instead respond with "Unknown".
+ There may be multiple intents, but you should choose the most appropriate one.
+ If you think that the message is not clear, you can ask the customer for more information.
+
+ You can choose between the following intents:
+ {choices}
+
+ Here are few examples:
+ - User Input: Can you help me in updating my address?
+ - CustomerInfo
+
+ - User Input: Could you check whether my invoice has been correctly payed?
+ - Invoice
+
+ Here is the user input:
+ User Input: {input}
+
+ Return the intent as a string.
+ """;
+ var result = await chatClient.GetResponseAsync(prompt);
+ return result.Message.Text!;
}
+ // TODO: Custom attributes should be constructed only once in the lifetime of the application.
private string GetAndSerializeChoices()
{
var choices = this.GetType().GetCustomAttributes()
@@ -121,6 +140,7 @@ private string GetAndSerializeChoices()
private async Task SendDispatcherEvent(string id, string userId, string intent, string message)
{
+ // TODO: Custom attributes should be constructed only once in the lifetime of the application.
var type = this.GetType()
.GetCustomAttributes()
.FirstOrDefault(attr => attr.Name == intent)?
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/Dispatcher/DispatcherState.cs b/samples/support-center/SupportCenter.ApiService/Agents/Dispatcher/DispatcherState.cs
new file mode 100644
index 00000000..bff7ac39
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/Dispatcher/DispatcherState.cs
@@ -0,0 +1,11 @@
+namespace SupportCenter.ApiService.Agents.Dispatcher;
+
+public class DispatcherState
+{
+}
+
+public class Choice(string name, string description)
+{
+ public string Name { get; set; } = name;
+ public string Description { get; set; } = description;
+}
\ No newline at end of file
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/QnA/QnA.cs b/samples/support-center/SupportCenter.ApiService/Agents/QnA/QnA.cs
new file mode 100644
index 00000000..7681f62b
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/QnA/QnA.cs
@@ -0,0 +1,86 @@
+using Microsoft.AI.Agents.Abstractions;
+using Microsoft.AI.Agents.Orleans;
+using Microsoft.Extensions.AI;
+using SupportCenter.ApiService.Data;
+using SupportCenter.ApiService.Events;
+using SupportCenter.ApiService.Extensions;
+using SupportCenter.ApiService.SignalRHub;
+using System.Text;
+using static SupportCenter.ApiService.Consts;
+
+namespace SupportCenter.ApiService.Agents.QnA;
+[ImplicitStreamSubscription(OrleansNamespace)]
+public class QnA([PersistentState("state", "messages")] IPersistentState> state,
+ ILogger logger, IVectorRepository vectorRepository,
+ [FromKeyedServices(Gpt4oMini)] IChatClient chatClient) : AiAgent(state)
+{
+ protected override string Namespace => OrleansNamespace;
+ protected override string StreamProvider => OrleansStreamProvider;
+
+ public async override Task HandleEvent(Event item)
+ {
+ switch (item.Type)
+ {
+ case nameof(EventType.UserConnected):
+ // The user reconnected, let's send the last message if we have one
+ string? lastMessage = _state.State.History.LastOrDefault()?.Message;
+ if (lastMessage == null)
+ {
+ return;
+ }
+ break;
+ case nameof(EventType.QnARequested):
+ var registry = GrainFactory.GetGrain(item.Data.GetValueOrDefault("userId"));
+ var connection = await registry.GetConnection();
+ var ssc = item.GetAgentData(connection.ConversationId);
+ string? userId = ssc.UserId;
+ string? message = ssc.UserMessage;
+ string? id = ssc.Id;
+
+ logger.LogInformation($"userId: {userId}, message: {message}");
+ if (userId == null || message == null)
+ {
+ logger.LogWarning("[{Agent}]:[{EventType}]:[{EventData}]. Input is missing.", nameof(Dispatcher), item.Type, item.Data);
+ return;
+ }
+
+ logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(QnA), nameof(EventType.QnARequested), message);
+ await SendAnswerEvent(id, userId, $"Please wait while I look in the documents for answers to your question...");
+
+ var input = AppendChatHistory(message);
+ var kb = new StringBuilder();
+ await foreach (var doc in await vectorRepository.GetDocuments(input, "qna", 5))
+ {
+ kb.AppendLine($"{doc.Record.Text}");
+ }
+
+ var prompt = $"""
+ You are a helpful customer support/service agent at Contoso Electronics. Be polite and professional and answer briefly based on your knowledge ONLY.
+ Input: {input}
+ Consider the following knowledge and facts:
+ {kb}
+ """;
+
+ var result = await chatClient.GetResponseAsync(prompt);
+ var answer = result.Message.Text!;
+
+ await SendAnswerEvent(id, userId, answer);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ private async Task SendAnswerEvent(string id, string userId, string message)
+ {
+ await PublishEvent(OrleansNamespace, id, new Event
+ {
+ Type = nameof(EventType.QnARetrieved),
+ Data = new Dictionary {
+ { nameof(userId), userId },
+ { nameof(message), message }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/SupportCenter.ApiService/Agents/QnA/QnAState.cs b/samples/support-center/SupportCenter.ApiService/Agents/QnA/QnAState.cs
new file mode 100644
index 00000000..309ce064
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Agents/QnA/QnAState.cs
@@ -0,0 +1,6 @@
+namespace SupportCenter.ApiService.Agents.QnA;
+
+public class QnAState
+{
+}
+
diff --git a/samples/support-center/src/backend/Agents/SignalR/SignalR.cs b/samples/support-center/SupportCenter.ApiService/Agents/SignalR/SignalR.cs
similarity index 76%
rename from samples/support-center/src/backend/Agents/SignalR/SignalR.cs
rename to samples/support-center/SupportCenter.ApiService/Agents/SignalR/SignalR.cs
index 0bff848d..be5835b3 100644
--- a/samples/support-center/src/backend/Agents/SignalR/SignalR.cs
+++ b/samples/support-center/SupportCenter.ApiService/Agents/SignalR/SignalR.cs
@@ -1,17 +1,18 @@
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AI.Agents.Orleans;
-using SupportCenter.Events;
-using SupportCenter.Extensions;
-using SupportCenter.Options;
-using SupportCenter.SignalRHub;
+using SupportCenter.ApiService.Events;
+using SupportCenter.ApiService.Extensions;
+using SupportCenter.ApiService.SignalRHub;
using System.Collections.Concurrent;
+using static SupportCenter.ApiService.Consts;
-namespace Marketing.Agents;
+namespace SupportCenter.ApiService.Agents.SignalR;
-[ImplicitStreamSubscription(Consts.OrleansNamespace)]
+[ImplicitStreamSubscription(OrleansNamespace)]
public class SignalR : Agent
{
- protected override string Namespace => Consts.OrleansNamespace;
+ protected override string Namespace => OrleansNamespace;
+ protected override string StreamProvider => OrleansStreamProvider;
private readonly ConcurrentDictionary _eventTypeToSenderTypeMapping = new()
{
[nameof(EventType.QnARetrieved)] = AgentType.QnA,
@@ -56,6 +57,8 @@ public async override Task HandleEvent(Event item)
message = "Sorry, I don't know how to handle this request. Try to rephrase it.";
}
- await _signalRClient.SendMessageToClient(messageId: Guid.NewGuid().ToString(), userId, message, agentType);
+ var registry = GrainFactory.GetGrain(userId);
+ var connection = await registry.GetConnection();
+ await _signalRClient.SendMessageToClient(messageId: Guid.NewGuid().ToString(), userId, conversationId: connection.ConversationId, connectionId: connection.Id, message, agentType);
}
}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Attributes/Choice.cs b/samples/support-center/SupportCenter.ApiService/Attributes/Choice.cs
similarity index 81%
rename from samples/support-center/src/backend/Attributes/Choice.cs
rename to samples/support-center/SupportCenter.ApiService/Attributes/Choice.cs
index 6264e0cb..f5f275e0 100644
--- a/samples/support-center/src/backend/Attributes/Choice.cs
+++ b/samples/support-center/SupportCenter.ApiService/Attributes/Choice.cs
@@ -1,6 +1,6 @@
-using SupportCenter.Events;
+using SupportCenter.ApiService.Events;
-namespace SupportCenter.Attributes
+namespace SupportCenter.ApiService.Attributes
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class DispatcherChoice(string name, string description, EventType dispatchToEvent) : Attribute
diff --git a/samples/support-center/SupportCenter.ApiService/Consts.cs b/samples/support-center/SupportCenter.ApiService/Consts.cs
new file mode 100644
index 00000000..c46305eb
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Consts.cs
@@ -0,0 +1,10 @@
+namespace SupportCenter.ApiService
+{
+ public static class Consts
+ {
+ public const string OrleansNamespace = "SupportCenter";
+ public const string Gpt4oMini = "gpt-4o-mini";
+
+ public static string OrleansStreamProvider = "AzureQueueProvider";
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Controllers/Interactions.cs b/samples/support-center/SupportCenter.ApiService/Controllers/Interactions.cs
similarity index 85%
rename from samples/support-center/src/backend/Controllers/Interactions.cs
rename to samples/support-center/SupportCenter.ApiService/Controllers/Interactions.cs
index 034627ec..1da825ea 100644
--- a/samples/support-center/src/backend/Controllers/Interactions.cs
+++ b/samples/support-center/SupportCenter.ApiService/Controllers/Interactions.cs
@@ -1,10 +1,10 @@
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AspNetCore.Mvc;
+using Orleans;
using Orleans.Runtime;
-using SupportCenter.Events;
-using SupportCenter.Options;
+using SupportCenter.ApiService.Events;
-namespace SupportCenter.Controllers
+namespace SupportCenter.ApiService.Controllers
{
[Route("api/[controller]")]
[ApiController]
@@ -21,7 +21,7 @@ public Interactions(IClusterClient client)
[HttpPost("{userId}")]
public async Task Post(string userId, [FromBody] string userMessage)
{
- var streamProvider = _client.GetStreamProvider("StreamProvider");
+ var streamProvider = _client.GetStreamProvider(Consts.OrleansStreamProvider);
var streamId = StreamId.Create(Consts.OrleansNamespace, userId); // to change
var stream = streamProvider.GetStream(streamId);
diff --git a/samples/support-center/SupportCenter.ApiService/Data/Customer.cs b/samples/support-center/SupportCenter.ApiService/Data/Customer.cs
new file mode 100644
index 00000000..144e5183
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Data/Customer.cs
@@ -0,0 +1,15 @@
+namespace SupportCenter.ApiService.Data
+{
+ public class Customer
+ {
+ public string Id { get; set; }
+ public string? Name { get; set; }
+
+ public string? Email { get; set; }
+
+ public string? Phone { get; set; }
+
+ public string? Address { get; set; }
+
+ }
+}
diff --git a/samples/support-center/SupportCenter.ApiService/Data/CustomerRepository.cs b/samples/support-center/SupportCenter.ApiService/Data/CustomerRepository.cs
new file mode 100644
index 00000000..227a2ed1
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Data/CustomerRepository.cs
@@ -0,0 +1,57 @@
+using StackExchange.Redis;
+using System.Text.Json;
+
+namespace SupportCenter.ApiService.Data
+{
+ public class CustomerRepository([FromKeyedServices("redis")] IConnectionMultiplexer redisConnection, ILogger logger) : ICustomerRepository
+ {
+ // Method that gets a customer by ID from redis database
+ public async Task GetCustomerByIdAsync(string customerId)
+ {
+ var db = redisConnection.GetDatabase();
+ var key = $"customers:{customerId}";
+ var customer = await db.StringGetAsync(key);
+ if (customer.IsNullOrEmpty)
+ {
+ return null;
+ }
+ return JsonSerializer.Deserialize(customer.ToString());
+ }
+
+ public async Task> GetCustomersAsync()
+ {
+ var server = redisConnection.GetServer(redisConnection.GetEndPoints().First());
+ var db = redisConnection.GetDatabase();
+ var keys = server.Keys(pattern: "customers:*");
+ var customers = new List();
+
+ foreach (var key in keys)
+ {
+ var data = await db.StringGetAsync(key);
+ if (!data.IsNullOrEmpty)
+ {
+ var customer = JsonSerializer.Deserialize(data.ToString());
+ if (customer != null)
+ {
+ customers.Add(customer);
+ }
+ }
+ }
+ return customers;
+ }
+
+ public async Task InsertCustomerAsync(Customer customer)
+ {
+ var db = redisConnection.GetDatabase();
+ var key = $"customers:{customer.Id}";
+ await db.StringSetAsync(key, JsonSerializer.Serialize(customer));
+ }
+
+ public async Task UpdateCustomerAsync(Customer customer)
+ {
+ var db = redisConnection.GetDatabase();
+ var key = $"customers:{customer.Id}";
+ await db.StringSetAsync(key, JsonSerializer.Serialize(customer));
+ }
+ }
+}
diff --git a/samples/support-center/src/backend/Data/CosmosDb/ICustomerRepository.cs b/samples/support-center/SupportCenter.ApiService/Data/ICustomerRepository.cs
similarity index 76%
rename from samples/support-center/src/backend/Data/CosmosDb/ICustomerRepository.cs
rename to samples/support-center/SupportCenter.ApiService/Data/ICustomerRepository.cs
index 15d74693..d4fa113b 100644
--- a/samples/support-center/src/backend/Data/CosmosDb/ICustomerRepository.cs
+++ b/samples/support-center/SupportCenter.ApiService/Data/ICustomerRepository.cs
@@ -1,6 +1,4 @@
-using SupportCenter.Data.CosmosDb.Entities;
-
-namespace SupportCenter.Data.CosmosDb
+namespace SupportCenter.ApiService.Data
{
public interface ICustomerRepository
{
diff --git a/samples/support-center/SupportCenter.ApiService/Data/IVectorRepository.cs b/samples/support-center/SupportCenter.ApiService/Data/IVectorRepository.cs
new file mode 100644
index 00000000..2ac0df98
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Data/IVectorRepository.cs
@@ -0,0 +1,10 @@
+using Microsoft.Extensions.VectorData;
+using SupportCenter.Shared;
+
+namespace SupportCenter.ApiService.Data
+{
+ public interface IVectorRepository
+ {
+ Task>> GetDocuments(string query, string index, int top = 2);
+ }
+}
diff --git a/samples/support-center/SupportCenter.ApiService/Data/VectorRepository.cs b/samples/support-center/SupportCenter.ApiService/Data/VectorRepository.cs
new file mode 100644
index 00000000..d3a403ed
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Data/VectorRepository.cs
@@ -0,0 +1,24 @@
+using Microsoft.Extensions.AI;
+using Microsoft.Extensions.VectorData;
+using SupportCenter.Shared;
+
+namespace SupportCenter.ApiService.Data
+{
+ public class VectorRepository(IEmbeddingGenerator> embeddingGenerator, IVectorStore vectorStore) : IVectorRepository
+ {
+ public async Task>> GetDocuments(string query, string index, int top=2)
+ {
+ var queryEmbedding = await embeddingGenerator.GenerateEmbeddingVectorAsync(query);
+ var collection = vectorStore.GetCollection(index);
+
+ var searchOptions = new VectorSearchOptions()
+ {
+ Top = top,
+ VectorPropertyName = "Vector"
+ };
+
+ var results = await collection.VectorizedSearchAsync(queryEmbedding, searchOptions);
+ return results.Results;
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Events/EventTypes.cs b/samples/support-center/SupportCenter.ApiService/Events/EventTypes.cs
similarity index 92%
rename from samples/support-center/src/backend/Events/EventTypes.cs
rename to samples/support-center/SupportCenter.ApiService/Events/EventTypes.cs
index 4a7f1c04..c20d3af1 100644
--- a/samples/support-center/src/backend/Events/EventTypes.cs
+++ b/samples/support-center/SupportCenter.ApiService/Events/EventTypes.cs
@@ -1,4 +1,4 @@
-namespace SupportCenter.Events;
+namespace SupportCenter.ApiService.Events;
public enum EventType
{
diff --git a/samples/support-center/SupportCenter.ApiService/Extensions/DictionaryExtension.cs b/samples/support-center/SupportCenter.ApiService/Extensions/DictionaryExtension.cs
new file mode 100644
index 00000000..9850082f
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Extensions/DictionaryExtension.cs
@@ -0,0 +1,46 @@
+
+namespace SupportCenter.ApiService.Extensions
+{
+ using System;
+ using System.Collections.Generic;
+
+ ///
+ /// Provides extension methods for .
+ ///
+ public static class DictionaryExtensions
+ {
+ ///
+ /// Gets the value associated with the specified key or the default value of if the key does not exist.
+ ///
+ /// The type of the value to return.
+ /// The dictionary to search.
+ /// The key of the value to get.
+ /// The value associated with the specified key, or the default value of if the key does not exist.
+ /// Thrown when or is null.
+ /// Thrown when the value associated with the specified key cannot be converted to .
+ public static T GetValueOrDefault(this IDictionary dictionary, string key)
+ {
+ ArgumentNullException.ThrowIfNull(dictionary);
+ ArgumentNullException.ThrowIfNull(key);
+
+ if (dictionary.TryGetValue(key, out var value))
+ {
+ if (value is T typedValue)
+ return typedValue;
+
+ try
+ {
+ return (T)Convert.ChangeType(value, typeof(T));
+ }
+ catch (InvalidCastException)
+ {
+ throw new InvalidOperationException($"Value for key '{key}' is not of type {typeof(T).Name}");
+ }
+ }
+ else
+ {
+ return default;
+ }
+ }
+ }
+}
diff --git a/samples/support-center/src/backend/Extensions/ObjectExtensions.cs b/samples/support-center/SupportCenter.ApiService/Extensions/ObjectExtensions.cs
similarity index 96%
rename from samples/support-center/src/backend/Extensions/ObjectExtensions.cs
rename to samples/support-center/SupportCenter.ApiService/Extensions/ObjectExtensions.cs
index a8137e04..e1169e46 100644
--- a/samples/support-center/src/backend/Extensions/ObjectExtensions.cs
+++ b/samples/support-center/SupportCenter.ApiService/Extensions/ObjectExtensions.cs
@@ -1,7 +1,7 @@
using System.Reflection;
using System.Text;
-namespace SupportCenter.Extensions
+namespace SupportCenter.ApiService.Extensions
{
public static class ObjectExtensions
{
diff --git a/samples/support-center/src/backend/Extensions/SupportCenterAgentExtensions.cs b/samples/support-center/SupportCenter.ApiService/Extensions/SupportCenterAgentExtensions.cs
similarity index 69%
rename from samples/support-center/src/backend/Extensions/SupportCenterAgentExtensions.cs
rename to samples/support-center/SupportCenter.ApiService/Extensions/SupportCenterAgentExtensions.cs
index 8519eb3f..b09888d7 100644
--- a/samples/support-center/src/backend/Extensions/SupportCenterAgentExtensions.cs
+++ b/samples/support-center/SupportCenter.ApiService/Extensions/SupportCenterAgentExtensions.cs
@@ -1,18 +1,17 @@
using Microsoft.AI.Agents.Abstractions;
-using SupportCenter.SignalRHub;
-namespace SupportCenter.Extensions
+namespace SupportCenter.ApiService.Extensions
{
public static class SupportCenterAgentExtensions
{
- public static SupportCenterData GetAgentData(this Event item)
+ public static SupportCenterData GetAgentData(this Event item, string? conversationId)
{
string? userId = item.Data.GetValueOrDefault("userId");
string? userMessage = item.Data.GetValueOrDefault("message")
?? item.Data.GetValueOrDefault("userMessage");
- string? conversationId = SignalRConnectionsDB.GetConversationId(userId) ?? item.Data.GetValueOrDefault("id");
- string id = $"{userId}/{conversationId}";
+ string? cId = conversationId ?? item.Data.GetValueOrDefault("id");
+ string id = $"{userId}/{cId}";
return new SupportCenterData(id, userId, userMessage);
}
diff --git a/samples/support-center/src/backend/Extensions/ValidationExtensions.cs b/samples/support-center/SupportCenter.ApiService/Extensions/ValidationExtensions.cs
similarity index 93%
rename from samples/support-center/src/backend/Extensions/ValidationExtensions.cs
rename to samples/support-center/SupportCenter.ApiService/Extensions/ValidationExtensions.cs
index 2ee1d9f4..f8873db3 100644
--- a/samples/support-center/src/backend/Extensions/ValidationExtensions.cs
+++ b/samples/support-center/SupportCenter.ApiService/Extensions/ValidationExtensions.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace SupportCenter.Core
+namespace SupportCenter.ApiService.Extensions
{
/*
* This class is used to extend the validation functionality of the application.
diff --git a/samples/support-center/SupportCenter.ApiService/Program.cs b/samples/support-center/SupportCenter.ApiService/Program.cs
new file mode 100644
index 00000000..52191e3b
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/Program.cs
@@ -0,0 +1,116 @@
+using Microsoft.Extensions.AI;
+using OpenAI;
+using SupportCenter.ApiService.SignalRHub;
+using System.Text.Json;
+using Orleans.Serialization;
+using static SupportCenter.ApiService.Consts;
+using SupportCenter.ApiService.Data;
+using Microsoft.Extensions.VectorData;
+using StackExchange.Redis;
+using Microsoft.SemanticKernel.Connectors.Redis;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.AddServiceDefaults();
+
+builder.Services.AddHttpClient();
+builder.Services.AddControllers();
+builder.Services.AddApplicationInsightsTelemetry();
+builder.Services.AddSignalR()
+ .AddNamedAzureSignalR("signalr");
+
+builder.Services.AddSingleton();
+builder.Services.AddTransient();
+
+builder.AddKeyedRedisDistributedCache("redis");
+builder.AddKeyedAzureTableClient("clustering");
+builder.AddKeyedAzureTableClient("snapshot");
+builder.AddKeyedAzureBlobClient("grain-state");
+builder.AddKeyedAzureQueueClient("streaming");
+
+builder.AddAzureOpenAIClient("openAiConnection");
+
+builder.Services.AddKeyedChatClient(Gpt4oMini, s => {
+ var innerClient = s.GetRequiredService().AsChatClient(Gpt4oMini);
+ return new ChatClientBuilder(innerClient)
+ .UseFunctionInvocation().Build();
+
+});
+
+builder.Services.AddSingleton(sp =>
+{
+ var db = sp.GetRequiredKeyedService("redis").GetDatabase();
+ return new RedisVectorStore(db, new() { StorageType = RedisStorageType.HashSet });
+});
+
+builder.Services.AddSingleton();
+
+builder.Services.AddEmbeddingGenerator(s => {
+ return s.GetRequiredService().AsEmbeddingGenerator("text-embedding-3-large");
+});
+// Allow any CORS origin if in DEV
+const string AllowDebugOriginPolicy = "AllowDebugOrigin";
+const string AllowOriginPolicy = "AllowOrigin";
+var isDev = builder.Environment.IsDevelopment();
+if (isDev)
+{
+ builder.Services.AddCors(options =>
+ {
+ options.AddPolicy(AllowDebugOriginPolicy, builder =>
+ {
+ builder.SetIsOriginAllowed(origin => new Uri(origin).Host == "localhost")
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowCredentials();
+ });
+ });
+}
+else
+{
+ builder.Services.AddCors(options =>
+ {
+ options.AddPolicy(AllowOriginPolicy, builder =>
+ {
+ builder
+ .SetIsOriginAllowedToAllowWildcardSubdomains()
+ .WithOrigins("https://*.azurecontainerapps.io") // client url
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowCredentials();
+ });
+ });
+}
+
+builder.UseOrleans(siloBuilder =>
+{
+ siloBuilder.Services.AddSerializer(serializerBuilder =>
+ {
+ serializerBuilder.AddJsonSerializer(
+ isSupported: type => true);
+ });
+});
+
+builder.Services.Configure(options =>
+{
+ options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
+});
+
+var app = builder.Build();
+
+app.MapDefaultEndpoints();
+
+app.UseRouting();
+if (isDev)
+{
+ app.UseCors(AllowDebugOriginPolicy);
+}
+else
+{
+ app.UseCors(AllowOriginPolicy);
+
+}
+app.MapControllers();
+
+app.MapHub("/supportcenterhub");
+
+app.Run();
diff --git a/samples/support-center/src/backend/Properties/launchSettings.json b/samples/support-center/SupportCenter.ApiService/Properties/launchSettings.json
similarity index 94%
rename from samples/support-center/src/backend/Properties/launchSettings.json
rename to samples/support-center/SupportCenter.ApiService/Properties/launchSettings.json
index c4dbf9b5..ecc8c358 100644
--- a/samples/support-center/src/backend/Properties/launchSettings.json
+++ b/samples/support-center/SupportCenter.ApiService/Properties/launchSettings.json
@@ -33,8 +33,8 @@
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
- "ASPNETCORE_HTTPS_PORTS": "8081",
- "ASPNETCORE_HTTP_PORTS": "8080"
+ "ASPNETCORE_HTTPS_PORTS": "8082",
+ "ASPNETCORE_HTTP_PORTS": "8081"
},
"publishAllPorts": true,
"useSSL": true
diff --git a/samples/support-center/src/backend/SignalRHub/AgentTypes.cs b/samples/support-center/SupportCenter.ApiService/SignalRHub/AgentTypes.cs
similarity index 76%
rename from samples/support-center/src/backend/SignalRHub/AgentTypes.cs
rename to samples/support-center/SupportCenter.ApiService/SignalRHub/AgentTypes.cs
index bdfaca4c..4b6f65a6 100644
--- a/samples/support-center/src/backend/SignalRHub/AgentTypes.cs
+++ b/samples/support-center/SupportCenter.ApiService/SignalRHub/AgentTypes.cs
@@ -1,4 +1,4 @@
-namespace SupportCenter.SignalRHub;
+namespace SupportCenter.ApiService.SignalRHub;
public enum AgentType
{
diff --git a/samples/support-center/src/backend/SignalRHub/FrontEndMessage.cs b/samples/support-center/SupportCenter.ApiService/SignalRHub/FrontEndMessage.cs
similarity index 82%
rename from samples/support-center/src/backend/SignalRHub/FrontEndMessage.cs
rename to samples/support-center/SupportCenter.ApiService/SignalRHub/FrontEndMessage.cs
index b9bb2e75..1ccb4cb7 100644
--- a/samples/support-center/src/backend/SignalRHub/FrontEndMessage.cs
+++ b/samples/support-center/SupportCenter.ApiService/SignalRHub/FrontEndMessage.cs
@@ -1,4 +1,4 @@
-namespace SupportCenter.SignalRHub;
+namespace SupportCenter.ApiService.SignalRHub;
public class ChatMessage
{
diff --git a/samples/support-center/SupportCenter.ApiService/SignalRHub/ISignalRService.cs b/samples/support-center/SupportCenter.ApiService/SignalRHub/ISignalRService.cs
new file mode 100644
index 00000000..6cb29ec5
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/SignalRHub/ISignalRService.cs
@@ -0,0 +1,5 @@
+namespace SupportCenter.ApiService.SignalRHub;
+public interface ISignalRService
+{
+ Task SendMessageToClient(string messageId, string userId, string conversationId, string connectionId, string message, AgentType senderType);
+}
diff --git a/samples/support-center/src/backend/SignalRHub/ISupportCenterHub.cs b/samples/support-center/SupportCenter.ApiService/SignalRHub/ISupportCenterHub.cs
similarity index 77%
rename from samples/support-center/src/backend/SignalRHub/ISupportCenterHub.cs
rename to samples/support-center/SupportCenter.ApiService/SignalRHub/ISupportCenterHub.cs
index 9e495794..aea6ddfc 100644
--- a/samples/support-center/src/backend/SignalRHub/ISupportCenterHub.cs
+++ b/samples/support-center/SupportCenter.ApiService/SignalRHub/ISupportCenterHub.cs
@@ -1,6 +1,4 @@
-using SupportCenter.SignalRHub;
-
-namespace SupportCenter.SignalRHub;
+namespace SupportCenter.ApiService.SignalRHub;
public interface ISupportCenterHub
{
diff --git a/samples/support-center/SupportCenter.ApiService/SignalRHub/SignalRConnectionGrain.cs b/samples/support-center/SupportCenter.ApiService/SignalRHub/SignalRConnectionGrain.cs
new file mode 100644
index 00000000..cdc56e61
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/SignalRHub/SignalRConnectionGrain.cs
@@ -0,0 +1,38 @@
+namespace SupportCenter.ApiService.SignalRHub;
+public class SignalRConnectionGrain([PersistentState("state", "messages")] IPersistentState state) : Grain, IStoreConnections
+{
+ private IPersistentState _state = state;
+
+ public Task GetConnection()
+ {
+ return Task.FromResult(_state.State);
+ }
+
+ public async Task AddConnection(Connection connection)
+ {
+ _state.State = connection;
+ await _state.WriteStateAsync();
+ }
+
+ public async Task RemoveConnection()
+ {
+ _state.State = null;
+ await _state.WriteStateAsync();
+ }
+}
+
+public interface IStoreConnections : IGrainWithStringKey
+{
+ Task AddConnection(Connection connection);
+ Task GetConnection();
+ Task RemoveConnection();
+}
+
+[GenerateSerializer]
+public class Connection
+{
+ [Id(0)]
+ public string? Id { get; set; }
+ [Id(1)]
+ public string? ConversationId { get; set; }
+}
\ No newline at end of file
diff --git a/samples/support-center/SupportCenter.ApiService/SignalRHub/SignalRService.cs b/samples/support-center/SupportCenter.ApiService/SignalRHub/SignalRService.cs
new file mode 100644
index 00000000..4fbf5b23
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/SignalRHub/SignalRService.cs
@@ -0,0 +1,19 @@
+using Microsoft.AspNetCore.SignalR;
+
+namespace SupportCenter.ApiService.SignalRHub;
+
+public class SignalRService(IHubContext hubContext) : ISignalRService
+{
+ public async Task SendMessageToClient(string messageId, string userId, string conversationId, string connectionId, string message, AgentType senderType)
+ {
+ var chatMessage = new ChatMessage()
+ {
+ Id = messageId,
+ ConversationId = conversationId,
+ UserId = userId,
+ Text = message,
+ Sender = senderType.ToString()
+ };
+ await hubContext.Clients.Client(connectionId).SendAsync("ReceiveMessage", chatMessage);
+ }
+}
diff --git a/samples/support-center/src/backend/SignalRHub/SupportCenterHub.cs b/samples/support-center/SupportCenter.ApiService/SignalRHub/SupportCenterHub.cs
similarity index 66%
rename from samples/support-center/src/backend/SignalRHub/SupportCenterHub.cs
rename to samples/support-center/SupportCenter.ApiService/SignalRHub/SupportCenterHub.cs
index f4388d5c..5828fcf4 100644
--- a/samples/support-center/src/backend/SignalRHub/SupportCenterHub.cs
+++ b/samples/support-center/SupportCenter.ApiService/SignalRHub/SupportCenterHub.cs
@@ -1,13 +1,13 @@
-namespace SupportCenter.SignalRHub;
+namespace SupportCenter.ApiService.SignalRHub;
using Microsoft.AI.Agents.Abstractions;
using Microsoft.AspNetCore.SignalR;
using Orleans.Runtime;
-using SupportCenter.Options;
-using SupportCenter.Events;
using Orleans;
+using SupportCenter.ApiService.Events;
+using SupportCenter.ApiService;
-public class SupportCenterHub : Hub
+public class SupportCenterHub(IClusterClient clusterClient) : Hub
{
public override async Task OnConnectedAsync()
{
@@ -16,18 +16,18 @@ public override async Task OnConnectedAsync()
public override async Task OnDisconnectedAsync(Exception? exception)
{
- SignalRConnectionsDB.ConnectionByUser.TryRemove(Context.ConnectionId, out _);
+ var registry = clusterClient.GetGrain(Context.UserIdentifier);
+ await registry.RemoveConnection();
await base.OnDisconnectedAsync(exception);
}
- public async Task ConnectToAgent(string userId, string conversationId, IClusterClient clusterClient)
+ public async Task ConnectToAgent(string userId, string conversationId)
{
- SignalRConnectionsDB.ConnectionByUser.AddOrUpdate(
- userId, new Connection(Context.ConnectionId, conversationId),
- (key, oldValue) => new Connection(Context.ConnectionId, conversationId));
+ var registry = clusterClient.GetGrain(userId);
+ await registry.AddConnection(new Connection { Id = Context.ConnectionId, ConversationId = conversationId });
// Notify the agents that a new user got connected.
- var streamProvider = clusterClient.GetStreamProvider("StreamProvider");
+ var streamProvider = clusterClient.GetStreamProvider(Consts.OrleansStreamProvider);
var streamId = StreamId.Create(Consts.OrleansNamespace, $"{userId}/{conversationId}");
var stream = streamProvider.GetStream(streamId);
var data = new Dictionary
@@ -42,20 +42,23 @@ await stream.OnNextAsync(new Event
});
}
- public async Task RestartConversation(string userId, string conversationId, IClusterClient clusterClient)
+ public async Task RestartConversation(string userId, string conversationId)
{
ArgumentException.ThrowIfNullOrWhiteSpace(userId, nameof(userId));
ArgumentException.ThrowIfNullOrWhiteSpace(conversationId, nameof(conversationId));
- string? oldConversationId = SignalRConnectionsDB.GetConversationId(userId);
+ var registry = clusterClient.GetGrain(userId);
+ var connection = await registry.GetConnection();
+ if (connection != null)
+ {
+ await registry.RemoveConnection();
+ }
- SignalRConnectionsDB.ConnectionByUser.AddOrUpdate(
- userId,
- key => new Connection(Context.ConnectionId, conversationId),
- (key, oldValue) => new Connection(oldValue.Id, conversationId));
+ var newConversationId = connection != null? connection.ConversationId : conversationId;
+ await registry.AddConnection(new Connection { Id = Context.ConnectionId, ConversationId = newConversationId });
- var streamProvider = clusterClient.GetStreamProvider("StreamProvider");
- var streamId = StreamId.Create(Consts.OrleansNamespace, $"{userId}/{conversationId}");
+ var streamProvider = clusterClient.GetStreamProvider(Consts.OrleansStreamProvider);
+ var streamId = StreamId.Create(Consts.OrleansNamespace, $"{userId}/{newConversationId}");
var stream = streamProvider.GetStream(streamId);
await stream.OnNextAsync(
new Event
@@ -71,7 +74,7 @@ await stream.OnNextAsync(
///
///
///
- public async Task ProcessMessage(ChatMessage chatMessage, IClusterClient clusterClient)
+ public async Task ProcessMessage(ChatMessage chatMessage)
{
ArgumentNullException.ThrowIfNull(chatMessage, nameof(chatMessage));
ArgumentException.ThrowIfNullOrWhiteSpace(chatMessage.UserId, nameof(chatMessage.UserId));
@@ -80,7 +83,7 @@ public async Task ProcessMessage(ChatMessage chatMessage, IClusterClient cluster
var userId = chatMessage.UserId;
var conversationId = chatMessage.ConversationId;
- var streamProvider = clusterClient.GetStreamProvider("StreamProvider");
+ var streamProvider = clusterClient.GetStreamProvider(Consts.OrleansStreamProvider);
var streamId = StreamId.Create(Consts.OrleansNamespace, $"{userId}/{conversationId}");
var stream = streamProvider.GetStream(streamId);
diff --git a/samples/support-center/SupportCenter.ApiService/SupportCenter.ApiService.csproj b/samples/support-center/SupportCenter.ApiService/SupportCenter.ApiService.csproj
new file mode 100644
index 00000000..fb55cd70
--- /dev/null
+++ b/samples/support-center/SupportCenter.ApiService/SupportCenter.ApiService.csproj
@@ -0,0 +1,45 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/support-center/SupportCenter.AppHost/Program.cs b/samples/support-center/SupportCenter.AppHost/Program.cs
new file mode 100644
index 00000000..abfbae99
--- /dev/null
+++ b/samples/support-center/SupportCenter.AppHost/Program.cs
@@ -0,0 +1,94 @@
+using Azure.Provisioning;
+using Azure.Provisioning.AppContainers;
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddAzureProvisioning();
+
+var signalr = builder.ExecutionContext.IsPublishMode
+ ? builder.AddAzureSignalR("signalr")
+ : builder.AddConnectionString("signalr");
+
+var redis = builder.AddRedis("redis")
+ .WithImage("redis/redis-stack-server")
+ .WithRedisCommander();
+//.WithDataVolume(isReadOnly: false);
+//.WithPersistence(interval: TimeSpan.FromMinutes(1), keysChangedThreshold: 10);
+
+var openai = builder.ExecutionContext.IsPublishMode
+ ? builder.AddAzureOpenAI("openAiConnection").AddDeployment(new AzureOpenAIDeployment("gpt-4o-mini", "gpt-4o-mini", "2024-07-18"))
+ : builder.AddConnectionString("openAiConnection");
+
+var apiService = builder.AddProject("apiservice")
+ .WithReference(openai)
+ .WithReference(signalr)
+ .WithReference(redis)
+ .WaitFor(signalr)
+ .WaitFor(redis)
+ .WaitFor(openai)
+ .WithExternalHttpEndpoints();
+
+if (builder.ExecutionContext.IsPublishMode)
+{
+ var storage = builder.AddAzureStorage("storage").RunAsEmulator();
+ var clusteringTable = storage.AddTables("clustering");
+ var grainStorage = storage.AddBlobs("grain-state");
+ var streamingQueue = storage.AddQueues("streaming");
+
+ var orleans = builder.AddOrleans("default")
+ .WithClustering(clusteringTable)
+ .WithGrainStorage("PubSubStore", grainStorage)
+ .WithGrainStorage("messages", grainStorage)
+ .WithStreaming("AzureQueueProvider", streamingQueue);
+
+ var insights = builder.AddAzureApplicationInsights("ServiceCenter");
+ apiService.WithReference(clusteringTable)
+ .WithReference(grainStorage)
+ .WithReference(insights)
+ .WithReference(streamingQueue)
+ .WaitFor(clusteringTable)
+ .WaitFor(grainStorage)
+ .WaitFor(streamingQueue)
+ .WaitFor(insights)
+ .WithEnvironment("HTTP_PORTS", "8081")
+ .WithReplicas(3)
+ .PublishAsAzureContainerApp((infra, capp) =>
+ {
+ capp.Configuration.Ingress.CorsPolicy = new ContainerAppCorsPolicy
+ {
+ AllowCredentials = true,
+ AllowedOrigins = new BicepList { "https://*.azurecontainerapps.io" },
+ AllowedHeaders = new BicepList { "*" },
+ AllowedMethods = new BicepList { "*" },
+
+ };
+ capp.Configuration.Ingress.TargetPort = 8081;
+ capp.Configuration.Ingress.StickySessionsAffinity = StickySessionAffinity.Sticky;
+ });
+}
+else
+{
+ var orleans = builder.AddOrleans("default")
+ .WithDevelopmentClustering()
+ .WithMemoryStreaming("AzureQueueProvider")
+ .WithMemoryGrainStorage("PubSubStore")
+ .WithMemoryGrainStorage("messages");
+ apiService.WithReference(orleans);
+}
+
+builder.AddNpmApp("frontend", "../SupportCenter.Frontend", "dev")
+ .WithReference(apiService)
+ .WithEnvironment("VITE_OAGENT_BASE_URL", apiService.GetEndpoint("http"))
+ .WithEnvironment("BROWSER", "none")
+ .WithHttpEndpoint(env: "VITE_PORT")
+ .WithExternalHttpEndpoints()
+ .PublishAsDockerFile()
+ .WaitFor(apiService);
+
+var memorySeeder = builder.AddProject("memoryseeder")
+ .WithReference(redis)
+ .WithReference(openai)
+ .WaitFor(redis)
+ .WaitFor(openai);
+
+builder.Build().Run();
\ No newline at end of file
diff --git a/samples/support-center/SupportCenter.AppHost/Properties/launchSettings.json b/samples/support-center/SupportCenter.AppHost/Properties/launchSettings.json
new file mode 100644
index 00000000..4acd5546
--- /dev/null
+++ b/samples/support-center/SupportCenter.AppHost/Properties/launchSettings.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:17127;http://localhost:15270",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development",
+ "DOTNET_ENVIRONMENT": "Development",
+ "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21274",
+ "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22143"
+ }
+ },
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "http://localhost:15270",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development",
+ "DOTNET_ENVIRONMENT": "Development",
+ "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19123",
+ "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20218"
+ }
+ }
+ }
+}
diff --git a/samples/support-center/SupportCenter.AppHost/SupportCenter.AppHost.csproj b/samples/support-center/SupportCenter.AppHost/SupportCenter.AppHost.csproj
new file mode 100644
index 00000000..afccdd3e
--- /dev/null
+++ b/samples/support-center/SupportCenter.AppHost/SupportCenter.AppHost.csproj
@@ -0,0 +1,43 @@
+
+
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+ true
+ ca23c54b-f27b-425c-950f-9b608972c600
+
+
+
+
+ PreserveNewest
+ true
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/support-center/SupportCenter.AppHost/appsettings.local.template.json b/samples/support-center/SupportCenter.AppHost/appsettings.local.template.json
new file mode 100644
index 00000000..b703946f
--- /dev/null
+++ b/samples/support-center/SupportCenter.AppHost/appsettings.local.template.json
@@ -0,0 +1,13 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning",
+ "Aspire.Hosting.Dcp": "Warning"
+ }
+ },
+ "ConnectionStrings": {
+ "signalR": "Endpoint=;AccessKey=;Version=;",
+ "openAiConnection": "Endpoint=;Key="
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/src/frontend/.env.localConfig b/samples/support-center/SupportCenter.Frontend/.env.localConfig
similarity index 100%
rename from samples/support-center/src/frontend/.env.localConfig
rename to samples/support-center/SupportCenter.Frontend/.env.localConfig
diff --git a/samples/support-center/src/frontend/.eslintrc.cjs b/samples/support-center/SupportCenter.Frontend/.eslintrc.cjs
similarity index 100%
rename from samples/support-center/src/frontend/.eslintrc.cjs
rename to samples/support-center/SupportCenter.Frontend/.eslintrc.cjs
diff --git a/samples/support-center/src/frontend/.gitignore b/samples/support-center/SupportCenter.Frontend/.gitignore
similarity index 100%
rename from samples/support-center/src/frontend/.gitignore
rename to samples/support-center/SupportCenter.Frontend/.gitignore
diff --git a/samples/support-center/src/frontend/Dockerfile b/samples/support-center/SupportCenter.Frontend/Dockerfile
similarity index 100%
rename from samples/support-center/src/frontend/Dockerfile
rename to samples/support-center/SupportCenter.Frontend/Dockerfile
diff --git a/samples/support-center/src/frontend/README.md b/samples/support-center/SupportCenter.Frontend/README.md
similarity index 100%
rename from samples/support-center/src/frontend/README.md
rename to samples/support-center/SupportCenter.Frontend/README.md
diff --git a/samples/support-center/src/frontend/index.html b/samples/support-center/SupportCenter.Frontend/index.html
similarity index 100%
rename from samples/support-center/src/frontend/index.html
rename to samples/support-center/SupportCenter.Frontend/index.html
diff --git a/samples/support-center/SupportCenter.Frontend/package-lock.json b/samples/support-center/SupportCenter.Frontend/package-lock.json
new file mode 100644
index 00000000..52b74c1c
--- /dev/null
+++ b/samples/support-center/SupportCenter.Frontend/package-lock.json
@@ -0,0 +1,7001 @@
+{
+ "name": "support-center-app",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "support-center-app",
+ "version": "0.0.0",
+ "dependencies": {
+ "@azure/msal-browser": "^3.5.0",
+ "@azure/msal-react": "^2.0.7",
+ "@fluentui/react-components": "^9.37.4",
+ "@microsoft/signalr": "^8.0.0",
+ "axios": "^1.6.0",
+ "dotenv": "^16.4.3",
+ "luxon": "^3.4.3",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-markdown": "^9.0.0",
+ "react-router-dom": "^6.18.0",
+ "remark-gfm": "^4.0.0",
+ "remark-supersub": "^1.0.0",
+ "uuid": "^9.0.1"
+ },
+ "devDependencies": {
+ "@types/luxon": "^3.4.2",
+ "@types/react": "^18.2.55",
+ "@types/react-dom": "^18.2.19",
+ "@types/uuid": "^9.0.8",
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
+ "@typescript-eslint/parser": "^6.21.0",
+ "@vitejs/plugin-react": "^4.2.1",
+ "eslint": "^8.56.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "typescript": "^5.2.2",
+ "vite": "^5.3.3"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@azure/msal-browser": {
+ "version": "3.28.1",
+ "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.28.1.tgz",
+ "integrity": "sha512-OHHEWMB5+Zrix8yKvLVzU3rKDFvh7SOzAzXfICD7YgUXLxfHpTPX2pzOotrri1kskwhHqIj4a5LvhZlIqE7C7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@azure/msal-common": "14.16.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/msal-common": {
+ "version": "14.16.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz",
+ "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/msal-react": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-react/-/msal-react-2.2.0.tgz",
+ "integrity": "sha512-2V+9JXeXyyjYNF92y5u0tU4el9px/V1+vkRuN+DtoxyiMHCtYQpJoaFdGWArh43zhz5aqQqiGW/iajPDSu3QsQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@azure/msal-browser": "^3.27.0",
+ "react": "^16.8.0 || ^17 || ^18"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
+ "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
+ "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.5",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.7",
+ "@babel/parser": "^7.26.7",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.26.7",
+ "@babel/types": "^7.26.7",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
+ "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.5",
+ "@babel/types": "^7.26.5",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
+ "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
+ "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz",
+ "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
+ "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.5",
+ "@babel/parser": "^7.26.7",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.7",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
+ "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.9",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
+ "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.9"
+ }
+ },
+ "node_modules/@floating-ui/devtools": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/devtools/-/devtools-0.2.1.tgz",
+ "integrity": "sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==",
+ "peerDependencies": {
+ "@floating-ui/dom": ">=1.5.4"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
+ "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.9"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
+ "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
+ "license": "MIT"
+ },
+ "node_modules/@fluentui/keyboard-keys": {
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.8.tgz",
+ "integrity": "sha512-iUSJUUHAyTosnXK8O2Ilbfxma+ZyZPMua5vB028Ys96z80v+LFwntoehlFsdH3rMuPsA8GaC1RE7LMezwPBPdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@swc/helpers": "^0.5.1"
+ }
+ },
+ "node_modules/@fluentui/priority-overflow": {
+ "version": "9.1.14",
+ "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.1.14.tgz",
+ "integrity": "sha512-tIH8EhvjZF4MhxSjqrWOyodrQQW+RlVZqxuNFQF5OWRdSqcIK8g+Z+UbC5fYHQooCgVsthk2mFurfGMKFtf9ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@swc/helpers": "^0.5.1"
+ }
+ },
+ "node_modules/@fluentui/react-accordion": {
+ "version": "9.5.14",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.5.14.tgz",
+ "integrity": "sha512-mS9NHxeZn3WwRR0T/D7JKfLY2QEksCewrZIcSvYdgyPmlJCyd71YlkICn3PIvZIpySpoSEA/dqwWTYcC8cU8Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-motion": "^9.6.7",
+ "@fluentui/react-motion-components-preview": "^0.4.3",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-alert": {
+ "version": "9.0.0-beta.124",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.124.tgz",
+ "integrity": "sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-avatar": "^9.6.29",
+ "@fluentui/react-button": "^9.3.83",
+ "@fluentui/react-icons": "^2.0.239",
+ "@fluentui/react-jsx-runtime": "^9.0.39",
+ "@fluentui/react-tabster": "^9.21.5",
+ "@fluentui/react-theme": "^9.1.19",
+ "@fluentui/react-utilities": "^9.18.10",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-aria": {
+ "version": "9.13.14",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.13.14.tgz",
+ "integrity": "sha512-+RbBh5sTJ9CguPfj9Bw6AUgTC05ts2XqBepNFZ3H51rZMF3PB/YCPftebmySIW6jp1ZbJ10EtQZ/EqJqgJH7YQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-avatar": {
+ "version": "9.6.50",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.50.tgz",
+ "integrity": "sha512-xhgOIm9l/yPsSbMvwWOk1LbylcoYGsWotghgX8Nurgek4wST+xzegIogKr7PHIEid1InMgzHJmwqZxPtYvpFtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-badge": "^9.2.50",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-popover": "^9.9.32",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-tooltip": "^9.5.5",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-badge": {
+ "version": "9.2.50",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.50.tgz",
+ "integrity": "sha512-rMptIUeUWwbTvzSo917GOVDY5nKeNbcSfvtvop54zrFNrcMicAZIfrJK8fB1hFggT2cuaiI9qWdWuSTd+q1LZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-breadcrumb": {
+ "version": "9.0.51",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.0.51.tgz",
+ "integrity": "sha512-MbENUOemhk67clcnrZXXTNITyDqbbO0xWx7dxeaygM/Cu0DmRer9UYs1V5z5ExT+xrwgYXVvPyODqDyeWwGBgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-button": "^9.3.101",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-link": "^9.3.7",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-button": {
+ "version": "9.3.101",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.101.tgz",
+ "integrity": "sha512-FHGtiQW4vNb8M1JvOTEfmzEpwZgc4yMhPPIMprfDELMIkKI1iZWK43tBOaYTb4az3M8m1Vv5UqL+kQoc/1PAyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-card": {
+ "version": "9.0.103",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.103.tgz",
+ "integrity": "sha512-jv8KQMXOYlEaKns8T6a1sQ3lzM/jCL4epR4/7Avt21ysBRrJU+mMZ69nOZA45Wz6eVFootGjks8O7wwjIb2J3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-text": "^9.4.32",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-carousel": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-carousel/-/react-carousel-9.4.6.tgz",
+ "integrity": "sha512-LpVcav9oF0iKiSqmjw9mXUKafvgxhO2snKJjNkoNs46DB15twpA+d+i3HZPYhm4qKMVdHnvbO7d+6iIirbvgvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-button": "^9.3.101",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1",
+ "embla-carousel": "^8.5.1",
+ "embla-carousel-autoplay": "^8.5.1",
+ "embla-carousel-fade": "^8.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-checkbox": {
+ "version": "9.2.47",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.47.tgz",
+ "integrity": "sha512-3XETLtPUpRpztQphWZ4Md/pqkDDcE2CqH0gVAEUb7rnLHfimrRvDC+tlccKmqvlK3QoPfX2oDy3nvz/YwxWoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-label": "^9.1.83",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-combobox": {
+ "version": "9.13.18",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.13.18.tgz",
+ "integrity": "sha512-t1sF+TpC0BGwSxY0FSM4GUUyo+ToLgWNyt80usoOe6j4vIP1N6O2JSaWg5/+24mn+whnsheyDTby5kpmyI1rwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-positioning": "^9.16.3",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-components": {
+ "version": "9.58.2",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.58.2.tgz",
+ "integrity": "sha512-8gikFFqaRKtkh/AjBGk+8Mn0AyR/SM4dt7RVmfaJdE2NKlQVxIfJOLKwpqYhrQS3z4jOSlH5MQFRiFT5Y1hz4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-accordion": "^9.5.14",
+ "@fluentui/react-alert": "9.0.0-beta.124",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-avatar": "^9.6.50",
+ "@fluentui/react-badge": "^9.2.50",
+ "@fluentui/react-breadcrumb": "^9.0.51",
+ "@fluentui/react-button": "^9.3.101",
+ "@fluentui/react-card": "^9.0.103",
+ "@fluentui/react-carousel": "^9.4.6",
+ "@fluentui/react-checkbox": "^9.2.47",
+ "@fluentui/react-combobox": "^9.13.18",
+ "@fluentui/react-dialog": "^9.11.30",
+ "@fluentui/react-divider": "^9.2.82",
+ "@fluentui/react-drawer": "^9.6.10",
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-image": "^9.1.80",
+ "@fluentui/react-infobutton": "9.0.0-beta.102",
+ "@fluentui/react-infolabel": "^9.0.57",
+ "@fluentui/react-input": "^9.4.99",
+ "@fluentui/react-label": "^9.1.83",
+ "@fluentui/react-link": "^9.3.7",
+ "@fluentui/react-list": "^9.0.2",
+ "@fluentui/react-menu": "^9.15.0",
+ "@fluentui/react-message-bar": "^9.3.2",
+ "@fluentui/react-motion": "^9.6.7",
+ "@fluentui/react-overflow": "^9.2.8",
+ "@fluentui/react-persona": "^9.2.109",
+ "@fluentui/react-popover": "^9.9.32",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-positioning": "^9.16.3",
+ "@fluentui/react-progress": "^9.1.97",
+ "@fluentui/react-provider": "^9.19.0",
+ "@fluentui/react-radio": "^9.2.42",
+ "@fluentui/react-rating": "^9.0.28",
+ "@fluentui/react-search": "^9.0.29",
+ "@fluentui/react-select": "^9.1.97",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-skeleton": "^9.1.26",
+ "@fluentui/react-slider": "^9.2.6",
+ "@fluentui/react-spinbutton": "^9.2.98",
+ "@fluentui/react-spinner": "^9.5.7",
+ "@fluentui/react-swatch-picker": "^9.1.20",
+ "@fluentui/react-switch": "^9.1.104",
+ "@fluentui/react-table": "^9.15.29",
+ "@fluentui/react-tabs": "^9.6.7",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-tag-picker": "^9.4.2",
+ "@fluentui/react-tags": "^9.3.30",
+ "@fluentui/react-teaching-popover": "^9.2.3",
+ "@fluentui/react-text": "^9.4.32",
+ "@fluentui/react-textarea": "^9.3.98",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-toast": "^9.3.65",
+ "@fluentui/react-toolbar": "^9.2.17",
+ "@fluentui/react-tooltip": "^9.5.5",
+ "@fluentui/react-tree": "^9.9.2",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@fluentui/react-virtualizer": "9.0.0-alpha.91",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-context-selector": {
+ "version": "9.1.72",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.72.tgz",
+ "integrity": "sha512-n9M7o81fuIzKuvrzdOK9Rcc+SyYg9hkr0bXhdclTHWKBYw2RgIEzXuld1qL3+gOFcSYS6AoNKpqrd9mithWYpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-utilities": "^9.18.20",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0",
+ "scheduler": ">=0.19.0 <=0.23.0"
+ }
+ },
+ "node_modules/@fluentui/react-dialog": {
+ "version": "9.11.30",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.11.30.tgz",
+ "integrity": "sha512-PbK/6GTjWYDLr0J1u5jBPrMYN2lhKJ0zxpHkl+TPULNcRMBSweoEAcRTF2+cdy3aLmyxZrP89viLzTqz5gn+hw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-motion": "^9.6.7",
+ "@fluentui/react-motion-components-preview": "^0.4.3",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-divider": {
+ "version": "9.2.82",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.82.tgz",
+ "integrity": "sha512-U3krzGswRxpFgMkXafkl12+R7R1SeX+JdTZpw8SMnvQsBroEWgy6hq8bWhh8AFUcqCoHIbieBOrRFV68pvIvGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-drawer": {
+ "version": "9.6.10",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.6.10.tgz",
+ "integrity": "sha512-ZxzQnT3IZuz/YSNseNkUmywmn0XEF8VtVd60a9c16F8JaSDH+FQaoSnE8bH+ccy1RggnKKCBQ2JyqmHBClIS3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-dialog": "^9.11.30",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-motion": "^9.6.7",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-field": {
+ "version": "9.1.86",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.86.tgz",
+ "integrity": "sha512-InM4y61PzKp2Y17VdkXYTHKLJhEZLYW0roeBDxMwUbnII059RtC/O30zBIS6n4Cn1+/y1tMZK6NEjTcI1HIVmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-label": "^9.1.83",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-icons": {
+ "version": "2.0.271",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.271.tgz",
+ "integrity": "sha512-I5rFvmZTzf1OQduU5Lal8yNMFcjCsfLnFDEwYjpwTdcyAPoIY2MTZMb4hCbGoohAreQL4cbItkWugxZc7N1wdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@griffel/react": "^1.0.0",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-image": {
+ "version": "9.1.80",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.80.tgz",
+ "integrity": "sha512-Vw6cPJaGSGy9usjXxaK0If9Ow3wo0e2yUIsKRWpWtiX7CTwENGP7N6WYbJFw26gY4AVer/S9bfGlen/gqq3cHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-infobutton": {
+ "version": "9.0.0-beta.102",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.102.tgz",
+ "integrity": "sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-icons": "^2.0.237",
+ "@fluentui/react-jsx-runtime": "^9.0.36",
+ "@fluentui/react-label": "^9.1.68",
+ "@fluentui/react-popover": "^9.9.6",
+ "@fluentui/react-tabster": "^9.21.0",
+ "@fluentui/react-theme": "^9.1.19",
+ "@fluentui/react-utilities": "^9.18.7",
+ "@griffel/react": "^1.5.14",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-infolabel": {
+ "version": "9.0.57",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.0.57.tgz",
+ "integrity": "sha512-jIDJvV1Zzqc6gbD+JWGx2xMmoS9dO0pjMC17tlx1oNpmYe0rBdzu7BJqZrEt+uVt/wFUh39YinrPdhtQdQaXIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-label": "^9.1.83",
+ "@fluentui/react-popover": "^9.9.32",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-input": {
+ "version": "9.4.99",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.99.tgz",
+ "integrity": "sha512-6TEjYtw+PSgkbudNjmAlGgxO5ZQUqrYk0AVlulB202MwKflJ+2A8XcHC5aMuLUI4xRrLWRoYwZTzgxiXa2obsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-jsx-runtime": {
+ "version": "9.0.50",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.50.tgz",
+ "integrity": "sha512-dnelPmz0x591tr58B/jbIHVzgjWskMkBmWEvZJc2rlbGH1oZl+MPJqvVdOAMvLTKJzqVmNkeSDtQmkjzjccogA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-utilities": "^9.18.20",
+ "@swc/helpers": "^0.5.1",
+ "react-is": "^17.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-label": {
+ "version": "9.1.83",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.83.tgz",
+ "integrity": "sha512-XJF78Vwn4sSRJUyWcTj/F6hJVcHlPozDBcGWipMpnFgKBljuVmE2sg581CUGKn4AOTa9/blc81DLv0AE3itNtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-link": {
+ "version": "9.3.7",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.3.7.tgz",
+ "integrity": "sha512-kjl/TjFO66ROFFXL9FExmoTYWgIb/p6pKqXA+eGTaQZ+7S1qTAKma0cTQtjnqAfj7UcimnWLLmXnlWaXx4FixA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-list": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-list/-/react-list-9.0.2.tgz",
+ "integrity": "sha512-bXwwkzayFMwXPldwZSAQWkhQIUJyPoBYKUpDU+e1Z4wHod8mkTspWqoUTZHkL+t2zLMGR7v9c5PqyjSeYVhXYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-checkbox": "^9.2.47",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-menu": {
+ "version": "9.15.0",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.15.0.tgz",
+ "integrity": "sha512-G/WhGTrhQpoa0nbzEEQB8aK4pvtYym2m/sMeN9+fLFVZzAv9hyigzTwaSouQUoMfvIj2bmw5lcfXBKgJ4Rzreg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-positioning": "^9.16.3",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-message-bar": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.3.2.tgz",
+ "integrity": "sha512-mo4/Pon3xJlWgavpeDBrfIijA3niP7D2OCAOZ5RrS5klrX5VkTSH/Zocp6GIUywGpkTDk5DcXHemQ3iiLIIWIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-button": "^9.3.101",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-link": "^9.3.7",
+ "@fluentui/react-motion": "^9.6.7",
+ "@fluentui/react-motion-components-preview": "^0.4.3",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-motion": {
+ "version": "9.6.7",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-motion/-/react-motion-9.6.7.tgz",
+ "integrity": "sha512-xvNsN8n7e7OOMnNK1ynIZcREpoYY+97WuI+qnEiqkwJWKA+WzWYN+ydvH7IFI1PV7wz7qhyXUga5L10CjFeCAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@swc/helpers": "^0.5.1",
+ "react-is": "^17.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-motion-components-preview": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.4.3.tgz",
+ "integrity": "sha512-g6ACukFXcZ8TFYP30WnVjkvRuQkkx2Q48jI7TowTsJBQg01FFT4w22ii5s2ABuO6L1TR02kAL3wvvo5O2KP5Ew==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-motion": "*",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-overflow": {
+ "version": "9.2.8",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.2.8.tgz",
+ "integrity": "sha512-x9RsbQWFv8cgJ8scU6G61IVltliiY/07TT3t1nNtHBJP3tECttphn6EmJHIaKwmCpNzLq8pCYobj8/GxGZ0Kkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/priority-overflow": "^9.1.14",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-persona": {
+ "version": "9.2.109",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.109.tgz",
+ "integrity": "sha512-APEuGmInsWTojToruDJ41cjx0qTvOFAozPe1NC3itS3QIBeaz1YHkj/72QKCfSQHpqa2b5bjK6WN9/bBjIAOjA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-avatar": "^9.6.50",
+ "@fluentui/react-badge": "^9.2.50",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-popover": {
+ "version": "9.9.32",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.9.32.tgz",
+ "integrity": "sha512-8bEjFqWokvk8oB408ZRerGx/+1r+rHB/+KBodBVt8BBlv20Zb4WZbPTN7zt4N1rlkIyFbf4v5otGJCO36PTOGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-positioning": "^9.16.3",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-portal": {
+ "version": "9.4.42",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.4.42.tgz",
+ "integrity": "sha512-x7mH9Y4/ziHKGAL+NnJGJdlH/eqBGpqNRbFLCyAithcpS1TCCROzyTzSxli0f8BcZGy9GMDoxIN9wiHP4wZf/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1",
+ "use-disposable": "^1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-positioning": {
+ "version": "9.16.3",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.16.3.tgz",
+ "integrity": "sha512-z8phNPD0BhREOPsqt4iMsIvzzkBbfuA3TaXwQeLhM0imISWBnctTAaLjDZDQno/Bt/pbEd+qulPV7fagL20tWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/devtools": "0.2.1",
+ "@floating-ui/dom": "^1.6.12",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-progress": {
+ "version": "9.1.97",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.97.tgz",
+ "integrity": "sha512-tVqm64vnFNJJygLHPo+ul3CR2fWo0/mwGdUVkvzyQKi6PMNuSHzRAQjrj09c0S12+vbOxuxgpICBQNYw8xzXUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-provider": {
+ "version": "9.19.0",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.19.0.tgz",
+ "integrity": "sha512-fha+QqD7JW3eo+rLOYvfROOkiSLotH7NnpfJ67EBHIh5JGAn3KyiSJj42RvFTo05LyQGYXME6oQ5yitbDT5YIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/core": "^1.16.0",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-radio": {
+ "version": "9.2.42",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.42.tgz",
+ "integrity": "sha512-Tk84/6THneFTInCoXxLuCR/wGogPX40eScoKzrqD82oTlDmLfgaiWM6hh5VsLSLyhnarINVjkaP6ZFqD8lRfZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-label": "^9.1.83",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-rating": {
+ "version": "9.0.28",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.0.28.tgz",
+ "integrity": "sha512-eEU9NeYDg6qTw/6kev8uvfOs0wG3obwFQ14Aix64dZngaG+t00VuCiCSvAs7GpR6ofRwQljqTzWyylmD8Q4m3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-search": {
+ "version": "9.0.29",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.0.29.tgz",
+ "integrity": "sha512-RJKwdomLYpgj11tyS8aqtb1wfuOesl3ZA/E3q/Uj3eNNu6hqT676cxrOwlWSBUYNCYbZbKhFQcoKXQGqB+FBHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-input": "^9.4.99",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-select": {
+ "version": "9.1.97",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.97.tgz",
+ "integrity": "sha512-tdhakc4UC+jtWHw7/wuYo71zzszukSGdpjl6AYUs0Edxm9LZzJ/zLWEr1y1/OpDZiXnjOcTABzfBc2simRN9VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-shared-contexts": {
+ "version": "9.21.2",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.21.2.tgz",
+ "integrity": "sha512-5hw9CfCmKaEbxmFi+ZF4EZzYWFKrfRLq9pXFIoJWprP1D3ZAds/ymtIOG/CsJzig8zQ1LQ3cNSUzNB75XWg6IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-theme": "^9.1.24",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-skeleton": {
+ "version": "9.1.26",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.1.26.tgz",
+ "integrity": "sha512-vrFaHRF4DuJneAjRSklb27qICVY3yGETQNv0AFS3IRjb8iwS7gWg5aI9Viy9Su7Zg9lIKes4teAafdkjvLUoyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-slider": {
+ "version": "9.2.6",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.2.6.tgz",
+ "integrity": "sha512-YHdoKLeyvImc9DH7waJ8cbmVJ7yJI9arqdw+ZuHXLIJoSa5zBrYf7hUfk/GA3M6BQ+kMcTDEkUyRgy7Db80UBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-spinbutton": {
+ "version": "9.2.98",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.98.tgz",
+ "integrity": "sha512-fJx+a45jTLJs/O5CVum950c8qRLRDirXi+myJHlVF9CyyjXABmosd43WUxa/zQ8H4spSWxKOo4pgUBwST2hYbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-spinner": {
+ "version": "9.5.7",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.5.7.tgz",
+ "integrity": "sha512-DdfQAbdiz50V2DqRSX1MfN6ehw+9etcLysueSeH2n1PnpZ8TVEZYrJzBW608S/bCWrR8OAEVoY/3W/nDjwf8qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-label": "^9.1.83",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-swatch-picker": {
+ "version": "9.1.20",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-swatch-picker/-/react-swatch-picker-9.1.20.tgz",
+ "integrity": "sha512-XJ5OKBSjQyXxTJjkNm9Orfc3ypDUn56Ylbmx2njOa8xxy4TBov/B0x5/mk++qCgYVgh0MUdf8ugpeYuXPabjRA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-switch": {
+ "version": "9.1.104",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.104.tgz",
+ "integrity": "sha512-MKw9hUPLNVSOkQlYr4QHTymU2R7MVwaAFDFRhT6q45POL/YbbJnSBJCtkkPuc5qMQN62RkarMkOTdLhzxJPe6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-label": "^9.1.83",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-table": {
+ "version": "9.15.29",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.15.29.tgz",
+ "integrity": "sha512-z38vjSJGKqRCCtI9oAzyIO2A15Kre5JAlLr73vE+v4n0bbrIvtpfBi5eQ2CbpyCIWBPO5LKTTNupd267rcu4yg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-avatar": "^9.6.50",
+ "@fluentui/react-checkbox": "^9.2.47",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-radio": "^9.2.42",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-tabs": {
+ "version": "9.6.7",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.6.7.tgz",
+ "integrity": "sha512-7EFDetqfGBb8X0aVBSIB6Ab9V9NiBhju3NqlW9zN8nvXovzkhjTtSY6LOxEdWHEl8NFTW8jQsBpiJTcM+oe8zw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-tabster": {
+ "version": "9.23.3",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.23.3.tgz",
+ "integrity": "sha512-sGLePr6QmUbYq/rGkaE6MUTRCFucY5HphKEvWoB8ec32btQmAsMlv9YT5BzJ+YQ2Byc39mm1Uthz/Pw5H+tCpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1",
+ "keyborg": "^2.6.0",
+ "tabster": "^8.2.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-tag-picker": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.4.2.tgz",
+ "integrity": "sha512-etdXfX+ANDY1s30I8X6xrI5XgVZrlvUahmCgagohlUW6YW6fh+7CJm4PGNrfxgUYCLGmqSPZfzTv2Cd3KE9ung==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-combobox": "^9.13.18",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-positioning": "^9.16.3",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-tags": "^9.3.30",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-tags": {
+ "version": "9.3.30",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.3.30.tgz",
+ "integrity": "sha512-EyGhog+wUuPhrMleDe0RpvzZMagsPz8y9xU572CbMbk0B8HKe9NV7I2YoHn9ITQInu2l2c0FPbS+eneqcbO+0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-avatar": "^9.6.50",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-teaching-popover": {
+ "version": "9.2.3",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.2.3.tgz",
+ "integrity": "sha512-bLpdhgbUxkHQMo2F09sSykdcwiKLIf3iorQVMFmkscJKgUpM50s+LwNXl8gz/Lrpl+I++voOqgTRwzzLnqcodA==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-button": "^9.3.101",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-popover": "^9.9.32",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1",
+ "use-sync-external-store": "^1.2.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-text": {
+ "version": "9.4.32",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.32.tgz",
+ "integrity": "sha512-unEqjCSX8MjcW7+ZavEZ2D+JYM8DEpkIlgNb8lF1ye/ACqTQINKFEc9ShAeXIk/1yVNlA02P3pjbHOWL2Vgwhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-textarea": {
+ "version": "9.3.98",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.98.tgz",
+ "integrity": "sha512-dsdASrLG7XgELMB8ddQgHaOU5vN1G+YAgXqFvFXn1IkQZCz439lxnSKyzmMSRhrsg2IPOZNOPiwILj8GOJGgXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-field": "^9.1.86",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-theme": {
+ "version": "9.1.24",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.24.tgz",
+ "integrity": "sha512-OhVKYD7CMYHxzJEn4PtIszledj8hbQJNWBMfIZsp4Sytdp9vCi0txIQUx4BhS1WqtQPhNGCF16eW9Q3NRrnIrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/tokens": "1.0.0-alpha.21",
+ "@swc/helpers": "^0.5.1"
+ }
+ },
+ "node_modules/@fluentui/react-toast": {
+ "version": "9.3.65",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.65.tgz",
+ "integrity": "sha512-rQ3jvvKWjankXpjyrazRtw56pPR7sWF9QF81z7mMdTsIdPpyZTclHJ7tYShk2Qzt0s+WglNO7k4qXw/txemA9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-motion": "^9.6.7",
+ "@fluentui/react-motion-components-preview": "^0.4.3",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-toolbar": {
+ "version": "9.2.17",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.2.17.tgz",
+ "integrity": "sha512-33aNufE6yd2gt1Do7hBbkPSY0HhsmbRZ4SHAG26ddD4IcOlOtF3IY+lLnenEbSKumLD3Juwa6qfm27bgdTCLxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-button": "^9.3.101",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-divider": "^9.2.82",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-radio": "^9.2.42",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-tooltip": {
+ "version": "9.5.5",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.5.5.tgz",
+ "integrity": "sha512-+cA6BRu04LIJEIifnQzL0N0mEkkPOty3LysFklsXSDGKa4kJ1NKgLqbAZivcRPh0pX0Xleq+pCYfB5TI6s7uTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-portal": "^9.4.42",
+ "@fluentui/react-positioning": "^9.16.3",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-tree": {
+ "version": "9.9.2",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.9.2.tgz",
+ "integrity": "sha512-ToIR8rdOJtvHdlBiMWOJ/ERul+prK2dv63VEbvr4HSXZ0uP0bfRQHOtMNRYjYbJcze6UgADMMtVuYCxJga0gZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-aria": "^9.13.14",
+ "@fluentui/react-avatar": "^9.6.50",
+ "@fluentui/react-button": "^9.3.101",
+ "@fluentui/react-checkbox": "^9.2.47",
+ "@fluentui/react-context-selector": "^9.1.72",
+ "@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-motion": "^9.6.7",
+ "@fluentui/react-motion-components-preview": "^0.4.3",
+ "@fluentui/react-radio": "^9.2.42",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-tabster": "^9.23.3",
+ "@fluentui/react-theme": "^9.1.24",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-utilities": {
+ "version": "9.18.20",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.18.20.tgz",
+ "integrity": "sha512-4uIgf4e4yP1HWAQapFQKNN88+L88NqbzXyQPf+NWE9lmP5xRyyMePKRX7i4PcJFdSt7lN4BYvwUxJ7DkQ/Npnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/keyboard-keys": "^9.0.8",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/react-virtualizer": {
+ "version": "9.0.0-alpha.91",
+ "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.91.tgz",
+ "integrity": "sha512-ZbI1D4vT493B7YVuaghOed+IDqpaF+BQjL6RwJEL4fTRdiaD1KOJ30JbmyJlSj+9iTWWrhANhXN/4mQx1tBA9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@fluentui/react-jsx-runtime": "^9.0.50",
+ "@fluentui/react-shared-contexts": "^9.21.2",
+ "@fluentui/react-utilities": "^9.18.20",
+ "@griffel/react": "^1.5.22",
+ "@swc/helpers": "^0.5.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.14.0 <19.0.0",
+ "@types/react-dom": ">=16.9.0 <19.0.0",
+ "react": ">=16.14.0 <19.0.0",
+ "react-dom": ">=16.14.0 <19.0.0"
+ }
+ },
+ "node_modules/@fluentui/tokens": {
+ "version": "1.0.0-alpha.21",
+ "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.21.tgz",
+ "integrity": "sha512-xQ1T56sNgDFGl+kJdIwhz67mHng8vcwO7Dvx5Uja4t+NRULQBgMcJ4reUo4FGF3TjufHj08pP0/OnKQgnOaSVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@swc/helpers": "^0.5.1"
+ }
+ },
+ "node_modules/@griffel/core": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.19.1.tgz",
+ "integrity": "sha512-ZItAAOm8YH1FW0ebzOxS3jwENqd+Dz4CGiPEdgkL4kr7D6mBpjjBbQC6VRXxnA+VqHeEQGy69Ll4M1peY8MX/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "^0.9.0",
+ "@griffel/style-types": "^1.3.0",
+ "csstype": "^3.1.3",
+ "rtl-css-js": "^1.16.1",
+ "stylis": "^4.2.0",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@griffel/react": {
+ "version": "1.5.29",
+ "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.29.tgz",
+ "integrity": "sha512-xKenEIfV2PnLKVsM8yp2ZCUTknh2790937XlI88zDaO9TC8ylG10mZ3MrcgCdSecrVjKq9JKmm24tsODpkh4pw==",
+ "license": "MIT",
+ "dependencies": {
+ "@griffel/core": "^1.19.1",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/@griffel/style-types": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.3.0.tgz",
+ "integrity": "sha512-bHwD3sUE84Xwv4dH011gOKe1jul77M1S6ZFN9Tnq8pvZ48UMdY//vtES6fv7GRS5wXYT4iqxQPBluAiYAfkpmw==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@microsoft/signalr": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-8.0.7.tgz",
+ "integrity": "sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==",
+ "license": "MIT",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "eventsource": "^2.0.2",
+ "fetch-cookie": "^2.0.3",
+ "node-fetch": "^2.6.7",
+ "ws": "^7.4.5"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.21.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.1.tgz",
+ "integrity": "sha512-KeBYSwohb8g4/wCcnksvKTYlg69O62sQeLynn2YE+5z7JWEj95if27kclW9QqbrlsQ2DINI8fjbV3zyuKfwjKg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz",
+ "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz",
+ "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz",
+ "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz",
+ "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz",
+ "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz",
+ "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz",
+ "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz",
+ "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz",
+ "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz",
+ "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz",
+ "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz",
+ "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz",
+ "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz",
+ "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz",
+ "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz",
+ "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz",
+ "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz",
+ "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz",
+ "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/luxon": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz",
+ "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz",
+ "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.5",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz",
+ "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/uuid": {
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
+ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
+ "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/type-utils": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+ "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
+ "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+ "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+ "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+ "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+ "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
+ "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.26.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.14.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001696",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
+ "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+ "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.90",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz",
+ "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/embla-carousel": {
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.5.2.tgz",
+ "integrity": "sha512-xQ9oVLrun/eCG/7ru3R+I5bJ7shsD8fFwLEY7yPe27/+fDHCNj0OT5EoG5ZbFyOxOcG6yTwW8oTz/dWyFnyGpg==",
+ "license": "MIT"
+ },
+ "node_modules/embla-carousel-autoplay": {
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.5.2.tgz",
+ "integrity": "sha512-27emJ0px3q/c0kCHCjwRrEbYcyYUPfGO3g5IBWF1i7714TTzE6L9P81V6PHLoSMAKJ1aHoT2e7YFOsuFKCbyag==",
+ "license": "MIT",
+ "peerDependencies": {
+ "embla-carousel": "8.5.2"
+ }
+ },
+ "node_modules/embla-carousel-fade": {
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/embla-carousel-fade/-/embla-carousel-fade-8.5.2.tgz",
+ "integrity": "sha512-QJ46Xy+mpijjquQeIY0d0sPSy34XduREUnz7tn1K20hcKyZYTONNIXQZu3GGNwG59cvhMqYJMw9ki92Rjd14YA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "embla-carousel": "8.5.2"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.18.tgz",
+ "integrity": "sha512-IRGEoFn3OKalm3hjfolEWGqoF/jPqeEYFp+C8B0WMzwGwBMvlRDQd06kghDhF0C61uJ6WfSDhEZE/sAQjduKgw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz",
+ "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fetch-cookie": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz",
+ "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==",
+ "license": "Unlicense",
+ "dependencies": {
+ "set-cookie-parser": "^2.4.8",
+ "tough-cookie": "^4.0.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz",
+ "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^6.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/html-url-attributes": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
+ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
+ "license": "MIT"
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyborg": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.6.0.tgz",
+ "integrity": "sha512-o5kvLbuTF+o326CMVYpjlaykxqYP9DphFQZ2ZpgrvBouyvOxyEB7oqe8nOLFpiV5VCtz0D3pt8gXQYWpLpBnmA==",
+ "license": "MIT"
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/luxon": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
+ "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz",
+ "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz",
+ "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz",
+ "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz",
+ "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz",
+ "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
+ "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "license": "MIT"
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-dom/node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "license": "MIT"
+ },
+ "node_modules/react-markdown": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.3.tgz",
+ "integrity": "sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.28.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.2.tgz",
+ "integrity": "sha512-BgFY7+wEGVjHCiqaj2XiUBQ1kkzfg6UoKYwEe0wv+FF+HNPCxtS/MVPvLAPH++EsuCMReZl9RYVGqcHLk5ms3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.21.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.28.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.2.tgz",
+ "integrity": "sha512-O81EWqNJWqvlN/a7eTudAdQm0TbI7hw+WIi7OwwMcTn5JMyZ0ibTFNGz+t+Lju0df4LcqowCegcrK22lB1q9Kw==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.21.1",
+ "react-router": "6.28.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "license": "MIT"
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz",
+ "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz",
+ "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-supersub": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/remark-supersub/-/remark-supersub-1.0.0.tgz",
+ "integrity": "sha512-3SYsphMqpAWbr8AZozdcypozinl/lly3e7BEwPG3YT5J9uZQaDcELBF6/sr/OZoAlFxy2nhNFWSrZBu/ZPRT3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "unist-util-visit": "^4.0.0"
+ }
+ },
+ "node_modules/remark-supersub/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/remark-supersub/node_modules/unist-util-is": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
+ "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-supersub/node_modules/unist-util-visit": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
+ "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^5.0.0",
+ "unist-util-visit-parents": "^5.1.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-supersub/node_modules/unist-util-visit-parents": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
+ "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.32.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz",
+ "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.32.1",
+ "@rollup/rollup-android-arm64": "4.32.1",
+ "@rollup/rollup-darwin-arm64": "4.32.1",
+ "@rollup/rollup-darwin-x64": "4.32.1",
+ "@rollup/rollup-freebsd-arm64": "4.32.1",
+ "@rollup/rollup-freebsd-x64": "4.32.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.32.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.32.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.32.1",
+ "@rollup/rollup-linux-arm64-musl": "4.32.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.32.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.32.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.32.1",
+ "@rollup/rollup-linux-x64-gnu": "4.32.1",
+ "@rollup/rollup-linux-x64-musl": "4.32.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.32.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.32.1",
+ "@rollup/rollup-win32-x64-msvc": "4.32.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rtl-css-js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz",
+ "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.1.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz",
+ "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
+ "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.4"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.5.tgz",
+ "integrity": "sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==",
+ "license": "MIT"
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tabster": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/tabster/-/tabster-8.3.0.tgz",
+ "integrity": "sha512-Y1IKWVe0Xk1P8WLSL+Wj+1jkov69OLST6crAG86ye35WM4mLhr/IeW7vIF+8oQKLNPf0FQ7F1lg5cmXUAQeSdA==",
+ "license": "MIT",
+ "dependencies": {
+ "keyborg": "2.6.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
+ "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/use-disposable": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/use-disposable/-/use-disposable-1.0.4.tgz",
+ "integrity": "sha512-j83t6AMLWUyb5zwlTDqf6dP9LezM9R0yTbI/b6olmdaGtCKQUe9pgJWV6dRaaQLcozypjIEp4EmZr2DkZGKLSg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": ">=16.8.0 <19.0.0",
+ "@types/react-dom": ">=16.8.0 <19.0.0",
+ "react": ">=16.8.0 <19.0.0",
+ "react-dom": ">=16.8.0 <19.0.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz",
+ "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.14",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz",
+ "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/samples/support-center/src/frontend/package.json b/samples/support-center/SupportCenter.Frontend/package.json
similarity index 100%
rename from samples/support-center/src/frontend/package.json
rename to samples/support-center/SupportCenter.Frontend/package.json
diff --git a/samples/support-center/src/frontend/src/App.css b/samples/support-center/SupportCenter.Frontend/src/App.css
similarity index 100%
rename from samples/support-center/src/frontend/src/App.css
rename to samples/support-center/SupportCenter.Frontend/src/App.css
diff --git a/samples/support-center/src/frontend/src/App.tsx b/samples/support-center/SupportCenter.Frontend/src/App.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/App.tsx
rename to samples/support-center/SupportCenter.Frontend/src/App.tsx
diff --git a/samples/support-center/src/frontend/src/components/Login/Login.css b/samples/support-center/SupportCenter.Frontend/src/components/Login/Login.css
similarity index 100%
rename from samples/support-center/src/frontend/src/components/Login/Login.css
rename to samples/support-center/SupportCenter.Frontend/src/components/Login/Login.css
diff --git a/samples/support-center/src/frontend/src/components/Login/Login.tsx b/samples/support-center/SupportCenter.Frontend/src/components/Login/Login.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/components/Login/Login.tsx
rename to samples/support-center/SupportCenter.Frontend/src/components/Login/Login.tsx
diff --git a/samples/support-center/src/frontend/src/components/NavBar/NavBar.tsx b/samples/support-center/SupportCenter.Frontend/src/components/NavBar/NavBar.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/components/NavBar/NavBar.tsx
rename to samples/support-center/SupportCenter.Frontend/src/components/NavBar/NavBar.tsx
diff --git a/samples/support-center/src/frontend/src/components/WelcomeHints/WelcomeHints.css b/samples/support-center/SupportCenter.Frontend/src/components/WelcomeHints/WelcomeHints.css
similarity index 100%
rename from samples/support-center/src/frontend/src/components/WelcomeHints/WelcomeHints.css
rename to samples/support-center/SupportCenter.Frontend/src/components/WelcomeHints/WelcomeHints.css
diff --git a/samples/support-center/src/frontend/src/components/WelcomeHints/WelcomeHints.tsx b/samples/support-center/SupportCenter.Frontend/src/components/WelcomeHints/WelcomeHints.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/components/WelcomeHints/WelcomeHints.tsx
rename to samples/support-center/SupportCenter.Frontend/src/components/WelcomeHints/WelcomeHints.tsx
diff --git a/samples/support-center/src/frontend/src/index.css b/samples/support-center/SupportCenter.Frontend/src/index.css
similarity index 100%
rename from samples/support-center/src/frontend/src/index.css
rename to samples/support-center/SupportCenter.Frontend/src/index.css
diff --git a/samples/support-center/src/frontend/src/main.tsx b/samples/support-center/SupportCenter.Frontend/src/main.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/main.tsx
rename to samples/support-center/SupportCenter.Frontend/src/main.tsx
diff --git a/samples/support-center/src/frontend/src/models/Citation.ts b/samples/support-center/SupportCenter.Frontend/src/models/Citation.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/models/Citation.ts
rename to samples/support-center/SupportCenter.Frontend/src/models/Citation.ts
diff --git a/samples/support-center/src/frontend/src/models/Configuration.ts b/samples/support-center/SupportCenter.Frontend/src/models/Configuration.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/models/Configuration.ts
rename to samples/support-center/SupportCenter.Frontend/src/models/Configuration.ts
diff --git a/samples/support-center/src/frontend/src/models/Conversation.ts b/samples/support-center/SupportCenter.Frontend/src/models/Conversation.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/models/Conversation.ts
rename to samples/support-center/SupportCenter.Frontend/src/models/Conversation.ts
diff --git a/samples/support-center/src/frontend/src/models/Knowledge.ts b/samples/support-center/SupportCenter.Frontend/src/models/Knowledge.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/models/Knowledge.ts
rename to samples/support-center/SupportCenter.Frontend/src/models/Knowledge.ts
diff --git a/samples/support-center/src/frontend/src/models/KnowledgeDocument.ts b/samples/support-center/SupportCenter.Frontend/src/models/KnowledgeDocument.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/models/KnowledgeDocument.ts
rename to samples/support-center/SupportCenter.Frontend/src/models/KnowledgeDocument.ts
diff --git a/samples/support-center/src/frontend/src/models/Message.tsx b/samples/support-center/SupportCenter.Frontend/src/models/Message.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/models/Message.tsx
rename to samples/support-center/SupportCenter.Frontend/src/models/Message.tsx
diff --git a/samples/support-center/src/frontend/src/pages/PageStyles.ts b/samples/support-center/SupportCenter.Frontend/src/pages/PageStyles.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/PageStyles.ts
rename to samples/support-center/SupportCenter.Frontend/src/pages/PageStyles.ts
diff --git a/samples/support-center/src/frontend/src/pages/chat/ChatPage.tsx b/samples/support-center/SupportCenter.Frontend/src/pages/chat/ChatPage.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/ChatPage.tsx
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/ChatPage.tsx
diff --git a/samples/support-center/src/frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.css b/samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.css
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.css
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.css
diff --git a/samples/support-center/src/frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.tsx b/samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.tsx
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatHistoryList/ChatHistoryList.tsx
diff --git a/samples/support-center/src/frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.css b/samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.css
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.css
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.css
diff --git a/samples/support-center/src/frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.tsx b/samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.tsx
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatInputBox/ChatInputBox.tsx
diff --git a/samples/support-center/src/frontend/src/pages/chat/components/ChatMessage/ChatMessage.css b/samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatMessage/ChatMessage.css
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/components/ChatMessage/ChatMessage.css
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatMessage/ChatMessage.css
diff --git a/samples/support-center/src/frontend/src/pages/chat/components/ChatMessage/ChatMessage.tsx b/samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatMessage/ChatMessage.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/components/ChatMessage/ChatMessage.tsx
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatMessage/ChatMessage.tsx
diff --git a/samples/support-center/src/frontend/src/pages/chat/components/ChatMessage/MessageParser.tsx b/samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatMessage/MessageParser.tsx
similarity index 100%
rename from samples/support-center/src/frontend/src/pages/chat/components/ChatMessage/MessageParser.tsx
rename to samples/support-center/SupportCenter.Frontend/src/pages/chat/components/ChatMessage/MessageParser.tsx
diff --git a/samples/support-center/src/frontend/src/services/ChatService.ts b/samples/support-center/SupportCenter.Frontend/src/services/ChatService.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/services/ChatService.ts
rename to samples/support-center/SupportCenter.Frontend/src/services/ChatService.ts
diff --git a/samples/support-center/src/frontend/src/states/AppContext.ts b/samples/support-center/SupportCenter.Frontend/src/states/AppContext.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/states/AppContext.ts
rename to samples/support-center/SupportCenter.Frontend/src/states/AppContext.ts
diff --git a/samples/support-center/src/frontend/src/states/ChatContext.ts b/samples/support-center/SupportCenter.Frontend/src/states/ChatContext.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/states/ChatContext.ts
rename to samples/support-center/SupportCenter.Frontend/src/states/ChatContext.ts
diff --git a/samples/support-center/src/frontend/src/vite-env.d.ts b/samples/support-center/SupportCenter.Frontend/src/vite-env.d.ts
similarity index 100%
rename from samples/support-center/src/frontend/src/vite-env.d.ts
rename to samples/support-center/SupportCenter.Frontend/src/vite-env.d.ts
diff --git a/samples/support-center/src/frontend/tsconfig.json b/samples/support-center/SupportCenter.Frontend/tsconfig.json
similarity index 100%
rename from samples/support-center/src/frontend/tsconfig.json
rename to samples/support-center/SupportCenter.Frontend/tsconfig.json
diff --git a/samples/support-center/src/frontend/tsconfig.node.json b/samples/support-center/SupportCenter.Frontend/tsconfig.node.json
similarity index 100%
rename from samples/support-center/src/frontend/tsconfig.node.json
rename to samples/support-center/SupportCenter.Frontend/tsconfig.node.json
diff --git a/samples/support-center/SupportCenter.Frontend/vite.config.ts b/samples/support-center/SupportCenter.Frontend/vite.config.ts
new file mode 100644
index 00000000..35b4ff34
--- /dev/null
+++ b/samples/support-center/SupportCenter.Frontend/vite.config.ts
@@ -0,0 +1,22 @@
+import react from '@vitejs/plugin-react';
+import { defineConfig, loadEnv } from 'vite';
+
+// https://vitejs.dev/config/
+
+export default defineConfig(({ mode }) => {
+ const env = loadEnv(mode, process.cwd(), '');
+
+ return {
+ plugins: [react()],
+ server: {
+ port: parseInt(env.VITE_PORT),
+ host: '0.0.0.0'
+ },
+ build: {
+ outDir: 'dist',
+ rollupOptions: {
+ input: './index.html'
+ }
+ }
+ }
+})
\ No newline at end of file
diff --git a/samples/support-center/seed-memory/Benefit_Options.pdf b/samples/support-center/SupportCenter.Seed.Memory/Benefit_Options.pdf
similarity index 100%
rename from samples/support-center/seed-memory/Benefit_Options.pdf
rename to samples/support-center/SupportCenter.Seed.Memory/Benefit_Options.pdf
diff --git a/samples/support-center/seed-memory/Dockerfile b/samples/support-center/SupportCenter.Seed.Memory/Dockerfile
similarity index 100%
rename from samples/support-center/seed-memory/Dockerfile
rename to samples/support-center/SupportCenter.Seed.Memory/Dockerfile
diff --git a/samples/support-center/seed-memory/Northwind_Health_Plus_Benefits_Details.pdf b/samples/support-center/SupportCenter.Seed.Memory/Northwind_Health_Plus_Benefits_Details.pdf
similarity index 100%
rename from samples/support-center/seed-memory/Northwind_Health_Plus_Benefits_Details.pdf
rename to samples/support-center/SupportCenter.Seed.Memory/Northwind_Health_Plus_Benefits_Details.pdf
diff --git a/samples/support-center/seed-memory/Northwind_Standard_Benefits_Details.pdf b/samples/support-center/SupportCenter.Seed.Memory/Northwind_Standard_Benefits_Details.pdf
similarity index 100%
rename from samples/support-center/seed-memory/Northwind_Standard_Benefits_Details.pdf
rename to samples/support-center/SupportCenter.Seed.Memory/Northwind_Standard_Benefits_Details.pdf
diff --git a/samples/support-center/seed-memory/PerksPlus.pdf b/samples/support-center/SupportCenter.Seed.Memory/PerksPlus.pdf
similarity index 100%
rename from samples/support-center/seed-memory/PerksPlus.pdf
rename to samples/support-center/SupportCenter.Seed.Memory/PerksPlus.pdf
diff --git a/samples/support-center/SupportCenter.Seed.Memory/Program.cs b/samples/support-center/SupportCenter.Seed.Memory/Program.cs
new file mode 100644
index 00000000..c3e3b7ee
--- /dev/null
+++ b/samples/support-center/SupportCenter.Seed.Memory/Program.cs
@@ -0,0 +1,72 @@
+using Microsoft.Extensions.AI;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.VectorData;
+using Microsoft.SemanticKernel.Connectors.Redis;
+using SupportCenter.Shared;
+using OpenAI;
+using StackExchange.Redis;
+using System.Reflection;
+using UglyToad.PdfPig;
+using UglyToad.PdfPig.DocumentLayoutAnalysis.TextExtractor;
+
+string[] files = [
+ "Benefit_Options.pdf",
+ "employee_handbook.pdf",
+ "Northwind_Health_Plus_Benefits_Details.pdf",
+ "Northwind_Standard_Benefits_Details.pdf",
+ "role_library.pdf"
+];
+
+HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
+
+builder.AddAzureOpenAIClient("openAiConnection");
+builder.AddRedisClient("redis");
+builder.Services.AddSingleton(sp => {
+ var db = sp.GetRequiredService().GetDatabase();
+ return new RedisVectorStore(db, new() { StorageType = RedisStorageType.HashSet });
+});
+
+builder.Services.AddEmbeddingGenerator(s => {
+ return s.GetRequiredService().AsEmbeddingGenerator("text-embedding-3-large");
+});
+
+using IHost host = builder.Build();
+
+foreach (var file in files)
+{
+ await ImportDocumentAsync(host.Services, file);
+}
+
+await host.RunAsync();
+
+
+static async Task ImportDocumentAsync(IServiceProvider hostProvider, string filename)
+{
+ using IServiceScope serviceScope = hostProvider.CreateScope();
+ var provider = serviceScope.ServiceProvider;
+ var vectorStore = provider.GetRequiredService();
+ var embeddingGenerator = provider.GetRequiredService>>();
+
+ var currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
+ ?? throw new InvalidOperationException("Current directory cannot be determined.");
+ var filePath = Path.Combine(currentDirectory, filename);
+ using var pdfDocument = PdfDocument.Open(File.OpenRead(filePath));
+ var pages = pdfDocument.GetPages();
+ var collection = vectorStore.GetCollection("qna");
+ await collection.CreateCollectionIfNotExistsAsync();
+ foreach (var page in pages)
+ {
+ try
+ {
+ var text = ContentOrderTextExtractor.GetText(page);
+ var descr = new string([.. text.Take(100)]);
+ var vector = await embeddingGenerator.GenerateEmbeddingVectorAsync(text);
+ await collection.UpsertAsync(new Document { Key = $"{Guid.NewGuid()}", Description = $"Document: {descr}", Text = text, Vector = vector });
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"Error processing page: {ex.Message}");
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/support-center/seed-invoice-memory/README.md b/samples/support-center/SupportCenter.Seed.Memory/README.md
similarity index 100%
rename from samples/support-center/seed-invoice-memory/README.md
rename to samples/support-center/SupportCenter.Seed.Memory/README.md
diff --git a/samples/support-center/seed-memory/seed-memory.csproj b/samples/support-center/SupportCenter.Seed.Memory/SupportCenter.Seed.Memory.csproj
similarity index 61%
rename from samples/support-center/seed-memory/seed-memory.csproj
rename to samples/support-center/SupportCenter.Seed.Memory/SupportCenter.Seed.Memory.csproj
index a4c6cf3a..ee22dc19 100644
--- a/samples/support-center/seed-memory/seed-memory.csproj
+++ b/samples/support-center/SupportCenter.Seed.Memory/SupportCenter.Seed.Memory.csproj
@@ -1,25 +1,32 @@
-
+
Exe
- net8.0
+ net9.0
waf_import
enable
enable
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/support-center/seed-memory/config/KernelSettings.cs b/samples/support-center/SupportCenter.Seed.Memory/config/KernelSettings.cs
similarity index 100%
rename from samples/support-center/seed-memory/config/KernelSettings.cs
rename to samples/support-center/SupportCenter.Seed.Memory/config/KernelSettings.cs
diff --git a/samples/support-center/seed-memory/config/appsettings.template.json b/samples/support-center/SupportCenter.Seed.Memory/config/appsettings.template.json
similarity index 100%
rename from samples/support-center/seed-memory/config/appsettings.template.json
rename to samples/support-center/SupportCenter.Seed.Memory/config/appsettings.template.json
diff --git a/samples/support-center/seed-memory/employee_handbook.pdf b/samples/support-center/SupportCenter.Seed.Memory/employee_handbook.pdf
similarity index 100%
rename from samples/support-center/seed-memory/employee_handbook.pdf
rename to samples/support-center/SupportCenter.Seed.Memory/employee_handbook.pdf
diff --git a/samples/support-center/seed-memory/role_library.pdf b/samples/support-center/SupportCenter.Seed.Memory/role_library.pdf
similarity index 100%
rename from samples/support-center/seed-memory/role_library.pdf
rename to samples/support-center/SupportCenter.Seed.Memory/role_library.pdf
diff --git a/samples/support-center/SupportCenter.ServiceDefaults/Extensions.cs b/samples/support-center/SupportCenter.ServiceDefaults/Extensions.cs
new file mode 100644
index 00000000..cbae381b
--- /dev/null
+++ b/samples/support-center/SupportCenter.ServiceDefaults/Extensions.cs
@@ -0,0 +1,124 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Diagnostics.HealthChecks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Diagnostics.HealthChecks;
+using Microsoft.Extensions.Logging;
+using OpenTelemetry;
+using OpenTelemetry.Metrics;
+using OpenTelemetry.Trace;
+using Azure.Monitor.OpenTelemetry.AspNetCore;
+
+namespace Microsoft.Extensions.Hosting;
+
+// Adds common .NET Aspire services: service discovery, resilience, health checks, and OpenTelemetry.
+// This project should be referenced by each service project in your solution.
+// To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults
+public static class Extensions
+{
+ public static TBuilder AddServiceDefaults(this TBuilder builder) where TBuilder : IHostApplicationBuilder
+ {
+ builder.ConfigureOpenTelemetry();
+
+ builder.AddDefaultHealthChecks();
+
+ builder.Services.AddServiceDiscovery();
+
+ builder.Services.ConfigureHttpClientDefaults(http =>
+ {
+ // Turn on resilience by default
+ http.AddStandardResilienceHandler();
+
+ // Turn on service discovery by default
+ http.AddServiceDiscovery();
+ });
+
+ // Uncomment the following to restrict the allowed schemes for service discovery.
+ // builder.Services.Configure(options =>
+ // {
+ // options.AllowedSchemes = ["https"];
+ // });
+
+ return builder;
+ }
+
+ public static TBuilder ConfigureOpenTelemetry(this TBuilder builder) where TBuilder : IHostApplicationBuilder
+ {
+ builder.Logging.AddOpenTelemetry(logging =>
+ {
+ logging.IncludeFormattedMessage = true;
+ logging.IncludeScopes = true;
+ });
+
+ builder.Services.AddOpenTelemetry()
+ .WithMetrics(metrics =>
+ {
+ metrics.AddAspNetCoreInstrumentation()
+ .AddHttpClientInstrumentation()
+ .AddRuntimeInstrumentation()
+ .AddMeter("Microsoft.Orleans");
+ })
+ .WithTracing(tracing =>
+ {
+ tracing.AddSource("Microsoft.Orleans.Runtime");
+ tracing.AddSource("Microsoft.Orleans.Application");
+ tracing.AddSource("Experimental.Microsoft.Extensions.AI*");
+
+ tracing.AddSource(builder.Environment.ApplicationName)
+ .AddAspNetCoreInstrumentation()
+ // Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
+ //.AddGrpcClientInstrumentation()
+ .AddHttpClientInstrumentation();
+ });
+
+ builder.AddOpenTelemetryExporters();
+
+ return builder;
+ }
+
+ private static TBuilder AddOpenTelemetryExporters(this TBuilder builder) where TBuilder : IHostApplicationBuilder
+ {
+ var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
+
+ if (useOtlpExporter)
+ {
+ builder.Services.AddOpenTelemetry().UseOtlpExporter();
+ }
+
+ //Uncomment the following lines to enable the Azure Monitor exporter(requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
+ if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
+ {
+ builder.Services.AddOpenTelemetry()
+ .UseAzureMonitor();
+ }
+
+ return builder;
+ }
+
+ public static TBuilder AddDefaultHealthChecks(this TBuilder builder) where TBuilder : IHostApplicationBuilder
+ {
+ builder.Services.AddHealthChecks()
+ // Add a default liveness check to ensure app is responsive
+ .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
+
+ return builder;
+ }
+
+ public static WebApplication MapDefaultEndpoints(this WebApplication app)
+ {
+ // Adding health checks endpoints to applications in non-development environments has security implications.
+ // See https://aka.ms/dotnet/aspire/healthchecks for details before enabling these endpoints in non-development environments.
+ if (app.Environment.IsDevelopment())
+ {
+ // All health checks must pass for app to be considered ready to accept traffic after starting
+ app.MapHealthChecks("/health");
+
+ // Only health checks tagged with the "live" tag must pass for app to be considered alive
+ app.MapHealthChecks("/alive", new HealthCheckOptions
+ {
+ Predicate = r => r.Tags.Contains("live")
+ });
+ }
+
+ return app;
+ }
+}
diff --git a/samples/support-center/SupportCenter.ServiceDefaults/SupportCenter.ServiceDefaults.csproj b/samples/support-center/SupportCenter.ServiceDefaults/SupportCenter.ServiceDefaults.csproj
new file mode 100644
index 00000000..1d426301
--- /dev/null
+++ b/samples/support-center/SupportCenter.ServiceDefaults/SupportCenter.ServiceDefaults.csproj
@@ -0,0 +1,23 @@
+
+
+
+ net9.0
+ enable
+ enable
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/support-center/SupportCenter.Shared/Document.cs b/samples/support-center/SupportCenter.Shared/Document.cs
new file mode 100644
index 00000000..f3792779
--- /dev/null
+++ b/samples/support-center/SupportCenter.Shared/Document.cs
@@ -0,0 +1,18 @@
+using Microsoft.Extensions.VectorData;
+
+namespace SupportCenter.Shared;
+
+public class Document
+{
+ [VectorStoreRecordKey]
+ public string Key { get; set; }
+
+ [VectorStoreRecordData]
+ public string Description { get; set; }
+
+ [VectorStoreRecordData]
+ public string Text { get; set; }
+
+ [VectorStoreRecordVector(3072)]
+ public ReadOnlyMemory Vector { get; set; }
+}
diff --git a/samples/support-center/SupportCenter.Shared/SupportCenter.Shared.csproj b/samples/support-center/SupportCenter.Shared/SupportCenter.Shared.csproj
new file mode 100644
index 00000000..5d16ff34
--- /dev/null
+++ b/samples/support-center/SupportCenter.Shared/SupportCenter.Shared.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/support-center/azure.yaml b/samples/support-center/azure.yaml
index ef0e19df..b9840197 100644
--- a/samples/support-center/azure.yaml
+++ b/samples/support-center/azure.yaml
@@ -1,29 +1,23 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json
-name: ai-support-center
-metadata:
- template: azd-init@1.8.2
-hooks:
- postprovision:
- interactive: false
- shell: sh
- run: infra/azd-hooks/load-envs.sh
-infra:
- provider: bicep
- path: infra
- module: main
-services:
- backend:
- project: src/backend
- host: containerapp
- language: dotnet
- docker:
- path: Dockerfile
- context: ../../../../
- frontend:
- project: src/frontend
- host: containerapp
- language: ts
- dist: build
- docker:
- path: Dockerfile
+name: support-center
+services:
+ app:
+ language: dotnet
+ project: ./SupportCenter.AppHost/SupportCenter.AppHost.csproj
+ host: containerapp
+hooks:
+ predeploy:
+ windows:
+ shell: pwsh
+ run: 'echo "VITE_OAGENT_BASE_URL=https://apiservice.$env:AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN" > ./SupportCenter.Frontend/.env.azureConfig'
+ posix:
+ shell: sh
+ run: 'echo "VITE_OAGENT_BASE_URL=https://apiservice.$AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN" > ./SupportCenter.Frontend/.env.azureConfig'
+ postdeploy:
+ windows:
+ shell: pwsh
+ run: 'rm ./SupportCenter.Frontend/.env.azureConfig'
+ posix:
+ shell: sh
+ run: 'rm ./SupportCenter.Frontend/.env.azureConfig'
diff --git a/samples/support-center/infra/abbreviations.json b/samples/support-center/infra/abbreviations.json
deleted file mode 100644
index efc610d8..00000000
--- a/samples/support-center/infra/abbreviations.json
+++ /dev/null
@@ -1,135 +0,0 @@
-{
- "analysisServicesServers": "as",
- "apiManagementService": "apim-",
- "appConfigurationStores": "appcs-",
- "appManagedEnvironments": "cae-",
- "appContainerApps": "ca-",
- "authorizationPolicyDefinitions": "policy-",
- "automationAutomationAccounts": "aa-",
- "blueprintBlueprints": "bp-",
- "blueprintBlueprintsArtifacts": "bpa-",
- "cacheRedis": "redis-",
- "cdnProfiles": "cdnp-",
- "cdnProfilesEndpoints": "cdne-",
- "cognitiveServicesAccounts": "cog-",
- "cognitiveServicesFormRecognizer": "cog-fr-",
- "cognitiveServicesTextAnalytics": "cog-ta-",
- "computeAvailabilitySets": "avail-",
- "computeCloudServices": "cld-",
- "computeDiskEncryptionSets": "des",
- "computeDisks": "disk",
- "computeDisksOs": "osdisk",
- "computeGalleries": "gal",
- "computeSnapshots": "snap-",
- "computeVirtualMachines": "vm",
- "computeVirtualMachineScaleSets": "vmss-",
- "containerInstanceContainerGroups": "ci",
- "containerRegistryRegistries": "cr",
- "containerServiceManagedClusters": "aks-",
- "databricksWorkspaces": "dbw-",
- "dataFactoryFactories": "adf-",
- "dataLakeAnalyticsAccounts": "dla",
- "dataLakeStoreAccounts": "dls",
- "dataMigrationServices": "dms-",
- "dBforMySQLServers": "mysql-",
- "dBforPostgreSQLServers": "psql-",
- "devicesIotHubs": "iot-",
- "devicesProvisioningServices": "provs-",
- "devicesProvisioningServicesCertificates": "pcert-",
- "documentDBDatabaseAccounts": "cosmos-",
- "eventGridDomains": "evgd-",
- "eventGridDomainsTopics": "evgt-",
- "eventGridEventSubscriptions": "evgs-",
- "eventHubNamespaces": "evhns-",
- "eventHubNamespacesEventHubs": "evh-",
- "hdInsightClustersHadoop": "hadoop-",
- "hdInsightClustersHbase": "hbase-",
- "hdInsightClustersKafka": "kafka-",
- "hdInsightClustersMl": "mls-",
- "hdInsightClustersSpark": "spark-",
- "hdInsightClustersStorm": "storm-",
- "hybridComputeMachines": "arcs-",
- "insightsActionGroups": "ag-",
- "insightsComponents": "appi-",
- "keyVaultVaults": "kv-",
- "kubernetesConnectedClusters": "arck",
- "kustoClusters": "dec",
- "kustoClustersDatabases": "dedb",
- "logicIntegrationAccounts": "ia-",
- "logicWorkflows": "logic-",
- "machineLearningServicesWorkspaces": "mlw-",
- "managedIdentityUserAssignedIdentities": "id-",
- "managementManagementGroups": "mg-",
- "migrateAssessmentProjects": "migr-",
- "networkApplicationGateways": "agw-",
- "networkApplicationSecurityGroups": "asg-",
- "networkAzureFirewalls": "afw-",
- "networkBastionHosts": "bas-",
- "networkConnections": "con-",
- "networkDnsZones": "dnsz-",
- "networkExpressRouteCircuits": "erc-",
- "networkFirewallPolicies": "afwp-",
- "networkFirewallPoliciesWebApplication": "waf",
- "networkFirewallPoliciesRuleGroups": "wafrg",
- "networkFrontDoors": "fd-",
- "networkFrontdoorWebApplicationFirewallPolicies": "fdfp-",
- "networkLoadBalancersExternal": "lbe-",
- "networkLoadBalancersInternal": "lbi-",
- "networkLoadBalancersInboundNatRules": "rule-",
- "networkLocalNetworkGateways": "lgw-",
- "networkNatGateways": "ng-",
- "networkNetworkInterfaces": "nic-",
- "networkNetworkSecurityGroups": "nsg-",
- "networkNetworkSecurityGroupsSecurityRules": "nsgsr-",
- "networkNetworkWatchers": "nw-",
- "networkPrivateDnsZones": "pdnsz-",
- "networkPrivateLinkServices": "pl-",
- "networkPublicIPAddresses": "pip-",
- "networkPublicIPPrefixes": "ippre-",
- "networkRouteFilters": "rf-",
- "networkRouteTables": "rt-",
- "networkRouteTablesRoutes": "udr-",
- "networkTrafficManagerProfiles": "traf-",
- "networkVirtualNetworkGateways": "vgw-",
- "networkVirtualNetworks": "vnet-",
- "networkVirtualNetworksSubnets": "snet-",
- "networkVirtualNetworksVirtualNetworkPeerings": "peer-",
- "networkVirtualWans": "vwan-",
- "networkVpnGateways": "vpng-",
- "networkVpnGatewaysVpnConnections": "vcn-",
- "networkVpnGatewaysVpnSites": "vst-",
- "notificationHubsNamespaces": "ntfns-",
- "notificationHubsNamespacesNotificationHubs": "ntf-",
- "operationalInsightsWorkspaces": "log-",
- "portalDashboards": "dash-",
- "powerBIDedicatedCapacities": "pbi-",
- "purviewAccounts": "pview-",
- "recoveryServicesVaults": "rsv-",
- "resourcesResourceGroups": "rg-",
- "searchSearchServices": "srch-",
- "serviceBusNamespaces": "sb-",
- "serviceBusNamespacesQueues": "sbq-",
- "serviceBusNamespacesTopics": "sbt-",
- "serviceEndPointPolicies": "se-",
- "serviceFabricClusters": "sf-",
- "signalRServiceSignalR": "sigr",
- "sqlManagedInstances": "sqlmi-",
- "sqlServers": "sql-",
- "sqlServersDataWarehouse": "sqldw-",
- "sqlServersDatabases": "sqldb-",
- "sqlServersDatabasesStretch": "sqlstrdb-",
- "storageStorageAccounts": "st",
- "storageStorageAccountsVm": "stvm",
- "storSimpleManagers": "ssimp",
- "streamAnalyticsCluster": "asa-",
- "synapseWorkspaces": "syn",
- "synapseWorkspacesAnalyticsWorkspaces": "synw",
- "synapseWorkspacesSqlPoolsDedicated": "syndp",
- "synapseWorkspacesSqlPoolsSpark": "synsp",
- "timeSeriesInsightsEnvironments": "tsi-",
- "webServerFarms": "plan-",
- "webSitesAppService": "app-",
- "webSitesAppServiceEnvironment": "ase-",
- "webSitesFunctions": "func-",
- "webStaticSites": "stapp-"
-}
\ No newline at end of file
diff --git a/samples/support-center/infra/app/backend.bicep b/samples/support-center/infra/app/backend.bicep
deleted file mode 100644
index 8f36a473..00000000
--- a/samples/support-center/infra/app/backend.bicep
+++ /dev/null
@@ -1,133 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param identityName string
-param containerRegistryName string
-param containerAppsEnvironmentName string
-param applicationInsightsName string
-param allowedOrigins array
-param exists bool
-@secure()
-param appDefinition object
-
-var appSettingsArray = filter(array(appDefinition.settings), i => i.name != '')
-var secrets = map(filter(appSettingsArray, i => i.?secret != null), i => {
- name: i.name
- value: i.value
- secretRef: i.?secretRef ?? take(replace(replace(toLower(i.name), '_', '-'), '.', '-'), 32)
-})
-var env = map(filter(appSettingsArray, i => i.?secret == null), i => {
- name: i.name
- value: i.value
-})
-
-resource identity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
- name: identityName
- location: location
-}
-
-resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' existing = {
- name: containerRegistryName
-}
-
-resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2023-05-01' existing = {
- name: containerAppsEnvironmentName
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
- name: applicationInsightsName
-}
-
-resource acrPullRole 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
- scope: containerRegistry
- name: guid(subscription().id, resourceGroup().id, identity.id, 'acrPullRole')
- properties: {
- roleDefinitionId: subscriptionResourceId(
- 'Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d')
- principalType: 'ServicePrincipal'
- principalId: identity.properties.principalId
- }
-}
-
-module fetchLatestImage '../modules/fetch-container-image.bicep' = {
- name: '${name}-fetch-image'
- params: {
- exists: exists
- name: name
- }
-}
-
-resource app 'Microsoft.App/containerApps@2023-05-02-preview' = {
- name: name
- location: location
- tags: union(tags, {'azd-service-name': 'backend' })
- dependsOn: [ acrPullRole ]
- identity: {
- type: 'UserAssigned'
- userAssignedIdentities: { '${identity.id}': {} }
- }
- properties: {
- managedEnvironmentId: containerAppsEnvironment.id
- configuration: {
- ingress: {
- external: true
- targetPort: 5244
- transport: 'auto'
- corsPolicy: {
- allowedOrigins: union(allowedOrigins, [
- // define additional allowed origins here
- ])
- }
- }
- registries: [
- {
- server: '${containerRegistryName}.azurecr.io'
- identity: identity.id
- }
- ]
- secrets: union([
- ],
- map(secrets, secret => {
- name: secret.secretRef
- value: secret.value
- }))
- }
- template: {
- containers: [
- {
- image: fetchLatestImage.outputs.?containers[?0].?image ?? 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'
- name: 'main'
- env: union([
- {
- name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
- value: applicationInsights.properties.ConnectionString
- }
- {
- name: 'PORT'
- value: '5244'
- }
- ],
- env,
- map(secrets, secret => {
- name: secret.name
- secretRef: secret.secretRef
- }))
- resources: {
- cpu: json('1.0')
- memory: '2.0Gi'
- }
- }
- ]
- scale: {
- minReplicas: 1
- maxReplicas: 10
- }
- }
- }
-}
-
-output defaultDomain string = containerAppsEnvironment.properties.defaultDomain
-output name string = app.name
-output uri string = 'https://${app.properties.configuration.ingress.fqdn}'
-output id string = app.id
diff --git a/samples/support-center/infra/app/db.bicep b/samples/support-center/infra/app/db.bicep
deleted file mode 100644
index 5cb4c204..00000000
--- a/samples/support-center/infra/app/db.bicep
+++ /dev/null
@@ -1,36 +0,0 @@
-param accountName string
-param location string = resourceGroup().location
-param tags object = {}
-
-param containers array = [
- {
- name: 'customer'
- id: 'customer'
- partitionKey: '/id'
- }
-]
-
-param databaseName string = ''
-param principalIds array = []
-
-// Because databaseName is optional in main.bicep, we make sure the database name is set here.
-var defaultDatabaseName = 'customer-support'
-var actualDatabaseName = !empty(databaseName) ? databaseName : defaultDatabaseName
-
-module cosmos '../core/database/cosmos/sql/cosmos-sql-db.bicep' = {
- name: 'cosmos-sql'
- params: {
- accountName: accountName
- location: location
- tags: tags
- containers: containers
- databaseName: actualDatabaseName
- principalIds: principalIds
- }
-}
-
-output accountName string = cosmos.outputs.accountName
-output connectionStringKey string = cosmos.outputs.connectionStringKey
-output databaseName string = cosmos.outputs.databaseName
-output endpoint string = cosmos.outputs.endpoint
-output roleDefinitionId string = cosmos.outputs.roleDefinitionId
diff --git a/samples/support-center/infra/app/frontend.bicep b/samples/support-center/infra/app/frontend.bicep
deleted file mode 100644
index a872c23c..00000000
--- a/samples/support-center/infra/app/frontend.bicep
+++ /dev/null
@@ -1,132 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param identityName string
-param containerRegistryName string
-param containerAppsEnvironmentName string
-param applicationInsightsName string
-param apiUrls array
-param exists bool
-@secure()
-param appDefinition object
-
-var appSettingsArray = filter(array(appDefinition.settings), i => i.name != '')
-var secrets = map(filter(appSettingsArray, i => i.?secret != null), i => {
- name: i.name
- value: i.value
- secretRef: i.?secretRef ?? take(replace(replace(toLower(i.name), '_', '-'), '.', '-'), 32)
-})
-var env = map(filter(appSettingsArray, i => i.?secret == null), i => {
- name: i.name
- value: i.value
-})
-
-resource identity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
- name: identityName
- location: location
-}
-
-resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' existing = {
- name: containerRegistryName
-}
-
-resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2023-05-01' existing = {
- name: containerAppsEnvironmentName
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
- name: applicationInsightsName
-}
-
-resource acrPullRole 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
- scope: containerRegistry
- name: guid(subscription().id, resourceGroup().id, identity.id, 'acrPullRole')
- properties: {
- roleDefinitionId: subscriptionResourceId(
- 'Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d')
- principalType: 'ServicePrincipal'
- principalId: identity.properties.principalId
- }
-}
-
-module fetchLatestImage '../modules/fetch-container-image.bicep' = {
- name: '${name}-fetch-image'
- params: {
- exists: exists
- name: name
- }
-}
-
-resource app 'Microsoft.App/containerApps@2023-05-02-preview' = {
- name: name
- location: location
- tags: union(tags, {'azd-service-name': 'frontend' })
- dependsOn: [ acrPullRole ]
- identity: {
- type: 'UserAssigned'
- userAssignedIdentities: { '${identity.id}': {} }
- }
- properties: {
- managedEnvironmentId: containerAppsEnvironment.id
- configuration: {
- ingress: {
- external: true
- targetPort: 3000
- transport: 'auto'
- }
- registries: [
- {
- server: '${containerRegistryName}.azurecr.io'
- identity: identity.id
- }
- ]
- secrets: union([
- ],
- map(secrets, secret => {
- name: secret.secretRef
- value: secret.value
- }))
- }
- template: {
- containers: [
- {
- image: fetchLatestImage.outputs.?containers[?0].?image ?? 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'
- name: 'main'
- env: union([
- {
- name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
- value: applicationInsights.properties.ConnectionString
- }
- {
- name: 'BACKEND_BASE_URL'
- value: apiUrls[0]
- }
- {
- name: 'PORT'
- value: '3000'
- }
- ],
- env,
- map(secrets, secret => {
- name: secret.name
- secretRef: secret.secretRef
- }))
- resources: {
- cpu: json('1.0')
- memory: '2.0Gi'
- }
- }
- ]
- scale: {
- minReplicas: 1
- maxReplicas: 10
- }
- }
- }
-}
-
-output defaultDomain string = containerAppsEnvironment.properties.defaultDomain
-output name string = app.name
-output uri string = 'https://${app.properties.configuration.ingress.fqdn}'
-output id string = app.id
diff --git a/samples/support-center/infra/azd-hooks/load-envs.sh b/samples/support-center/infra/azd-hooks/load-envs.sh
deleted file mode 100644
index a5e0067d..00000000
--- a/samples/support-center/infra/azd-hooks/load-envs.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-
-pushd src/frontend || exit 1
-
-# Check if the variable is set
-if [ -z "${AZURE_BACKEND_ENDPOINT}" ]; then
- echo "AZURE_BACKEND_ENDPOINT is not set. Exiting."
- popd
- exit 1
-fi
-echo "AZURE_BACKEND_ENDPOINT is set to: ${AZURE_BACKEND_ENDPOINT}"
-echo "Replacing with ${AZURE_BACKEND_ENDPOINT}"
-
-# Use sed to replace the placeholder
-sed -i "s||${AZURE_BACKEND_ENDPOINT}|g" .env.azureConfig
-
-# Verify the replacement
-echo "Contents of .env.azureConfig after replacement:"
-cat .env.azureConfig
-
-popd || exit 1
\ No newline at end of file
diff --git a/samples/support-center/infra/azd-hooks/postprovision.ps1 b/samples/support-center/infra/azd-hooks/postprovision.ps1
deleted file mode 100644
index a85e45e8..00000000
--- a/samples/support-center/infra/azd-hooks/postprovision.ps1
+++ /dev/null
@@ -1,36 +0,0 @@
-# Import the necessary modules
-# Import-Module Az
-# Import-Module Az.CosmosDB
-# Import-Module CosmosDB
-
-$subcriptionId = ""
-$resourceGroupName = "rg-oagents-support-center"
-$cosmosDbAccountName = ""
-$databaseName = "customer-support"
-$containerName = "items"
-$partitionKey = "/id"
-
-# Authenticate to Azure (if not already authenticated)
-Write-Host "Authenticating to Azure..."
-Connect-AzAccount -Identity
-Set-AzContext -Subscription $subcriptionId
-
-Write-Host "Resource Group: $resourceGroupName"
-Write-Host "Cosmos DB Account: $cosmosDbAccountName"
-Write-Host "Database Name: $databaseName"
-Write-Host "Container Name: $containerName"
-Write-Host "Partition Key Path: $partitionKeyPath"
-
-$cosmosDbContext = New-CosmosDbContext -Account $cosmosDbAccountName -Database $databaseName -ResourceGroup $resourceGroupName
-
-$document = @"
-{
- "id": "1234",
- "Name": "User",
- "Email": "user@test.com",
- "Phone": "+1123456789",
- "Address": "Contoso Address 123, CN."
-}
-"@
-
-New-CosmosDbDocument -Context $cosmosDbContext -CollectionId $containerName -DocumentBody $document -PartitionKey $partitionkey
\ No newline at end of file
diff --git a/samples/support-center/infra/core/database/cosmos/cosmos-account.bicep b/samples/support-center/infra/core/database/cosmos/cosmos-account.bicep
deleted file mode 100644
index 4c129b0f..00000000
--- a/samples/support-center/infra/core/database/cosmos/cosmos-account.bicep
+++ /dev/null
@@ -1,37 +0,0 @@
-metadata description = 'Creates an Azure Cosmos DB account.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param connectionStringKey string = 'AZURE-COSMOS-CONNECTION-STRING'
-
-@allowed([ 'GlobalDocumentDB', 'MongoDB', 'Parse' ])
-param kind string
-
-resource cosmos 'Microsoft.DocumentDB/databaseAccounts@2022-08-15' = {
- name: name
- kind: kind
- location: location
- tags: tags
- properties: {
- consistencyPolicy: { defaultConsistencyLevel: 'Session' }
- locations: [
- {
- locationName: location
- failoverPriority: 0
- isZoneRedundant: false
- }
- ]
- databaseAccountOfferType: 'Standard'
- enableAutomaticFailover: false
- enableMultipleWriteLocations: false
- apiProperties: (kind == 'MongoDB') ? { serverVersion: '4.0' } : {}
- capabilities: [ { name: 'EnableServerless' } ]
- }
-}
-
-
-output connectionStringKey string = connectionStringKey
-output endpoint string = cosmos.properties.documentEndpoint
-output id string = cosmos.id
-output name string = cosmos.name
diff --git a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-account.bicep b/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-account.bicep
deleted file mode 100644
index fee0f679..00000000
--- a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-account.bicep
+++ /dev/null
@@ -1,19 +0,0 @@
-metadata description = 'Creates an Azure Cosmos DB for NoSQL account.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-module cosmos '../../cosmos/cosmos-account.bicep' = {
- name: 'cosmos-account'
- params: {
- name: name
- location: location
- tags: tags
- kind: 'GlobalDocumentDB'
- }
-}
-
-output connectionStringKey string = cosmos.outputs.connectionStringKey
-output endpoint string = cosmos.outputs.endpoint
-output id string = cosmos.outputs.id
-output name string = cosmos.outputs.name
diff --git a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-db.bicep b/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-db.bicep
deleted file mode 100644
index 3c79064e..00000000
--- a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-db.bicep
+++ /dev/null
@@ -1,72 +0,0 @@
-metadata description = 'Creates an Azure Cosmos DB for NoSQL account with a database.'
-param accountName string
-param databaseName string
-param location string = resourceGroup().location
-param tags object = {}
-
-param containers array = []
-param principalIds array = []
-
-module cosmos 'cosmos-sql-account.bicep' = {
- name: 'cosmos-sql-account'
- params: {
- name: accountName
- location: location
- tags: tags
- }
-}
-
-resource database 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@2022-05-15' = {
- name: '${accountName}/${databaseName}'
- properties: {
- resource: { id: databaseName }
- }
-
- resource list 'containers' = [for container in containers: {
- name: container.name
- properties: {
- resource: {
- id: container.id
- partitionKey: { paths: [ container.partitionKey ] }
- }
- options: {}
- }
- }]
-
- dependsOn: [
- cosmos
- ]
-}
-
-module roleDefinition 'cosmos-sql-role-def.bicep' = {
- name: 'cosmos-sql-role-definition'
- params: {
- accountName: accountName
- }
- dependsOn: [
- cosmos
- database
- ]
-}
-
-// We need batchSize(1) here because sql role assignments have to be done sequentially
-@batchSize(1)
-module userRole 'cosmos-sql-role-assign.bicep' = [for principalId in principalIds: if (!empty(principalId)) {
- name: 'cosmos-sql-user-role-${uniqueString(principalId)}'
- params: {
- accountName: accountName
- roleDefinitionId: roleDefinition.outputs.id
- principalId: principalId
- }
- dependsOn: [
- cosmos
- database
- ]
-}]
-
-output accountId string = cosmos.outputs.id
-output accountName string = cosmos.outputs.name
-output connectionStringKey string = cosmos.outputs.connectionStringKey
-output databaseName string = databaseName
-output endpoint string = cosmos.outputs.endpoint
-output roleDefinitionId string = roleDefinition.outputs.id
diff --git a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-role-assign.bicep b/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-role-assign.bicep
deleted file mode 100644
index 3949efef..00000000
--- a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-role-assign.bicep
+++ /dev/null
@@ -1,19 +0,0 @@
-metadata description = 'Creates a SQL role assignment under an Azure Cosmos DB account.'
-param accountName string
-
-param roleDefinitionId string
-param principalId string = ''
-
-resource role 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2022-05-15' = {
- parent: cosmos
- name: guid(roleDefinitionId, principalId, cosmos.id)
- properties: {
- principalId: principalId
- roleDefinitionId: roleDefinitionId
- scope: cosmos.id
- }
-}
-
-resource cosmos 'Microsoft.DocumentDB/databaseAccounts@2022-08-15' existing = {
- name: accountName
-}
diff --git a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-role-def.bicep b/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-role-def.bicep
deleted file mode 100644
index 778d6dc4..00000000
--- a/samples/support-center/infra/core/database/cosmos/sql/cosmos-sql-role-def.bicep
+++ /dev/null
@@ -1,30 +0,0 @@
-metadata description = 'Creates a SQL role definition under an Azure Cosmos DB account.'
-param accountName string
-
-resource roleDefinition 'Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions@2022-08-15' = {
- parent: cosmos
- name: guid(cosmos.id, accountName, 'sql-role')
- properties: {
- assignableScopes: [
- cosmos.id
- ]
- permissions: [
- {
- dataActions: [
- 'Microsoft.DocumentDB/databaseAccounts/readMetadata'
- 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*'
- 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*'
- ]
- notDataActions: []
- }
- ]
- roleName: 'Reader Writer'
- type: 'CustomRole'
- }
-}
-
-resource cosmos 'Microsoft.DocumentDB/databaseAccounts@2022-08-15' existing = {
- name: accountName
-}
-
-output id string = roleDefinition.id
diff --git a/samples/support-center/infra/core/database/postgresql/flexibleserver.bicep b/samples/support-center/infra/core/database/postgresql/flexibleserver.bicep
deleted file mode 100644
index effda63d..00000000
--- a/samples/support-center/infra/core/database/postgresql/flexibleserver.bicep
+++ /dev/null
@@ -1,64 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param sku object
-param storage object
-param administratorLogin string
-@secure()
-param administratorLoginPassword string
-param databaseNames array = []
-param allowAzureIPsFirewall bool = false
-param allowAllIPsFirewall bool = false
-param allowedSingleIPs array = []
-
-// PostgreSQL version
-param version string
-
-// Latest official version 2022-12-01 does not have Bicep types available
-resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2022-12-01' = {
- location: location
- tags: tags
- name: name
- sku: sku
- properties: {
- version: version
- administratorLogin: administratorLogin
- administratorLoginPassword: administratorLoginPassword
- storage: storage
- highAvailability: {
- mode: 'Disabled'
- }
- }
-
- resource database 'databases' = [for name in databaseNames: {
- name: name
- }]
-
- resource firewall_all 'firewallRules' = if (allowAllIPsFirewall) {
- name: 'allow-all-IPs'
- properties: {
- startIpAddress: '0.0.0.0'
- endIpAddress: '255.255.255.255'
- }
- }
-
- resource firewall_azure 'firewallRules' = if (allowAzureIPsFirewall) {
- name: 'allow-all-azure-internal-IPs'
- properties: {
- startIpAddress: '0.0.0.0'
- endIpAddress: '0.0.0.0'
- }
- }
-
- resource firewall_single 'firewallRules' = [for ip in allowedSingleIPs: {
- name: 'allow-single-${replace(ip, '.', '')}'
- properties: {
- startIpAddress: ip
- endIpAddress: ip
- }
- }]
-
-}
-
-output POSTGRES_DOMAIN_NAME string = postgresServer.properties.fullyQualifiedDomainName
diff --git a/samples/support-center/infra/core/database/qdrant/qdrant-aca.bicep b/samples/support-center/infra/core/database/qdrant/qdrant-aca.bicep
deleted file mode 100644
index a5f1573e..00000000
--- a/samples/support-center/infra/core/database/qdrant/qdrant-aca.bicep
+++ /dev/null
@@ -1,72 +0,0 @@
-param containerAppsEnvironmentName string
-param storageName string
-param shareName string
-param location string
-var storageAccountKey = listKeys(resourceId('Microsoft.Storage/storageAccounts', storageName), '2021-09-01').keys[0].value
-
-resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-11-01-preview' existing = {
- name: containerAppsEnvironmentName
-}
-
-var mountName = 'qdrantstoragemount'
-var volumeName = 'qdrantstoragevol'
-resource qdrantstorage 'Microsoft.App/managedEnvironments/storages@2022-11-01-preview' = {
- name: '${containerAppsEnvironmentName}/${mountName}'
- properties: {
- azureFile: {
- accountName: storageName
- shareName: shareName
- accountKey: storageAccountKey
- accessMode: 'ReadWrite'
- }
- }
-}
-
-resource qdrant 'Microsoft.App/containerApps@2022-11-01-preview' = {
- name: 'qdrant'
- location: location
- dependsOn:[
- qdrantstorage
- ]
- properties: {
- environmentId: containerAppsEnvironment.id
- configuration: {
- ingress: {
- external: true
- targetPort: 6333
- }
- }
- template: {
- containers: [
- {
- name: 'qdrant'
- image: 'qdrant/qdrant'
- resources: {
- cpu: 1
- memory: '2Gi'
- }
- volumeMounts: [
- {
- volumeName: volumeName
- mountPath: '/qdrant/storage'
- }
- ]
- }
- ]
- scale: {
- minReplicas: 1
- maxReplicas: 1
- }
- volumes: [
- {
- name: volumeName
- storageName: mountName
- storageType: 'AzureFile'
- }
- ]
- }
- }
-}
-
-output fqdn string = qdrant.properties.latestRevisionFqdn
-
diff --git a/samples/support-center/infra/core/documentintelligence/document-intelligence.bicep b/samples/support-center/infra/core/documentintelligence/document-intelligence.bicep
deleted file mode 100644
index 1261e7da..00000000
--- a/samples/support-center/infra/core/documentintelligence/document-intelligence.bicep
+++ /dev/null
@@ -1,43 +0,0 @@
-@description('Location for all resources.')
-param location string = resourceGroup().location
-param tags object = {}
-
-@allowed([
- 'F0'
- 'S0'
-])
-
-param sku string = 'S0'
-
-
-param documentIntelligenceName string = ''
-// Because name is optional in main.bicep, we make sure the name is set here.
-var defaultName = 'doc-intelligence-${uniqueString(resourceGroup().id)}'
-var actualname = !empty(documentIntelligenceName) ? documentIntelligenceName : defaultName
-
-resource cognitiveService 'Microsoft.CognitiveServices/accounts@2021-10-01' = {
- name: actualname
- location: 'westeurope' //invoice model is only available in eastus, west us2 and west europe for now
- tags: tags
- sku: {
- name: sku
- }
- kind: 'FormRecognizer'
- identity: {
- type: 'SystemAssigned'
- }
- properties: {
- customSubDomainName: actualname
- networkAcls: {
- defaultAction: 'Allow'
- virtualNetworkRules: []
- ipRules: []
- }
- publicNetworkAccess: 'Enabled'
- }
-}
-
-output id string = cognitiveService.id
-output endpoint string = 'https://${actualname}.cognitiveservices.azure.com/'
-output name string = cognitiveService.name
-//output key string = cognitiveService.listKeys().key1
diff --git a/samples/support-center/infra/core/search/search.bicep b/samples/support-center/infra/core/search/search.bicep
deleted file mode 100644
index e2d3871c..00000000
--- a/samples/support-center/infra/core/search/search.bicep
+++ /dev/null
@@ -1,68 +0,0 @@
-metadata description = 'Creates an Azure AI Search instance.'
-param name string = ''
-param location string = resourceGroup().location
-param tags object = {}
-
-param sku object = {
- name: 'standard'
-}
-
-param authOptions object = {}
-param disableLocalAuth bool = false
-param disabledDataExfiltrationOptions array = []
-param encryptionWithCmk object = {
- enforcement: 'Unspecified'
-}
-@allowed([
- 'default'
- 'highDensity'
-])
-param hostingMode string = 'default'
-param networkRuleSet object = {
- bypass: 'None'
- ipRules: []
-}
-param partitionCount int = 1
-@allowed([
- 'enabled'
- 'disabled'
-])
-param publicNetworkAccess string = 'enabled'
-param replicaCount int = 1
-@allowed([
- 'disabled'
- 'enabled'
- 'free'
- 'standard'
-])
-param semanticSearch string = 'standard'
-
-var searchIdentityProvider = (sku.name == 'free') ? null : {
- type: 'SystemAssigned'
-}
-
-resource search 'Microsoft.Search/searchServices@2021-04-01-preview' = {
- name: name
- location: location
- tags: tags
- // The free tier does not support managed identity
- identity: searchIdentityProvider
- properties: {
- authOptions: disableLocalAuth ? null : authOptions
- disableLocalAuth: disableLocalAuth
- disabledDataExfiltrationOptions: disabledDataExfiltrationOptions
- encryptionWithCmk: encryptionWithCmk
- hostingMode: hostingMode
- networkRuleSet: networkRuleSet
- partitionCount: partitionCount
- publicNetworkAccess: publicNetworkAccess
- replicaCount: replicaCount
- semanticSearch: semanticSearch
- }
- sku: sku
-}
-
-output id string = search.id
-output endpoint string = 'https://${name}.search.windows.net/'
-output name string = search.name
-output principalId string = !empty(searchIdentityProvider) ? search.identity.principalId : ''
diff --git a/samples/support-center/infra/core/storage/storage-account.bicep b/samples/support-center/infra/core/storage/storage-account.bicep
deleted file mode 100644
index 75461a65..00000000
--- a/samples/support-center/infra/core/storage/storage-account.bicep
+++ /dev/null
@@ -1,76 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-@allowed([
- 'Cool'
- 'Hot'
- 'Premium' ])
-param accessTier string = 'Hot'
-param allowBlobPublicAccess bool = true
-param allowCrossTenantReplication bool = true
-param allowSharedKeyAccess bool = true
-param containers array = []
-param defaultToOAuthAuthentication bool = false
-param deleteRetentionPolicy object = {}
-@allowed([ 'AzureDnsZone', 'Standard' ])
-param dnsEndpointType string = 'Standard'
-param kind string = 'StorageV2'
-param minimumTlsVersion string = 'TLS1_2'
-param networkAcls object = {
- bypass: 'AzureServices'
- defaultAction: 'Allow'
-}
-@allowed([ 'Enabled', 'Disabled' ])
-param publicNetworkAccess string = 'Enabled'
-param sku object = { name: 'Standard_LRS' }
-param fileShares array = []
-param tables array = []
-
-resource storage 'Microsoft.Storage/storageAccounts@2022-05-01' = {
- name: name
- location: location
- tags: tags
- kind: kind
- sku: sku
- properties: {
- accessTier: accessTier
- allowBlobPublicAccess: allowBlobPublicAccess
- allowCrossTenantReplication: allowCrossTenantReplication
- allowSharedKeyAccess: allowSharedKeyAccess
- defaultToOAuthAuthentication: defaultToOAuthAuthentication
- dnsEndpointType: dnsEndpointType
- minimumTlsVersion: minimumTlsVersion
- networkAcls: networkAcls
- publicNetworkAccess: publicNetworkAccess
- }
-
- resource blobServices 'blobServices' = if (!empty(containers)) {
- name: 'default'
- properties: {
- deleteRetentionPolicy: deleteRetentionPolicy
- }
- resource container 'containers' = [for container in containers: {
- name: container.name
- properties: {
- publicAccess: contains(container, 'publicAccess') ? container.publicAccess : 'None'
- }
- }]
- }
- resource fileServices 'fileServices' = if (!empty(fileShares)) {
- name: 'default'
- resource share 'shares' = [for fileShare in fileShares: {
- name: fileShare
- }]
- }
-
- resource tableServices 'tableServices' = if (!empty(tables)) {
- name: 'default'
- resource table 'tables' = [for table in tables: {
- name: table
- }]
- }
-}
-
-output name string = storage.name
-output primaryEndpoints object = storage.properties.primaryEndpoints
diff --git a/samples/support-center/infra/main.bicep b/samples/support-center/infra/main.bicep
deleted file mode 100644
index ae49950e..00000000
--- a/samples/support-center/infra/main.bicep
+++ /dev/null
@@ -1,206 +0,0 @@
-targetScope = 'subscription'
-
-@minLength(1)
-@maxLength(64)
-@description('Name of the environment that can be used as part of naming resource convention')
-param environmentName string
-
-@minLength(1)
-@description('Primary location for all resources')
-param location string
-
-param backendExists bool
-@secure()
-param backendDefinition object
-param frontendExists bool
-param cosmosAccountName string = ''
-@secure()
-param frontendDefinition object
-param storageAccountName string = ''
-param documentIntelligenceName string = ''
-param searchName string = ''
-
-@description('Id of the user or app to assign application roles')
-param principalId string
-
-var qdrantShare = 'qdrantshare'
-
-// Tags that should be applied to all resources.
-//
-// Note that 'azd-service-name' tags should be applied separately to service host resources.
-// Example usage:
-// tags: union(tags, { 'azd-service-name': })
-var tags = {
- 'azd-env-name': environmentName
-}
-
-var abbrs = loadJsonContent('./abbreviations.json')
-var resourceToken = toLower(uniqueString(subscription().id, environmentName, location))
-
-resource rg 'Microsoft.Resources/resourceGroups@2022-09-01' = {
- name: 'rg-${environmentName}'
- location: location
- tags: tags
-}
-
-module monitoring './shared/monitoring.bicep' = {
- name: 'monitoring'
- params: {
- location: location
- tags: tags
- logAnalyticsName: '${abbrs.operationalInsightsWorkspaces}${resourceToken}'
- applicationInsightsName: '${abbrs.insightsComponents}${resourceToken}'
- }
- scope: rg
-}
-
-module dashboard './shared/dashboard-web.bicep' = {
- name: 'dashboard'
- params: {
- name: '${abbrs.portalDashboards}${resourceToken}'
- applicationInsightsName: monitoring.outputs.applicationInsightsName
- location: location
- tags: tags
- }
- scope: rg
-}
-
-module registry './shared/registry.bicep' = {
- name: 'registry'
- params: {
- location: location
- tags: tags
- name: '${abbrs.containerRegistryRegistries}${resourceToken}'
- }
- scope: rg
-}
-
-module keyVault './shared/keyvault.bicep' = {
- name: 'keyvault'
- params: {
- location: location
- tags: tags
- name: '${abbrs.keyVaultVaults}${resourceToken}'
- principalId: principalId
- }
- scope: rg
-}
-
-module appsEnv './shared/apps-env.bicep' = {
- name: 'apps-env'
- params: {
- name: '${abbrs.appManagedEnvironments}${resourceToken}'
- location: location
- tags: tags
- applicationInsightsName: monitoring.outputs.applicationInsightsName
- logAnalyticsWorkspaceName: monitoring.outputs.logAnalyticsWorkspaceName
- }
- scope: rg
-}
-
-module storage './core/storage/storage-account.bicep' = {
- name: 'storage'
- scope: rg
- params: {
- name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${resourceToken}'
- location: location
- tags: tags
- fileShares: [
- qdrantShare
- ]
- }
-}
-
-module qdrant './core/database/qdrant/qdrant-aca.bicep' = {
- name: 'qdrant-deploy'
- scope: rg
- params: {
- location: location
- containerAppsEnvironmentName: appsEnv.outputs.name
- shareName: qdrantShare
- storageName: storage.outputs.name
- }
-}
-
-
-module cosmos './app/db.bicep' = {
- name: 'cosmos'
- scope: rg
- params: {
- accountName: !empty(cosmosAccountName) ? cosmosAccountName : '${abbrs.documentDBDatabaseAccounts}${resourceToken}'
- databaseName: 'customer-support'
- location: location
- tags: tags
- }
-}
-
-
-module backend './app/backend.bicep' = {
- name: 'backend'
- params: {
- name: '${abbrs.appContainerApps}backend-${resourceToken}'
- location: location
- tags: tags
- identityName: '${abbrs.managedIdentityUserAssignedIdentities}backend-${resourceToken}'
- applicationInsightsName: monitoring.outputs.applicationInsightsName
- containerAppsEnvironmentName: appsEnv.outputs.name
- containerRegistryName: registry.outputs.name
- exists: backendExists
- appDefinition: backendDefinition
- allowedOrigins: [
- 'https://${abbrs.appContainerApps}frontend-${resourceToken}.${appsEnv.outputs.domain}'
- ]
- }
- scope: rg
-}
-
-module frontend './app/frontend.bicep' = {
- name: 'frontend'
- params: {
- name: '${abbrs.appContainerApps}frontend-${resourceToken}'
- location: location
- tags: tags
- identityName: '${abbrs.managedIdentityUserAssignedIdentities}frontend-${resourceToken}'
- applicationInsightsName: monitoring.outputs.applicationInsightsName
- containerAppsEnvironmentName: appsEnv.outputs.name
- containerRegistryName: registry.outputs.name
- exists: frontendExists
- appDefinition: frontendDefinition
- apiUrls: [
- backend.outputs.uri
- ]
- }
- scope: rg
-}
-module documentIntelligence './core/documentintelligence/document-intelligence.bicep' = {
- name: 'documentIntelligence'
- scope: rg
- params: {
- documentIntelligenceName: !empty(documentIntelligenceName) ? documentIntelligenceName : '${abbrs.cognitiveServicesFormRecognizer}-${resourceToken}'
- location: location
- tags: tags
- }
-}
-
-module search './core/search/search.bicep' = {
- name: 'search'
- scope: rg
- params: {
- name: !empty(searchName) ? searchName : '${abbrs.searchSearchServices}${resourceToken}'
- location: location
- tags: tags
- }
-}
-
-output AZURE_RESOURCE_GROUP string = rg.name
-output AZURE_CONTAINER_REGISTRY_ENDPOINT string = registry.outputs.loginServer
-output AZURE_KEY_VAULT_NAME string = keyVault.outputs.name
-output AZURE_KEY_VAULT_ENDPOINT string = keyVault.outputs.endpoint
-output QDRANT_ENDPOINT string = 'https://${qdrant.outputs.fqdn}'
-output AZURE_COSMOS_ENDPOINT string = cosmos.outputs.endpoint
-output AZURE_COSMOS_CONNECTION_STRING_KEY string = cosmos.outputs.connectionStringKey
-output AZURE_COSMOS_DATABASE_NAME string = cosmos.outputs.databaseName
-output AZURE_DOCUMENT_INTELLIGENCE_ENDPOINT string = documentIntelligence.outputs.endpoint
-output AZURE_SEARCH_ENDPOINT string = search.outputs.endpoint
-output AZURE_BACKEND_ENDPOINT string = backend.outputs.uri
-
diff --git a/samples/support-center/infra/main.parameters.json b/samples/support-center/infra/main.parameters.json
deleted file mode 100644
index ff903cad..00000000
--- a/samples/support-center/infra/main.parameters.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
- "contentVersion": "1.0.0.0",
- "parameters": {
- "environmentName": {
- "value": "${AZURE_ENV_NAME}"
- },
- "location": {
- "value": "${AZURE_LOCATION}"
- },
- "backendExists": {
- "value": "${SERVICE_BACKEND_RESOURCE_EXISTS=false}"
- },
- "backendDefinition": {
- "value": {
- "settings": [
- {
- "name": "",
- "value": "${VAR}",
- "_comment_name": "The name of the environment variable when running in Azure. If empty, ignored.",
- "_comment_value": "The value to provide. This can be a fixed literal, or an expression like ${VAR} to use the value of 'VAR' from the current environment."
- },
- {
- "name": "",
- "value": "${VAR_S}",
- "secret": true,
- "_comment_name": "The name of the environment variable when running in Azure. If empty, ignored.",
- "_comment_value": "The value to provide. This can be a fixed literal, or an expression like ${VAR_S} to use the value of 'VAR_S' from the current environment."
- }
- ]
- }
- },
- "frontendExists": {
- "value": "${SERVICE_FRONTEND_RESOURCE_EXISTS=false}"
- },
- "frontendDefinition": {
- "value": {
- "settings": [
- {
- "name": "",
- "value": "${VAR}",
- "_comment_name": "The name of the environment variable when running in Azure. If empty, ignored.",
- "_comment_value": "The value to provide. This can be a fixed literal, or an expression like ${VAR} to use the value of 'VAR' from the current environment."
- },
- {
- "name": "",
- "value": "${VAR_S}",
- "secret": true,
- "_comment_name": "The name of the environment variable when running in Azure. If empty, ignored.",
- "_comment_value": "The value to provide. This can be a fixed literal, or an expression like ${VAR_S} to use the value of 'VAR_S' from the current environment."
- }
- ]
- }
- },
- "principalId": {
- "value": "${AZURE_PRINCIPAL_ID}"
- }
- }
-}
\ No newline at end of file
diff --git a/samples/support-center/infra/modules/fetch-container-image.bicep b/samples/support-center/infra/modules/fetch-container-image.bicep
deleted file mode 100644
index 78d1e7ee..00000000
--- a/samples/support-center/infra/modules/fetch-container-image.bicep
+++ /dev/null
@@ -1,8 +0,0 @@
-param exists bool
-param name string
-
-resource existingApp 'Microsoft.App/containerApps@2023-05-02-preview' existing = if (exists) {
- name: name
-}
-
-output containers array = exists ? existingApp.properties.template.containers : []
diff --git a/samples/support-center/infra/shared/apps-env.bicep b/samples/support-center/infra/shared/apps-env.bicep
deleted file mode 100644
index 030b8233..00000000
--- a/samples/support-center/infra/shared/apps-env.bicep
+++ /dev/null
@@ -1,33 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param logAnalyticsWorkspaceName string
-param applicationInsightsName string = ''
-
-resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-10-01' = {
- name: name
- location: location
- tags: tags
- properties: {
- appLogsConfiguration: {
- destination: 'log-analytics'
- logAnalyticsConfiguration: {
- customerId: logAnalyticsWorkspace.properties.customerId
- sharedKey: logAnalyticsWorkspace.listKeys().primarySharedKey
- }
- }
- daprAIConnectionString: applicationInsights.properties.ConnectionString
- }
-}
-
-resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' existing = {
- name: logAnalyticsWorkspaceName
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
- name: applicationInsightsName
-}
-
-output name string = containerAppsEnvironment.name
-output domain string = containerAppsEnvironment.properties.defaultDomain
diff --git a/samples/support-center/infra/shared/dashboard-web.bicep b/samples/support-center/infra/shared/dashboard-web.bicep
deleted file mode 100644
index eccce0db..00000000
--- a/samples/support-center/infra/shared/dashboard-web.bicep
+++ /dev/null
@@ -1,1231 +0,0 @@
-param name string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-
-// 2020-09-01-preview because that is the latest valid version
-resource applicationInsightsDashboard 'Microsoft.Portal/dashboards@2020-09-01-preview' = {
- name: name
- location: location
- tags: tags
- properties: {
- lenses: [
- {
- order: 0
- parts: [
- {
- position: {
- x: 0
- y: 0
- colSpan: 2
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'id'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AspNetOverviewPinnedPart'
- asset: {
- idInputName: 'id'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'overview'
- }
- }
- {
- position: {
- x: 2
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/ProactiveDetectionAsyncPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'ProactiveDetection'
- }
- }
- {
- position: {
- x: 3
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/QuickPulseButtonSmallPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 4
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-04T01:20:33.345Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AvailabilityNavButtonPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 5
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-08T18:47:35.237Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'ConfigurationId'
- value: '78ce933e-e864-4b05-a27b-71fd55a6afad'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AppMapButtonPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 0
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Usage'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 3
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-04T01:22:35.782Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/UsageUsersOverviewPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 4
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Reliability'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 7
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'DataModel'
- value: {
- version: '1.0.0'
- timeContext: {
- durationMs: 86400000
- createdTime: '2018-05-04T23:42:40.072Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- isOptional: true
- }
- {
- name: 'ConfigurationId'
- value: '8a02f7bf-ac0f-40e1-afe9-f0e72cfee77f'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/CuratedBladeFailuresPinnedPart'
- isAdapter: true
- asset: {
- idInputName: 'ResourceId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'failures'
- }
- }
- {
- position: {
- x: 8
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Responsiveness\r\n'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 11
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'DataModel'
- value: {
- version: '1.0.0'
- timeContext: {
- durationMs: 86400000
- createdTime: '2018-05-04T23:43:37.804Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- isOptional: true
- }
- {
- name: 'ConfigurationId'
- value: '2a8ede4f-2bee-4b9c-aed9-2db0e8a01865'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/CuratedBladePerformancePinnedPart'
- isAdapter: true
- asset: {
- idInputName: 'ResourceId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'performance'
- }
- }
- {
- position: {
- x: 12
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Browser'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 15
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'MetricsExplorerJsonDefinitionId'
- value: 'BrowserPerformanceTimelineMetrics'
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- createdTime: '2018-05-08T12:16:27.534Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'CurrentFilter'
- value: {
- eventTypes: [
- 4
- 1
- 3
- 5
- 2
- 6
- 13
- ]
- typeFacets: {}
- isPermissive: false
- }
- }
- {
- name: 'id'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/MetricsExplorerBladePinnedPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'browser'
- }
- }
- {
- position: {
- x: 0
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'sessions/count'
- aggregationType: 5
- namespace: 'microsoft.insights/components/kusto'
- metricVisualization: {
- displayName: 'Sessions'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'users/count'
- aggregationType: 5
- namespace: 'microsoft.insights/components/kusto'
- metricVisualization: {
- displayName: 'Users'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Unique sessions and users'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'segmentationUsers'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'requests/failed'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Failed requests'
- color: '#EC008C'
- }
- }
- ]
- title: 'Failed requests'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'failures'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'requests/duration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Server response time'
- color: '#00BCF2'
- }
- }
- ]
- title: 'Server response time'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'performance'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 12
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/networkDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Page load network connect time'
- color: '#7E58FF'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/processingDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Client processing time'
- color: '#44F1C8'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/sendDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Send request time'
- color: '#EB9371'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/receiveDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Receiving response time'
- color: '#0672F1'
- }
- }
- ]
- title: 'Average page load time breakdown'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 0
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'availabilityResults/availabilityPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Availability'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average availability'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'availability'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'exceptions/server'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Server exceptions'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'dependencies/failed'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Dependency failures'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Server exceptions and Dependency failures'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processorCpuPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Processor time'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processCpuPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Process CPU'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Average processor and process CPU utilization'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 12
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'exceptions/browser'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Browser exceptions'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Browser exceptions'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 0
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'availabilityResults/count'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Availability test results count'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Availability test results count'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processIOBytesPerSecond'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Process IO rate'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average process I/O rate'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/memoryAvailableBytes'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Available memory'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average available memory'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- ]
- }
- ]
- }
-}
diff --git a/samples/support-center/infra/shared/keyvault.bicep b/samples/support-center/infra/shared/keyvault.bicep
deleted file mode 100644
index f84f7508..00000000
--- a/samples/support-center/infra/shared/keyvault.bicep
+++ /dev/null
@@ -1,31 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-@description('Service principal that should be granted read access to the KeyVault. If unset, no service principal is granted access by default')
-param principalId string = ''
-
-var defaultAccessPolicies = !empty(principalId) ? [
- {
- objectId: principalId
- permissions: { secrets: [ 'get', 'list' ] }
- tenantId: subscription().tenantId
- }
-] : []
-
-resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' = {
- name: name
- location: location
- tags: tags
- properties: {
- tenantId: subscription().tenantId
- sku: { family: 'A', name: 'standard' }
- enabledForTemplateDeployment: true
- accessPolicies: union(defaultAccessPolicies, [
- // define access policies here
- ])
- }
-}
-
-output endpoint string = keyVault.properties.vaultUri
-output name string = keyVault.name
diff --git a/samples/support-center/infra/shared/monitoring.bicep b/samples/support-center/infra/shared/monitoring.bicep
deleted file mode 100644
index 4ae9796c..00000000
--- a/samples/support-center/infra/shared/monitoring.bicep
+++ /dev/null
@@ -1,34 +0,0 @@
-param logAnalyticsName string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-
-resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = {
- name: logAnalyticsName
- location: location
- tags: tags
- properties: any({
- retentionInDays: 30
- features: {
- searchVersion: 1
- }
- sku: {
- name: 'PerGB2018'
- }
- })
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
- name: applicationInsightsName
- location: location
- tags: tags
- kind: 'web'
- properties: {
- Application_Type: 'web'
- WorkspaceResourceId: logAnalytics.id
- }
-}
-
-output applicationInsightsName string = applicationInsights.name
-output logAnalyticsWorkspaceId string = logAnalytics.id
-output logAnalyticsWorkspaceName string = logAnalytics.name
diff --git a/samples/support-center/infra/shared/registry.bicep b/samples/support-center/infra/shared/registry.bicep
deleted file mode 100644
index d6629f86..00000000
--- a/samples/support-center/infra/shared/registry.bicep
+++ /dev/null
@@ -1,36 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param adminUserEnabled bool = true
-param anonymousPullEnabled bool = false
-param dataEndpointEnabled bool = false
-param encryption object = {
- status: 'disabled'
-}
-param networkRuleBypassOptions string = 'AzureServices'
-param publicNetworkAccess string = 'Enabled'
-param sku object = {
- name: 'Standard'
-}
-param zoneRedundancy string = 'Disabled'
-
-// 2023-01-01-preview needed for anonymousPullEnabled
-resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' = {
- name: name
- location: location
- tags: tags
- sku: sku
- properties: {
- adminUserEnabled: adminUserEnabled
- anonymousPullEnabled: anonymousPullEnabled
- dataEndpointEnabled: dataEndpointEnabled
- encryption: encryption
- networkRuleBypassOptions: networkRuleBypassOptions
- publicNetworkAccess: publicNetworkAccess
- zoneRedundancy: zoneRedundancy
- }
-}
-
-output loginServer string = containerRegistry.properties.loginServer
-output name string = containerRegistry.name
diff --git a/samples/support-center/seed-invoice-memory/Dockerfile b/samples/support-center/seed-invoice-memory/Dockerfile
deleted file mode 100644
index b32c16df..00000000
--- a/samples/support-center/seed-invoice-memory/Dockerfile
+++ /dev/null
@@ -1,18 +0,0 @@
-FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base
-WORKDIR /app
-
-FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
-WORKDIR /src
-COPY ["seed-invoice-memory/seed-invoice-memory.csproj", "seed-invoice-memory/"]
-RUN dotnet restore "seed-invoice-memory/seed-invoice-memory.csproj"
-COPY . .
-WORKDIR "/seed-invoice-memory/"
-RUN dotnet build "seed-invoice-memory.csproj" -c Release -o /app/build
-
-FROM build AS publish
-RUN dotnet publish "seed-invoice-memory.csproj" -c Release -o /app/publish /p:UseAppHost=false
-
-FROM base AS final
-WORKDIR /app
-COPY --from=publish /app/publish .
-ENTRYPOINT ["dotnet", "seed-invoice-memory.dll"]
diff --git a/samples/support-center/seed-invoice-memory/MemoryProgram.cs b/samples/support-center/seed-invoice-memory/MemoryProgram.cs
deleted file mode 100644
index 75844366..00000000
--- a/samples/support-center/seed-invoice-memory/MemoryProgram.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System.Reflection;
-using Microsoft.Extensions.Logging;
-using Microsoft.SemanticKernel.Connectors.OpenAI;
-using Microsoft.SemanticKernel.Memory;
-using Microsoft.SemanticKernel.Connectors.AzureAISearch;
-using Azure.AI.DocumentIntelligence;
-using Azure;
-
-namespace SupportCenter.Invoice.Memory;
-
-internal class MemoryProgram
-{
- static string[] files = { "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf" };
- static async Task Main(string[] args)
- {
- var kernelSettings = KernelSettings.LoadSettings();
- string endpoint = kernelSettings.DocumentIntelligenceEndpoint;
- string key = kernelSettings.DocumentIntelligenceKey;
- AzureKeyCredential credential = new AzureKeyCredential(key);
- DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
- Console.WriteLine($"DocumentIntelligence endpoint {endpoint}");
- Console.WriteLine($"Search endpoint {kernelSettings.SearchEndpoint}");
-
- using ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
- {
- builder
- .SetMinimumLevel(kernelSettings.LogLevel ?? LogLevel.Debug)
- .AddConsole()
- .AddDebug();
- });
-
- var memoryBuilder = new MemoryBuilder();
- var memory = memoryBuilder.WithLoggerFactory(loggerFactory)
- .WithMemoryStore(new AzureAISearchMemoryStore(kernelSettings.SearchEndpoint, kernelSettings.SearchKey))
- .WithAzureOpenAITextEmbeddingGeneration(kernelSettings.EmbeddingDeploymentOrModelId, kernelSettings.Endpoint, kernelSettings.ApiKey)
- .Build();
-
- foreach (var file in files)
- {
- Console.WriteLine($"file {file}");
- AnalyzeResult result = await AnalyzeDoc(client, file);
- await ImportDocumentAsync(memory, kernelSettings.SearchIndex, result.Content);
- //Thread.Sleep(60000); //throttled to 1 request per minute
- }
- }
-
- public static async Task ImportDocumentAsync(ISemanticTextMemory memory, string collection, string text)
- {
- Console.WriteLine($"text: {text}");
- Console.WriteLine($"collection: {collection}");
- try
- {
- var descr = text.Take(100);
- await memory.SaveInformationAsync(
- collection: collection,
- text: text,
- id: $"{Guid.NewGuid()}",
- description: $"{descr}");
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
-
- static async Task AnalyzeDoc(DocumentIntelligenceClient client, string invoice, string modelName = "prebuilt-invoice")
- {
-
- var currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
- Uri invoiceUri = new Uri(invoice);
-
- Console.WriteLine($"invoiceUri {invoiceUri}");
- AnalyzeDocumentContent content = new AnalyzeDocumentContent()
- {
- UrlSource = invoiceUri
- };
-
- Operation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);
- return operation.Value;
- }
-}
\ No newline at end of file
diff --git a/samples/support-center/seed-invoice-memory/config/KernelSettings.cs b/samples/support-center/seed-invoice-memory/config/KernelSettings.cs
deleted file mode 100644
index ad0f3d39..00000000
--- a/samples/support-center/seed-invoice-memory/config/KernelSettings.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System.Text.Json.Serialization;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.Logging;
-
-internal class KernelSettings
-{
- public const string DefaultConfigFile = "config/appsettings.json";
- public const string OpenAI = "OPENAI";
- public const string AzureOpenAI = "AZUREOPENAI";
- public const string AISearch = "AISEARCH";
-
- [JsonPropertyName("serviceType")]
- public string ServiceType { get; set; } = string.Empty;
-
- [JsonPropertyName("serviceId")]
- public string ServiceId { get; set; } = string.Empty;
-
- [JsonPropertyName("deploymentOrModelId")]
- public string DeploymentOrModelId { get; set; } = string.Empty;
- [JsonPropertyName("embeddingDeploymentOrModelId")]
- public string EmbeddingDeploymentOrModelId { get; set; } = string.Empty;
-
- [JsonPropertyName("endpoint")]
- public string Endpoint { get; set; } = string.Empty;
-
- [JsonPropertyName("apiKey")]
- public string ApiKey { get; set; } = string.Empty;
-
- [JsonPropertyName("orgId")]
- public string OrgId { get; set; } = string.Empty;
-
- [JsonPropertyName("searchEndpoint")]
- public string SearchEndpoint { get; set; } = string.Empty;
-
- [JsonPropertyName("searchKey")]
- public string SearchKey { get; set; } = string.Empty;
-
- [JsonPropertyName("searchIndex")]
- public string SearchIndex { get; set; } = string.Empty;
-
- [JsonPropertyName("documentIntelligenceEndpoint")]
- public string DocumentIntelligenceEndpoint { get; set; } = string.Empty;
-
- [JsonPropertyName("documentIntelligenceKey")]
- public string DocumentIntelligenceKey { get; set; } = string.Empty;
-
- [JsonPropertyName("logLevel")]
- public LogLevel? LogLevel { get; set; }
-
- ///
- /// Load the kernel settings from settings.json if the file exists and if not attempt to use user secrets.
- ///
- internal static KernelSettings LoadSettings()
- {
- try
- {
- if (File.Exists(DefaultConfigFile))
- {
- return FromFile(DefaultConfigFile);
- }
-
- Console.WriteLine($"Semantic kernel settings '{DefaultConfigFile}' not found, attempting to load configuration from user secrets.");
-
- return FromUserSecrets();
- }
- catch (InvalidDataException ide)
- {
- Console.Error.WriteLine(
- "Unable to load semantic kernel settings, please provide configuration settings using instructions in the README.\n" +
- "Please refer to: https://github.com/microsoft/semantic-kernel-starters/blob/main/sk-csharp-hello-world/README.md#configuring-the-starter"
- );
- throw new InvalidOperationException(ide.Message);
- }
- }
-
- ///
- /// Load the kernel settings from the specified configuration file if it exists.
- ///
- internal static KernelSettings FromFile(string configFile = DefaultConfigFile)
- {
- if (!File.Exists(configFile))
- {
- throw new FileNotFoundException($"Configuration not found: {configFile}");
- }
-
- var configuration = new ConfigurationBuilder()
- .SetBasePath(Directory.GetCurrentDirectory())
- .AddJsonFile(configFile, optional: true, reloadOnChange: true)
- .AddEnvironmentVariables()
- .Build();
-
- return configuration.Get()
- ?? throw new InvalidDataException($"Invalid semantic kernel settings in '{configFile}', please provide configuration settings using instructions in the README.");
- }
-
- ///
- /// Load the kernel settings from user secrets.
- ///
- internal static KernelSettings FromUserSecrets()
- {
- var configuration = new ConfigurationBuilder()
- .AddUserSecrets()
- .AddEnvironmentVariables()
- .Build();
-
- return configuration.Get()
- ?? throw new InvalidDataException("Invalid semantic kernel settings in user secrets, please provide configuration settings using instructions in the README.");
- }
-}
diff --git a/samples/support-center/seed-invoice-memory/config/appsettings.template.json b/samples/support-center/seed-invoice-memory/config/appsettings.template.json
deleted file mode 100644
index ce4b39c7..00000000
--- a/samples/support-center/seed-invoice-memory/config/appsettings.template.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "embeddingDeploymentOrModelId": "text-embedding-ada-002",
- "endpoint": " https://.openai.azure.com/",
- "apiKey": "",
- "searchEndpoint": "https://.search.windows.net",
- "searchKey": "",
- "searchIndex": "invoice",
- "documentIntelligenceEndpoint": "https://.cognitiveservices.azure.com/",
- "documentIntelligenceKey": ""
-}
\ No newline at end of file
diff --git a/samples/support-center/seed-invoice-memory/seed-invoice-memory.csproj b/samples/support-center/seed-invoice-memory/seed-invoice-memory.csproj
deleted file mode 100644
index 245e9339..00000000
--- a/samples/support-center/seed-invoice-memory/seed-invoice-memory.csproj
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- Exe
- net8.0
- enable
- enable
- semantic-kernel-rag-chat
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/samples/support-center/seed-memory/Program.cs b/samples/support-center/seed-memory/Program.cs
deleted file mode 100644
index ba2605ae..00000000
--- a/samples/support-center/seed-memory/Program.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System.Reflection;
-using Microsoft.Extensions.Logging;
-using Microsoft.SemanticKernel.Connectors.OpenAI;
-using Microsoft.SemanticKernel.Connectors.Qdrant;
-using Microsoft.SemanticKernel.Memory;
-using UglyToad.PdfPig;
-using UglyToad.PdfPig.DocumentLayoutAnalysis.TextExtractor;
-using System;
-using System.Threading;
-
-class Program
-{
- static string[] files = { "Benefit_Options.pdf", "employee_handbook.pdf", "Northwind_Health_Plus_Benefits_Details.pdf", "Northwind_Standard_Benefits_Details.pdf", "role_library.pdf" };
- static async Task Main(string[] args)
- {
- var kernelSettings = KernelSettings.LoadSettings();
-
- using ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
- {
- builder
- .SetMinimumLevel(kernelSettings.LogLevel ?? LogLevel.Debug)
- .AddConsole()
- .AddDebug();
- });
-
- var memoryBuilder = new MemoryBuilder();
- var memory = memoryBuilder.WithLoggerFactory(loggerFactory)
- .WithQdrantMemoryStore(kernelSettings.QdrantEndpoint, 1536)
- .WithAzureOpenAITextEmbeddingGeneration(kernelSettings.EmbeddingDeploymentOrModelId,kernelSettings.Endpoint, kernelSettings.ApiKey)
- .Build();
-
-
- foreach (var file in files)
- {
- await ImportDocumentAsync(memory, file);
- Thread.Sleep(60000); //throttled to 1 request per minute
- }
- }
-
- public static async Task ImportDocumentAsync(ISemanticTextMemory memory, string filename)
- {
- var currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
- var filePath = Path.Combine(currentDirectory, filename);
- using var pdfDocument = PdfDocument.Open(File.OpenRead(filePath));
- var pages = pdfDocument.GetPages();
- foreach (var page in pages)
- {
- try
- {
- var text = ContentOrderTextExtractor.GetText(page);
- var descr = text.Take(100);
- await memory.SaveInformationAsync(
- collection: "vfcon106047",
- text: text,
- id: $"{Guid.NewGuid()}",
- description: $"Document: {descr}");
- }
- catch(Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/samples/support-center/seed-memory/README.md b/samples/support-center/seed-memory/README.md
deleted file mode 100644
index f87f5c14..00000000
--- a/samples/support-center/seed-memory/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# TODO
\ No newline at end of file
diff --git a/samples/support-center/src/backend/.dockerignore b/samples/support-center/src/backend/.dockerignore
deleted file mode 100644
index fe1152bd..00000000
--- a/samples/support-center/src/backend/.dockerignore
+++ /dev/null
@@ -1,30 +0,0 @@
-**/.classpath
-**/.dockerignore
-**/.env
-**/.git
-**/.gitignore
-**/.project
-**/.settings
-**/.toolstarget
-**/.vs
-**/.vscode
-**/*.*proj.user
-**/*.dbmdl
-**/*.jfm
-**/azds.yaml
-**/bin
-**/charts
-**/docker-compose*
-**/Dockerfile*
-**/node_modules
-**/npm-debug.log
-**/obj
-**/secrets.dev.yaml
-**/values.dev.yaml
-LICENSE
-README.md
-!**/.gitignore
-!.git/HEAD
-!.git/config
-!.git/packed-refs
-!.git/refs/heads/**
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Conversation/Conversation.cs b/samples/support-center/src/backend/Agents/Conversation/Conversation.cs
deleted file mode 100644
index 8a26d3f3..00000000
--- a/samples/support-center/src/backend/Agents/Conversation/Conversation.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
-using SupportCenter.Events;
-using SupportCenter.Extensions;
-using SupportCenter.Options;
-using SupportCenter.SignalRHub;
-
-namespace SupportCenter.Agents;
-[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class Conversation : AiAgent
-{
- private readonly ILogger _logger;
-
- protected override string Namespace => Consts.OrleansNamespace;
-
- public Conversation([PersistentState("state", "messages")] IPersistentState> state,
- ILogger logger,
- [FromKeyedServices("ConversationKernel")] Kernel kernel,
- [FromKeyedServices("ConversationMemory")] ISemanticTextMemory memory)
- : base(state, memory, kernel)
- {
- _logger = logger ?? throw new ArgumentNullException(nameof(logger));
- }
-
- public async override Task HandleEvent(Event item)
- {
- switch (item.Type)
- {
- case nameof(EventType.UserConnected):
- // The user reconnected, let's send the last message if we have one
- string? lastMessage = _state.State.History.LastOrDefault()?.Message;
- if (lastMessage == null)
- {
- return;
- }
- break;
- case nameof(EventType.ConversationRequested):
- string? userId = item.Data.GetValueOrDefault("userId");
- string? message = item.Data.GetValueOrDefault("message");
-
- string? conversationId = SignalRConnectionsDB.GetConversationId(userId);
- string id = $"{userId}/{conversationId}";
- _logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(Conversation), nameof(EventType.ConversationRequested), message);
- var context = new KernelArguments { ["input"] = AppendChatHistory(message) };
- string answer = await CallFunction(ConversationPrompts.Answer, context);
-
- await SendAnswerEvent(id, userId, answer);
- break;
-
- default:
- break;
- }
- }
-
- private async Task SendAnswerEvent(string id, string userId, string message)
- {
- await PublishEvent(Consts.OrleansNamespace, id, new Event
- {
- Type = nameof(EventType.ConversationRetrieved),
- Data = new Dictionary {
- { nameof(id), id },
- { nameof(userId), userId },
- { nameof(message), message }
- }
- });
- }
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Conversation/ConversationPrompts.cs b/samples/support-center/src/backend/Agents/Conversation/ConversationPrompts.cs
deleted file mode 100644
index d80df694..00000000
--- a/samples/support-center/src/backend/Agents/Conversation/ConversationPrompts.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace SupportCenter.Agents;
-
-public class ConversationPrompts
-{
- public static string Answer = """
- You are a helpful customer support/service agent at Contoso Electronics. Be polite, friendly and professional and answer briefly.
- Answer with a plain string ONLY, without any extra words or characters like '.
- Input: {{$input}}
- """;
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Conversation/ConversationState.cs b/samples/support-center/src/backend/Agents/Conversation/ConversationState.cs
deleted file mode 100644
index e3d1fce5..00000000
--- a/samples/support-center/src/backend/Agents/Conversation/ConversationState.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace SupportCenter.Agents;
-
-public class ConversationState
-{
-}
-
diff --git a/samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfo.cs b/samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfo.cs
deleted file mode 100644
index bc99472b..00000000
--- a/samples/support-center/src/backend/Agents/CustomerInfo/CustomerInfo.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.ChatCompletion;
-using Microsoft.SemanticKernel.Planning;
-using Orleans.Runtime;
-using SupportCenter.Data.CosmosDb;
-using SupportCenter.Events;
-using SupportCenter.Extensions;
-using SupportCenter.Options;
-
-namespace SupportCenter.Agents;
-
-[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class CustomerInfo : AiAgent
-{
- private readonly ILogger _logger;
- private readonly IServiceProvider _serviceProvider;
- private readonly ICustomerRepository _customerRepository;
- private readonly IChatCompletionService _chatCompletionService;
- protected override string Namespace => Consts.OrleansNamespace;
-
- public CustomerInfo(
- [PersistentState("state", "messages")] IPersistentState> state,
- ILogger logger,
- IServiceProvider serviceProvider,
- ICustomerRepository customerRepository,
- [FromKeyedServices("CustomerInfoKernel")] Kernel kernel)
- : base(state, default, kernel)
- {
- _logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
- _customerRepository = customerRepository ?? throw new ArgumentNullException(nameof(customerRepository));
- _chatCompletionService = _kernel.GetRequiredService();
- }
-
- public async override Task HandleEvent(Event item)
- {
- switch (item.Type)
- {
- case nameof(EventType.UserNewConversation):
- // The user started a new conversation.
- _state.State.History.Clear();
- break;
- case nameof(EventType.CustomerInfoRequested):
- var ssc = item.GetAgentData();
- string? userId = ssc.UserId;
- string? message = ssc.UserMessage;
- string? id = ssc.Id;
-
- _logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(CustomerInfo), item.Type, item.Data);
- await PublishEvent(Namespace, id, new Event
- {
- Type = nameof(EventType.CustomerInfoNotification),
- Data = new Dictionary
- {
- { nameof(userId), userId },
- { nameof(message), "I'm working on the user's request..." }
- }
- });
-
- // Get the customer info via the planners.
- var prompt = CustomerInfoPrompts.GetCustomerInfo
- .Replace("{{$userId}}", userId)
- .Replace("{{$userMessage}}", message)
- .Replace("{{$history}}", AppendChatHistory(message));
-
-#pragma warning disable SKEXP0060 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
- // FunctionCallingStepwisePlanner
- var planner = new FunctionCallingStepwisePlanner(new FunctionCallingStepwisePlannerOptions()
- {
- MaxIterations = 10,
- });
- var result = await planner.ExecuteAsync(_kernel, prompt);
- _logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(CustomerInfo), item.Type, result.FinalAnswer);
-
- await PublishEvent(Namespace, id, new Event
- {
- Type = nameof(EventType.CustomerInfoRetrieved),
- Data = new Dictionary
- {
- { nameof(userId), userId },
- { nameof(message), result.FinalAnswer }
- }
- });
-
- AddToHistory(result.FinalAnswer, ChatUserType.Agent);
-#pragma warning restore SKEXP0060 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
- break;
- default:
- break;
- }
- }
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Discount/Discount.cs b/samples/support-center/src/backend/Agents/Discount/Discount.cs
deleted file mode 100644
index 9530dd3c..00000000
--- a/samples/support-center/src/backend/Agents/Discount/Discount.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
-using SupportCenter.Events;
-using SupportCenter.Options;
-
-namespace SupportCenter.Agents;
-
-[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class Discount : AiAgent
-{
- private readonly ILogger _logger;
-
- protected override string Namespace => Consts.OrleansNamespace;
-
- public Discount([PersistentState("state", "messages")] IPersistentState> state,
- ILogger logger,
- [FromKeyedServices("DiscountKernel")] Kernel kernel,
- [FromKeyedServices("DiscountMemory")] ISemanticTextMemory memory)
- : base(state, memory, kernel)
- {
- _logger = logger ?? throw new ArgumentNullException(nameof(logger));
- }
-
- public async override Task HandleEvent(Event item)
- {
- switch (item.Type)
- {
- case nameof(EventType.UserConnected):
- // The user reconnected, let's send the last message if we have one
- string? lastMessage = _state.State.History.LastOrDefault()?.Message;
- if (lastMessage == null)
- {
- return;
- }
- break;
- default:
- break;
- }
- }
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Discount/DiscountState.cs b/samples/support-center/src/backend/Agents/Discount/DiscountState.cs
deleted file mode 100644
index 0044c467..00000000
--- a/samples/support-center/src/backend/Agents/Discount/DiscountState.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace SupportCenter.Agents;
-
-public class DiscountState
-{
-}
-
diff --git a/samples/support-center/src/backend/Agents/Dispatcher/DispatcherPrompts.cs b/samples/support-center/src/backend/Agents/Dispatcher/DispatcherPrompts.cs
deleted file mode 100644
index 21df24f8..00000000
--- a/samples/support-center/src/backend/Agents/Dispatcher/DispatcherPrompts.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-namespace SupportCenter.Agents;
-
-public class DispatcherPrompts
-{
- public static string GetIntent = """
- You are a dispatcher agent, working with the Support Center.
- You can help customers with their issues, and you can also assign tickets to other AI agents.
- Read the customer's message carefully, and then decide the appropriate intent.
- A history of the conversation is available to help you make a decision.
-
- If you don't know the intent, don't guess; instead respond with "Unknown".
- There may be multiple intents, but you should choose the most appropriate one.
- If you think that the message is not clear, you can ask the customer for more information.
-
- You can choose between the following intents:
- {{$choices}}
-
- Here are few examples:
- - User Input: Can you help me in updating my address?
- - CustomerInfo
-
- - User Input: Could you check whether my invoice has been correctly payed?
- - Invoice
-
- Here is the user input:
- User Input: {{$input}}
-
- Return the intent as a string.
- """;
-}
-
-public class Choice(string name, string description)
-{
- public string Name { get; set; } = name;
- public string Description { get; set; } = description;
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Dispatcher/DispatcherState.cs b/samples/support-center/src/backend/Agents/Dispatcher/DispatcherState.cs
deleted file mode 100644
index 3b6b0df6..00000000
--- a/samples/support-center/src/backend/Agents/Dispatcher/DispatcherState.cs
+++ /dev/null
@@ -1,5 +0,0 @@
-namespace SupportCenter.Agents;
-
-public class DispatcherState
-{
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Invoice/Invoice.cs b/samples/support-center/src/backend/Agents/Invoice/Invoice.cs
deleted file mode 100644
index 840a3bbc..00000000
--- a/samples/support-center/src/backend/Agents/Invoice/Invoice.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
-using SupportCenter.Events;
-using SupportCenter.Extensions;
-using SupportCenter.Options;
-
-namespace SupportCenter.Agents;
-
-[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class Invoice : AiAgent
-{
- private readonly ILogger _logger;
-
- protected override string Namespace => Consts.OrleansNamespace;
-
- public Invoice([PersistentState("state", "messages")] IPersistentState> state,
- ILogger logger,
- [FromKeyedServices("InvoiceKernel")] Kernel kernel,
- [FromKeyedServices("InvoiceMemory")] ISemanticTextMemory memory)
- : base(state, memory, kernel)
- {
- _logger = logger ?? throw new ArgumentNullException(nameof(logger));
- }
-
- public async override Task HandleEvent(Event item)
- {
- var ssc = item.GetAgentData();
- string? userId = ssc.UserId;
- string? message = ssc.UserMessage;
- string? id = ssc.Id;
-
- _logger.LogInformation($"userId: {userId}, message: {message}");
- if (userId == null || message == null)
- {
- _logger.LogWarning("[{Agent}]:[{EventType}]:[{EventData}]. Input is missing.", nameof(Dispatcher), item.Type, item.Data);
- return;
- }
-
- switch (item.Type)
- {
- case nameof(EventType.InvoiceRequested):
- {
- await SendAnswerEvent(id, userId, $"Please wait while I look up the details for invoice...");
- _logger.LogInformation("[{Agent}]:[{EventType}]:[{EventData}]", nameof(Invoice), nameof(EventType.InvoiceRequested), message);
-
- var querycontext = new KernelArguments { ["input"] = AppendChatHistory(message) };
- var instruction = "Consider the following knowledge:!invoices!";
- var enhancedContext = await AddKnowledge(instruction, "invoices", querycontext);
- string answer = await CallFunction(InvoicePrompts.InvoiceRequest, enhancedContext);
- await SendAnswerEvent(id, userId, answer);
- break;
- }
- default:
- break;
- }
- }
-
- private async Task SendAnswerEvent(string id, string userId, string message)
- {
- await PublishEvent(Namespace, id, new Event
- {
- Type = nameof(EventType.InvoiceRetrieved),
- Data = new Dictionary
- {
- { nameof(userId), userId },
- { nameof(message), message }
- }
- });
- }
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Invoice/InvoicePrompts.cs b/samples/support-center/src/backend/Agents/Invoice/InvoicePrompts.cs
deleted file mode 100644
index afcb0992..00000000
--- a/samples/support-center/src/backend/Agents/Invoice/InvoicePrompts.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-namespace SupportCenter.Agents;
-
-public class InvoicePrompts
-{
- public static string InvoiceRequest = """
- You are a helpful customer support/service agent that answers questions about user invoices based on your knowledge.
- Make sure that the invoice belongs to the specific user before providing the information. If needed, ask for the invoice id etc.
- Be polite and professional and answer briefly based on your knowledge ONLY.
- Invoice Id: {{$invoiceId}}
- Input: {{$input}}
- {{$invoices}}
- """;
-
- public static string ExtractInvoiceId = """
- Instructions: Extract the invoice-id from the user message
- You are expert in invoices and your goal is to extract the invoice-id from the user message.
- Answer with the invoice id found as a plain string ONLY, without any extra characters like '.
- If you can't find the invoice id, don't guess; instead answer with "Unknown".
-
- What is the total amount of my latest invoice?
- Unknown
-
- When is my invoice INV-100 due to payment?
- INV-100
-
- {{$input}}
-
- """;
-}
\ No newline at end of file
diff --git a/samples/support-center/src/backend/Agents/Invoice/InvoiceState.cs b/samples/support-center/src/backend/Agents/Invoice/InvoiceState.cs
deleted file mode 100644
index bd88a05c..00000000
--- a/samples/support-center/src/backend/Agents/Invoice/InvoiceState.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace SupportCenter.Agents;
-
-public class InvoiceState
-{
- [Id(0)]
- public string? InvoiceId { get; set; }
-}
-
diff --git a/samples/support-center/src/backend/Agents/QnA/QnA.cs b/samples/support-center/src/backend/Agents/QnA/QnA.cs
deleted file mode 100644
index cc64b233..00000000
--- a/samples/support-center/src/backend/Agents/QnA/QnA.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using Microsoft.AI.Agents.Abstractions;
-using Microsoft.AI.Agents.Orleans;
-using Microsoft.SemanticKernel;
-using Microsoft.SemanticKernel.Memory;
-using Orleans.Runtime;
-using SupportCenter.Events;
-using SupportCenter.Extensions;
-using SupportCenter.Options;
-
-namespace SupportCenter.Agents;
-[ImplicitStreamSubscription(Consts.OrleansNamespace)]
-public class QnA : AiAgent
-{
- private readonly ILogger _logger;
-
- protected override string Namespace => Consts.OrleansNamespace;
-
- public QnA([PersistentState("state", "messages")] IPersistentState