diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3d1ef47 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,94 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +AI-powered chat web app with Microsoft Entra ID authentication and Azure AI Foundry Agent Service integration. Single-container deployment on Azure Container Apps. + +## Commands + +### Frontend (from `frontend/`) +```bash +npm install --legacy-peer-deps # Install (--legacy-peer-deps required for React 19) +npm run dev # Vite dev server on :5173, proxies /api to :8080 +npm run build # TypeScript check + Vite production build +npm run lint # ESLint (no auto-fix) +``` + +### Backend (from `backend/WebApp.Api/`) +```bash +dotnet watch run # Dev server on :8080 with hot reload +dotnet build # Build +dotnet test # Run tests (from backend/) +``` + +### Full Stack Local Dev +```bash +# Option 1: VS Code compound task (Ctrl+Shift+B → "Start Dev") +# Option 2: PowerShell script +.\deployment\scripts\start-local-dev.ps1 +# Option 3: Run both manually in separate terminals +``` + +### Deployment (Azure Developer CLI) +```bash +azd up # Full deploy: infra + code (~10-12 min) +azd deploy # Code-only deploy (~3-5 min) +azd provision # Infrastructure only / update RBAC +azd down --force --purge # Teardown all Azure resources +``` + +## Architecture + +| Layer | Tech | Port | Entry Point | +|-------|------|------|-------------| +| Frontend | React 19 + TypeScript + Vite 7 | 5173 | `frontend/src/App.tsx` | +| Backend | ASP.NET Core 9 Minimal APIs | 8080 | `backend/WebApp.Api/Program.cs` | +| Auth | MSAL.js (PKCE) → JWT Bearer | — | `frontend/src/config/authConfig.ts` | +| AI SDK | Azure.AI.Projects + Agent Framework | — | `backend/.../Services/AgentFrameworkService.cs` | +| Deploy | Azure Container Apps (single container) | — | `infra/main.bicep` | + +**Key flow**: React SPA → MSAL token → `POST /api/chat/stream` → AI Foundry Agent → SSE chunks → UI + +### Single-Container Pattern +Production: Vite builds React to static files → ASP.NET Core serves them from `wwwroot` alongside the API. Both live in one Docker image (`deployment/docker/frontend.Dockerfile` — multi-stage: Node build → .NET build → runtime). + +### Frontend Architecture +- **State**: Centralized `AppContext` with `useReducer` + typed discriminated-union actions (`frontend/src/reducers/appReducer.ts`). Dev-mode logging middleware logs state diffs. +- **Components**: Container/Presentation split — `AgentPreview.tsx` (state wiring) → `ChatInterface.tsx` (stateless UI) → chat subcomponents in `frontend/src/components/chat/`. +- **Streaming**: `ChatService` class (`frontend/src/services/chatService.ts`) uses `fetch` + `ReadableStream` reader for SSE. Supports `AbortController` cancellation and retry with exponential backoff. +- **Path alias**: `~` maps to `frontend/src/` in Vite config. +- **UI library**: Fluent UI v9 + `@fluentui-copilot` components. + +### Backend Architecture +- **Minimal API** endpoints defined inline in `Program.cs` (no controllers). +- **SSE streaming**: Writes `text/event-stream` events directly to `HttpResponse` with manual flush. Event types: `conversationId`, `chunk`, `annotations`, `mcpApprovalRequest`, `usage`, `done`, `error`. +- **Auth**: `Microsoft.Identity.Web` validates JWT with dual audience (`api://{clientId}` and `{clientId}`). Policy `RequireChatScope` requires `Chat.ReadWrite` scope. +- **AI integration**: `AgentFrameworkService` wraps `Azure.AI.Projects` SDK (beta) for agent loading and streaming. Uses `ChainedTokenCredential` (AzureCLI locally, ManagedIdentity in production). + +### API Endpoints +| Endpoint | Method | Purpose | +|----------|--------|---------| +| `/api/chat/stream` | POST | Send message, receive SSE streaming response | +| `/api/agent` | GET | Get agent metadata (name, description, starter prompts) | +| `/api/agent/info` | GET | Debug info about loaded agent | +| `/api/health` | GET | Authenticated health check | + +### Environment Variables +**Backend** (`.env` in project root, auto-generated by `azd up`): +- `ENTRA_SPA_CLIENT_ID`, `ENTRA_TENANT_ID` — Auth config +- `AI_AGENT_ENDPOINT`, `AI_AGENT_ID` — AI Foundry connection + +**Frontend** (`frontend/.env.local`, auto-generated by `azd up`): +- `VITE_ENTRA_SPA_CLIENT_ID`, `VITE_ENTRA_TENANT_ID` — Build-time only (accessed via `import.meta.env.VITE_*`) + +Vite config also reads from `.azure/{envName}/.env` if present (azd environment store). + +## Key Dependencies +- `Azure.AI.Projects` v1.2.0-beta.5 and `Microsoft.Agents.AI.AzureAI` v1.0.0-preview — beta SDKs, APIs may change +- React 19 requires `--legacy-peer-deps` for npm install; explicitly add peer deps like `yjs` in `package.json` +- Office documents (DOCX/PPTX/XLSX) are not supported for upload + +## Infrastructure +Bicep templates in `infra/` deploy: Azure Container Apps, ACR (Basic), Log Analytics, system-assigned Managed Identity. Deployment hooks in `deployment/hooks/` handle Entra app registration, AI Foundry discovery, and RBAC assignment via PowerShell. diff --git a/backend/WebApp.Api.Tests/Endpoints/AgentEndpointsTests.cs b/backend/WebApp.Api.Tests/Endpoints/AgentEndpointsTests.cs new file mode 100644 index 0000000..b97ac49 --- /dev/null +++ b/backend/WebApp.Api.Tests/Endpoints/AgentEndpointsTests.cs @@ -0,0 +1,300 @@ +using System.Net; +using System.Net.Http.Json; +using System.Text.Json; +using Moq; +using WebApp.Api.Models; + +namespace WebApp.Api.Tests.Endpoints; + +public class CreateAgentEndpointTests : IClassFixture +{ + private readonly HttpClient _client; + private readonly Mock _mockService; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public CreateAgentEndpointTests(TestWebApplicationFactory factory) + { + _mockService = factory.MockAgentCrudService; + _client = factory.CreateClient(); + } + + [Fact] + public async Task CreateAgent_ValidRequest_Returns201() + { + var request = new CreateAgentRequest + { + Name = "test-agent", + Model = "gpt-4o", + Instructions = "You are a helpful assistant." + }; + + var expectedResponse = new CreateAgentResponse + { + Name = "test-agent", + Version = "1.0", + Description = null, + Model = "gpt-4o", + Instructions = "You are a helpful assistant.", + CreatedAt = 1700000000 + }; + + _mockService.Setup(s => s.CreateAgentAsync( + It.Is(r => r.Name == "test-agent"), + It.IsAny())) + .ReturnsAsync(expectedResponse); + + var response = await _client.PostAsJsonAsync("/api/agents", request, JsonOptions); + + Assert.Equal(HttpStatusCode.Created, response.StatusCode); + Assert.Equal("/api/agents/test-agent", response.Headers.Location?.OriginalString); + + var body = await response.Content.ReadFromJsonAsync(JsonOptions); + Assert.NotNull(body); + Assert.Equal("test-agent", body.Name); + Assert.Equal("1.0", body.Version); + Assert.Equal("gpt-4o", body.Model); + } + + [Fact] + public async Task CreateAgent_WithAllFields_Returns201() + { + var request = new CreateAgentRequest + { + Name = "full-agent", + Model = "gpt-4o", + Instructions = "You are helpful.", + Description = "Full test agent", + Temperature = 0.7f, + TopP = 0.9f, + Metadata = new Dictionary { ["env"] = "test" } + }; + + var expectedResponse = new CreateAgentResponse + { + Name = "full-agent", + Version = "1.0", + Description = "Full test agent", + Model = "gpt-4o", + Instructions = "You are helpful.", + CreatedAt = 1700000000, + Metadata = new Dictionary { ["env"] = "test" } + }; + + _mockService.Setup(s => s.CreateAgentAsync( + It.Is(r => r.Name == "full-agent" && r.Temperature == 0.7f), + It.IsAny())) + .ReturnsAsync(expectedResponse); + + var response = await _client.PostAsJsonAsync("/api/agents", request, JsonOptions); + + Assert.Equal(HttpStatusCode.Created, response.StatusCode); + + var body = await response.Content.ReadFromJsonAsync(JsonOptions); + Assert.NotNull(body); + Assert.Equal("Full test agent", body.Description); + Assert.Equal(1700000000, body.CreatedAt); + Assert.NotNull(body.Metadata); + Assert.Equal("test", body.Metadata["env"]); + } + + [Fact] + public async Task CreateAgent_EmptyName_Returns400() + { + var request = new CreateAgentRequest + { + Name = "", + Model = "gpt-4o", + Instructions = "test" + }; + + var response = await _client.PostAsJsonAsync("/api/agents", request, JsonOptions); + + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + + var body = await response.Content.ReadAsStringAsync(); + Assert.Contains("Name is required", body); + } + + [Fact] + public async Task CreateAgent_WhitespaceName_Returns400() + { + var request = new CreateAgentRequest + { + Name = " ", + Model = "gpt-4o", + Instructions = "test" + }; + + var response = await _client.PostAsJsonAsync("/api/agents", request, JsonOptions); + + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + [Fact] + public async Task CreateAgent_EmptyModel_Returns400() + { + var request = new CreateAgentRequest + { + Name = "test", + Model = "", + Instructions = "test" + }; + + var response = await _client.PostAsJsonAsync("/api/agents", request, JsonOptions); + + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + + var body = await response.Content.ReadAsStringAsync(); + Assert.Contains("Model is required", body); + } + + [Fact] + public async Task CreateAgent_EmptyInstructions_Returns400() + { + var request = new CreateAgentRequest + { + Name = "test", + Model = "gpt-4o", + Instructions = "" + }; + + var response = await _client.PostAsJsonAsync("/api/agents", request, JsonOptions); + + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + + var body = await response.Content.ReadAsStringAsync(); + Assert.Contains("Instructions are required", body); + } + + [Fact] + public async Task CreateAgent_ServiceThrows_Returns500() + { + var request = new CreateAgentRequest + { + Name = "error-agent", + Model = "gpt-4o", + Instructions = "test" + }; + + _mockService.Setup(s => s.CreateAgentAsync( + It.Is(r => r.Name == "error-agent"), + It.IsAny())) + .ThrowsAsync(new InvalidOperationException("Azure SDK error")); + + var response = await _client.PostAsJsonAsync("/api/agents", request, JsonOptions); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + } +} + +public class ListAgentsEndpointTests : IClassFixture +{ + private readonly HttpClient _client; + private readonly Mock _mockService; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public ListAgentsEndpointTests(TestWebApplicationFactory factory) + { + _mockService = factory.MockAgentCrudService; + _client = factory.CreateClient(); + } + + [Fact] + public async Task ListAgents_ReturnsAgents() + { + var expectedResponse = new AgentListResponse + { + Agents = new List + { + new() { Name = "agent-1", Id = "id1", Model = "gpt-4o", CreatedAt = 100, Description = "First" }, + new() { Name = "agent-2", Id = "id2", Model = "gpt-4o-mini", CreatedAt = 200 } + }, + TotalCount = 2 + }; + + _mockService.Setup(s => s.ListAgentsAsync( + null, + It.IsAny())) + .ReturnsAsync(expectedResponse); + + var response = await _client.GetAsync("/api/agents"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var body = await response.Content.ReadFromJsonAsync(JsonOptions); + Assert.NotNull(body); + Assert.Equal(2, body.TotalCount); + Assert.Equal(2, body.Agents.Count); + Assert.Equal("agent-1", body.Agents[0].Name); + Assert.Equal("agent-2", body.Agents[1].Name); + } + + [Fact] + public async Task ListAgents_WithLimit_PassesLimitToService() + { + var expectedResponse = new AgentListResponse + { + Agents = new List + { + new() { Name = "agent-1", Id = "id1", Model = "gpt-4o", CreatedAt = 100 } + }, + TotalCount = 1 + }; + + _mockService.Setup(s => s.ListAgentsAsync( + 5, + It.IsAny())) + .ReturnsAsync(expectedResponse); + + var response = await _client.GetAsync("/api/agents?limit=5"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var body = await response.Content.ReadFromJsonAsync(JsonOptions); + Assert.NotNull(body); + Assert.Single(body.Agents); + } + + [Fact] + public async Task ListAgents_EmptyResult_ReturnsEmptyList() + { + var expectedResponse = new AgentListResponse + { + Agents = new List(), + TotalCount = 0 + }; + + _mockService.Setup(s => s.ListAgentsAsync( + It.IsAny(), + It.IsAny())) + .ReturnsAsync(expectedResponse); + + var response = await _client.GetAsync("/api/agents"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var body = await response.Content.ReadFromJsonAsync(JsonOptions); + Assert.NotNull(body); + Assert.Empty(body.Agents); + Assert.Equal(0, body.TotalCount); + } + + [Fact] + public async Task ListAgents_ServiceThrows_Returns500() + { + _mockService.Setup(s => s.ListAgentsAsync( + It.IsAny(), + It.IsAny())) + .ThrowsAsync(new InvalidOperationException("Connection failed")); + + var response = await _client.GetAsync("/api/agents"); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + } +} diff --git a/backend/WebApp.Api.Tests/Models/AgentModelsTests.cs b/backend/WebApp.Api.Tests/Models/AgentModelsTests.cs new file mode 100644 index 0000000..a02b7b9 --- /dev/null +++ b/backend/WebApp.Api.Tests/Models/AgentModelsTests.cs @@ -0,0 +1,207 @@ +using System.Text.Json; +using WebApp.Api.Models; + +namespace WebApp.Api.Tests.Models; + +public class AgentModelsTests +{ + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + // -- CreateAgentRequest -- + + [Fact] + public void CreateAgentRequest_DeserializesFromJson() + { + var json = """ + { + "name": "test-agent", + "model": "gpt-4o", + "instructions": "You are a test.", + "description": "A test agent", + "temperature": 0.7, + "topP": 0.9, + "metadata": { "env": "test" } + } + """; + + var request = JsonSerializer.Deserialize(json, JsonOptions); + + Assert.NotNull(request); + Assert.Equal("test-agent", request.Name); + Assert.Equal("gpt-4o", request.Model); + Assert.Equal("You are a test.", request.Instructions); + Assert.Equal("A test agent", request.Description); + Assert.Equal(0.7f, request.Temperature); + Assert.Equal(0.9f, request.TopP); + Assert.NotNull(request.Metadata); + Assert.Equal("test", request.Metadata["env"]); + } + + [Fact] + public void CreateAgentRequest_DeserializesMinimalJson() + { + var json = """ + { + "name": "minimal", + "model": "gpt-4o", + "instructions": "Be helpful." + } + """; + + var request = JsonSerializer.Deserialize(json, JsonOptions); + + Assert.NotNull(request); + Assert.Equal("minimal", request.Name); + Assert.Null(request.Description); + Assert.Null(request.Temperature); + Assert.Null(request.TopP); + Assert.Null(request.Metadata); + } + + [Fact] + public void CreateAgentRequest_RoundTrips() + { + var original = new CreateAgentRequest + { + Name = "roundtrip", + Model = "gpt-4o", + Instructions = "Test instructions", + Description = "Test desc", + Temperature = 0.5f, + TopP = 0.8f, + Metadata = new Dictionary { ["key"] = "value" } + }; + + var json = JsonSerializer.Serialize(original, JsonOptions); + var deserialized = JsonSerializer.Deserialize(json, JsonOptions); + + Assert.NotNull(deserialized); + Assert.Equal(original.Name, deserialized.Name); + Assert.Equal(original.Model, deserialized.Model); + Assert.Equal(original.Instructions, deserialized.Instructions); + Assert.Equal(original.Description, deserialized.Description); + Assert.Equal(original.Temperature, deserialized.Temperature); + Assert.Equal(original.TopP, deserialized.TopP); + Assert.Equal(original.Metadata["key"], deserialized.Metadata!["key"]); + } + + // -- CreateAgentResponse -- + + [Fact] + public void CreateAgentResponse_SerializesToJson() + { + var response = new CreateAgentResponse + { + Name = "my-agent", + Version = "1.0", + Description = "desc", + Model = "gpt-4o", + Instructions = "Be helpful.", + CreatedAt = 1700000000, + Metadata = new Dictionary { ["key"] = "val" } + }; + + var json = JsonSerializer.Serialize(response, JsonOptions); + var doc = JsonDocument.Parse(json); + var root = doc.RootElement; + + Assert.Equal("my-agent", root.GetProperty("name").GetString()); + Assert.Equal("1.0", root.GetProperty("version").GetString()); + Assert.Equal("desc", root.GetProperty("description").GetString()); + Assert.Equal("gpt-4o", root.GetProperty("model").GetString()); + Assert.Equal("Be helpful.", root.GetProperty("instructions").GetString()); + Assert.Equal(1700000000, root.GetProperty("createdAt").GetInt64()); + Assert.Equal("val", root.GetProperty("metadata").GetProperty("key").GetString()); + } + + [Fact] + public void CreateAgentResponse_NullableFieldsOmittedWhenNull() + { + var response = new CreateAgentResponse + { + Name = "agent", + Version = "latest", + Model = "gpt-4o", + Instructions = "test", + CreatedAt = 0 + }; + + var json = JsonSerializer.Serialize(response, JsonOptions); + var doc = JsonDocument.Parse(json); + var root = doc.RootElement; + + Assert.True(root.TryGetProperty("description", out var desc)); + Assert.Equal(JsonValueKind.Null, desc.ValueKind); + Assert.True(root.TryGetProperty("metadata", out var meta)); + Assert.Equal(JsonValueKind.Null, meta.ValueKind); + } + + // -- AgentListItem -- + + [Fact] + public void AgentListItem_SerializesToJson() + { + var item = new AgentListItem + { + Name = "agent-1", + Id = "abc123", + Description = "First agent", + Model = "gpt-4o", + CreatedAt = 1700000000 + }; + + var json = JsonSerializer.Serialize(item, JsonOptions); + var doc = JsonDocument.Parse(json); + var root = doc.RootElement; + + Assert.Equal("agent-1", root.GetProperty("name").GetString()); + Assert.Equal("abc123", root.GetProperty("id").GetString()); + Assert.Equal("First agent", root.GetProperty("description").GetString()); + Assert.Equal("gpt-4o", root.GetProperty("model").GetString()); + Assert.Equal(1700000000, root.GetProperty("createdAt").GetInt64()); + } + + // -- AgentListResponse -- + + [Fact] + public void AgentListResponse_SerializesToJson() + { + var response = new AgentListResponse + { + Agents = new List + { + new() { Name = "a1", Id = "1", Model = "gpt-4o", CreatedAt = 100 }, + new() { Name = "a2", Id = "2", Model = "gpt-4o-mini", CreatedAt = 200 } + }, + TotalCount = 2 + }; + + var json = JsonSerializer.Serialize(response, JsonOptions); + var doc = JsonDocument.Parse(json); + var root = doc.RootElement; + + Assert.Equal(2, root.GetProperty("totalCount").GetInt32()); + Assert.Equal(2, root.GetProperty("agents").GetArrayLength()); + Assert.Equal("a1", root.GetProperty("agents")[0].GetProperty("name").GetString()); + Assert.Equal("a2", root.GetProperty("agents")[1].GetProperty("name").GetString()); + } + + [Fact] + public void AgentListResponse_EmptyList() + { + var response = new AgentListResponse + { + Agents = new List(), + TotalCount = 0 + }; + + var json = JsonSerializer.Serialize(response, JsonOptions); + var doc = JsonDocument.Parse(json); + + Assert.Equal(0, doc.RootElement.GetProperty("totalCount").GetInt32()); + Assert.Equal(0, doc.RootElement.GetProperty("agents").GetArrayLength()); + } +} diff --git a/backend/WebApp.Api.Tests/TestWebApplicationFactory.cs b/backend/WebApp.Api.Tests/TestWebApplicationFactory.cs new file mode 100644 index 0000000..412344f --- /dev/null +++ b/backend/WebApp.Api.Tests/TestWebApplicationFactory.cs @@ -0,0 +1,94 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Moq; +using WebApp.Api.Services; +using System.Security.Claims; +using System.Text.Encodings.Web; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace WebApp.Api.Tests; + +/// +/// Custom WebApplicationFactory that: +/// - Provides fake Azure config so the app can start +/// - Replaces IAgentCrudService with a mock +/// - Uses a fake auth handler to bypass Entra ID +/// +public class TestWebApplicationFactory : WebApplicationFactory +{ + public Mock MockAgentCrudService { get; } = new(); + + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder.UseEnvironment("Development"); + + // Provide fake config values so AgentFrameworkService constructor doesn't throw + // during DI registration (it's still registered but we override the interface) + Environment.SetEnvironmentVariable("AI_AGENT_ENDPOINT", "https://fake-test-endpoint.openai.azure.com"); + Environment.SetEnvironmentVariable("AI_AGENT_ID", "fake-test-agent"); + Environment.SetEnvironmentVariable("ENTRA_SPA_CLIENT_ID", "00000000-0000-0000-0000-000000000000"); + Environment.SetEnvironmentVariable("ENTRA_TENANT_ID", "00000000-0000-0000-0000-000000000001"); + + builder.ConfigureServices(services => + { + // Replace IAgentCrudService with our mock + services.RemoveAll(); + services.AddScoped(_ => MockAgentCrudService.Object); + + // Replace authentication with a fake handler that always succeeds + services.AddAuthentication("Test") + .AddScheme("Test", _ => { }); + + // Override default auth scheme + services.PostConfigure(options => + { + options.DefaultAuthenticateScheme = "Test"; + options.DefaultChallengeScheme = "Test"; + }); + }); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + { + Environment.SetEnvironmentVariable("AI_AGENT_ENDPOINT", null); + Environment.SetEnvironmentVariable("AI_AGENT_ID", null); + Environment.SetEnvironmentVariable("ENTRA_SPA_CLIENT_ID", null); + Environment.SetEnvironmentVariable("ENTRA_TENANT_ID", null); + } + } +} + +/// +/// Fake authentication handler that issues a token with the required Chat.ReadWrite scope. +/// +public class FakeAuthHandler : AuthenticationHandler +{ + public FakeAuthHandler( + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder) + : base(options, logger, encoder) { } + + protected override Task HandleAuthenticateAsync() + { + var claims = new[] + { + new Claim("oid", "test-user-id"), + new Claim("name", "Test User"), + new Claim("http://schemas.microsoft.com/identity/claims/scope", "Chat.ReadWrite"), + }; + + var identity = new ClaimsIdentity(claims, "Test"); + var principal = new ClaimsPrincipal(identity); + var ticket = new AuthenticationTicket(principal, "Test"); + + return Task.FromResult(AuthenticateResult.Success(ticket)); + } +} diff --git a/backend/WebApp.Api.Tests/WebApp.Api.Tests.csproj b/backend/WebApp.Api.Tests/WebApp.Api.Tests.csproj new file mode 100644 index 0000000..0a4fb03 --- /dev/null +++ b/backend/WebApp.Api.Tests/WebApp.Api.Tests.csproj @@ -0,0 +1,27 @@ + + + + net9.0 + enable + enable + false + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/WebApp.Api/Models/AgentModels.cs b/backend/WebApp.Api/Models/AgentModels.cs new file mode 100644 index 0000000..ed4b26b --- /dev/null +++ b/backend/WebApp.Api/Models/AgentModels.cs @@ -0,0 +1,38 @@ +namespace WebApp.Api.Models; + +public record CreateAgentRequest +{ + public required string Name { get; init; } + public required string Model { get; init; } + public required string Instructions { get; init; } + public string? Description { get; init; } + public Dictionary? Metadata { get; init; } + public float? Temperature { get; init; } + public float? TopP { get; init; } +} + +public record CreateAgentResponse +{ + public required string Name { get; init; } + public required string Version { get; init; } + public string? Description { get; init; } + public required string Model { get; init; } + public required string Instructions { get; init; } + public required long CreatedAt { get; init; } + public Dictionary? Metadata { get; init; } +} + +public record AgentListItem +{ + public required string Name { get; init; } + public required string Id { get; init; } + public string? Description { get; init; } + public required string Model { get; init; } + public required long CreatedAt { get; init; } +} + +public record AgentListResponse +{ + public required List Agents { get; init; } + public required int TotalCount { get; init; } +} diff --git a/backend/WebApp.Api/Models/ChatRequest.cs b/backend/WebApp.Api/Models/ChatRequest.cs index 4df3c6e..a5a76ba 100644 --- a/backend/WebApp.Api/Models/ChatRequest.cs +++ b/backend/WebApp.Api/Models/ChatRequest.cs @@ -22,6 +22,10 @@ public record ChatRequest /// Response ID to continue from (for MCP approval flow). /// public string? PreviousResponseId { get; init; } + /// + /// Optional agent ID to use instead of the default configured agent. + /// + public string? AgentId { get; init; } } /// diff --git a/backend/WebApp.Api/Program.cs b/backend/WebApp.Api/Program.cs index 5476aa8..dc32d42 100644 --- a/backend/WebApp.Api/Program.cs +++ b/backend/WebApp.Api/Program.cs @@ -124,6 +124,7 @@ // Register Azure AI Agent Service for Azure AI Foundry v2 Agents // Uses Azure.AI.Projects SDK which works with v2 Agents API (/agents/ endpoint with human-readable IDs). builder.Services.AddScoped(); +builder.Services.AddScoped(sp => sp.GetRequiredService()); var app = builder.Build(); @@ -198,6 +199,7 @@ request.FileDataUris, request.PreviousResponseId, request.McpApproval, + request.AgentId, cancellationToken)) { if (chunk.IsText && chunk.TextDelta != null) @@ -398,7 +400,77 @@ static async Task WriteErrorEvent(HttpResponse response, string message, Cancell .RequireAuthorization(ScopePolicyName) .WithName("GetAgentInfo"); +// Create a new agent +app.MapPost("/api/agents", async ( + CreateAgentRequest request, + IAgentCrudService agentCrudService, + IHostEnvironment environment, + CancellationToken cancellationToken) => +{ + try + { + if (string.IsNullOrWhiteSpace(request.Name)) + return Results.Problem(title: "Invalid Request", detail: "Name is required.", statusCode: 400); + if (string.IsNullOrWhiteSpace(request.Model)) + return Results.Problem(title: "Invalid Request", detail: "Model is required.", statusCode: 400); + if (string.IsNullOrWhiteSpace(request.Instructions)) + return Results.Problem(title: "Invalid Request", detail: "Instructions are required.", statusCode: 400); + + var response = await agentCrudService.CreateAgentAsync(request, cancellationToken); + return Results.Created($"/api/agents/{response.Name}", response); + } + catch (Exception ex) + { + var errorResponse = ErrorResponseFactory.CreateFromException( + ex, + 500, + environment.IsDevelopment()); + + return Results.Problem( + title: errorResponse.Title, + detail: errorResponse.Detail, + statusCode: errorResponse.Status, + extensions: errorResponse.Extensions + ); + } +}) +.RequireAuthorization(ScopePolicyName) +.WithName("CreateAgent"); + +// List agents +app.MapGet("/api/agents", async ( + int? limit, + IAgentCrudService agentCrudService, + IHostEnvironment environment, + CancellationToken cancellationToken) => +{ + try + { + var response = await agentCrudService.ListAgentsAsync(limit, cancellationToken); + return Results.Ok(response); + } + catch (Exception ex) + { + var errorResponse = ErrorResponseFactory.CreateFromException( + ex, + 500, + environment.IsDevelopment()); + + return Results.Problem( + title: errorResponse.Title, + detail: errorResponse.Detail, + statusCode: errorResponse.Status, + extensions: errorResponse.Extensions + ); + } +}) +.RequireAuthorization(ScopePolicyName) +.WithName("ListAgents"); + // Fallback route for SPA - serve index.html for any non-API routes app.MapFallbackToFile("index.html"); app.Run(); + +// Make Program accessible to WebApplicationFactory in test project +public partial class Program { } diff --git a/backend/WebApp.Api/Services/AgentFrameworkService.cs b/backend/WebApp.Api/Services/AgentFrameworkService.cs index 5b933de..4b6b6c6 100644 --- a/backend/WebApp.Api/Services/AgentFrameworkService.cs +++ b/backend/WebApp.Api/Services/AgentFrameworkService.cs @@ -20,7 +20,7 @@ namespace WebApp.Api.Services; /// and direct ProjectResponsesClient for streaming (required for annotations, MCP approvals). /// See .github/skills/researching-azure-ai-sdk/SKILL.md for SDK patterns. /// -public class AgentFrameworkService : IDisposable +public class AgentFrameworkService : IAgentCrudService, IDisposable { private readonly AIProjectClient _projectClient; private readonly string _agentId; @@ -142,13 +142,17 @@ public async IAsyncEnumerable StreamMessageAsync( List? fileDataUris = null, string? previousResponseId = null, McpApprovalResponse? mcpApproval = null, + string? agentId = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { ObjectDisposedException.ThrowIf(_disposed, this); + var effectiveAgentId = !string.IsNullOrEmpty(agentId) ? agentId : _agentId; + _logger.LogInformation( - "Streaming message to conversation: {ConversationId}, ImageCount: {ImageCount}, FileCount: {FileCount}, HasApproval: {HasApproval}", + "Streaming message to conversation: {ConversationId}, AgentId: {AgentId}, ImageCount: {ImageCount}, FileCount: {FileCount}, HasApproval: {HasApproval}", conversationId, + effectiveAgentId, imageDataUris?.Count ?? 0, fileDataUris?.Count ?? 0, mcpApproval != null); @@ -156,7 +160,7 @@ public async IAsyncEnumerable StreamMessageAsync( // Get ProjectResponsesClient for the agent and conversation ProjectResponsesClient responsesClient = _projectClient.OpenAI.GetProjectResponsesClientForAgent( - new AgentReference(_agentId), + new AgentReference(effectiveAgentId), conversationId); CreateResponseOptions options = new() { StreamingEnabled = true }; @@ -719,6 +723,98 @@ public async Task GetAgentInfoAsync(CancellationToken cancellationToken public (int InputTokens, int OutputTokens, int TotalTokens)? GetLastUsage() => _lastUsage is null ? null : (_lastUsage.InputTokenCount, _lastUsage.OutputTokenCount, _lastUsage.TotalTokenCount); + /// + /// Create a new agent version via the v2 Agents API. + /// + public async Task CreateAgentAsync( + CreateAgentRequest request, + CancellationToken cancellationToken = default) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + _logger.LogInformation("Creating agent: {Name}, Model: {Model}", request.Name, request.Model); + + var definition = new PromptAgentDefinition(request.Model) + { + Instructions = request.Instructions, + Temperature = request.Temperature, + TopP = request.TopP + }; + + var options = new AgentVersionCreationOptions(definition) + { + Description = request.Description + }; + + if (request.Metadata != null) + { + foreach (var (key, value) in request.Metadata) + { + options.Metadata[key] = value; + } + } + + var result = await _projectClient.Agents.CreateAgentVersionAsync( + request.Name, options, cancellationToken); + + var agentVersion = result.Value; + var promptDef = agentVersion.Definition as PromptAgentDefinition; + + _logger.LogInformation( + "Created agent: {Name}, Version: {Version}", + agentVersion.Name, agentVersion.Version); + + return new CreateAgentResponse + { + Name = agentVersion.Name ?? request.Name, + Version = agentVersion.Version ?? "latest", + Description = agentVersion.Description, + Model = promptDef?.Model ?? request.Model, + Instructions = promptDef?.Instructions ?? request.Instructions, + CreatedAt = agentVersion.CreatedAt.ToUnixTimeSeconds(), + Metadata = agentVersion.Metadata?.ToDictionary(kvp => kvp.Key, kvp => kvp.Value) + }; + } + + /// + /// List agents via the v2 Agents API. + /// + public async Task ListAgentsAsync( + int? limit = null, + CancellationToken cancellationToken = default) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + _logger.LogInformation("Listing agents, limit: {Limit}", limit); + + var agents = new List(); + + await foreach (var record in _projectClient.Agents.GetAgentsAsync( + kind: null, limit: limit, order: null, after: null, before: null, + cancellationToken: cancellationToken)) + { + var latestVersion = record.Versions?.Latest; + var definition = latestVersion?.Definition as PromptAgentDefinition; + + agents.Add(new AgentListItem + { + Name = record.Name ?? record.Id, + Id = record.Id, + Description = latestVersion?.Description, + Model = definition?.Model ?? string.Empty, + CreatedAt = latestVersion?.CreatedAt.ToUnixTimeSeconds() ?? 0 + }); + } + + _logger.LogInformation("Listed {Count} agents", agents.Count); + + return new AgentListResponse + { + Agents = agents, + TotalCount = agents.Count + }; + } + public void Dispose() { if (!_disposed) diff --git a/backend/WebApp.Api/Services/IAgentCrudService.cs b/backend/WebApp.Api/Services/IAgentCrudService.cs new file mode 100644 index 0000000..17c8475 --- /dev/null +++ b/backend/WebApp.Api/Services/IAgentCrudService.cs @@ -0,0 +1,12 @@ +using WebApp.Api.Models; + +namespace WebApp.Api.Services; + +/// +/// Interface for agent CRUD operations, enabling testability of endpoints. +/// +public interface IAgentCrudService +{ + Task CreateAgentAsync(CreateAgentRequest request, CancellationToken cancellationToken = default); + Task ListAgentsAsync(int? limit = null, CancellationToken cancellationToken = default); +} diff --git a/backend/WebApp.Api/WebApp.Api.csproj b/backend/WebApp.Api/WebApp.Api.csproj index 8546fac..96de7dc 100644 --- a/backend/WebApp.Api/WebApp.Api.csproj +++ b/backend/WebApp.Api/WebApp.Api.csproj @@ -7,6 +7,10 @@ e523184f-8410-46c3-b331-b2f38fba7e1f + + + + diff --git a/backend/WebApp.sln b/backend/WebApp.sln index 878375d..db2ba39 100644 --- a/backend/WebApp.sln +++ b/backend/WebApp.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApp.ServiceDefaults", "W EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApp.Api", "WebApp.Api\WebApp.Api.csproj", "{57812A12-8EB0-41D2-A2D7-55B6494A76F8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApp.Api.Tests", "WebApp.Api.Tests\WebApp.Api.Tests.csproj", "{169FB58D-E0B6-4FB3-B947-853B31E3575F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,6 +43,18 @@ Global {57812A12-8EB0-41D2-A2D7-55B6494A76F8}.Release|x64.Build.0 = Release|Any CPU {57812A12-8EB0-41D2-A2D7-55B6494A76F8}.Release|x86.ActiveCfg = Release|Any CPU {57812A12-8EB0-41D2-A2D7-55B6494A76F8}.Release|x86.Build.0 = Release|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Debug|x64.ActiveCfg = Debug|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Debug|x64.Build.0 = Debug|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Debug|x86.ActiveCfg = Debug|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Debug|x86.Build.0 = Debug|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Release|Any CPU.Build.0 = Release|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Release|x64.ActiveCfg = Release|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Release|x64.Build.0 = Release|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Release|x86.ActiveCfg = Release|Any CPU + {169FB58D-E0B6-4FB3-B947-853B31E3575F}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index b19330b..10c8447 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -3,21 +3,29 @@ import globals from 'globals' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' import tseslint from 'typescript-eslint' -import { defineConfig, globalIgnores } from 'eslint/config' -export default defineConfig([ - globalIgnores(['dist']), +export default tseslint.config( + { ignores: ['dist'] }, { files: ['**/*.{ts,tsx}'], extends: [ js.configs.recommended, - tseslint.configs.recommended, - reactHooks.configs['recommended-latest'], - reactRefresh.configs.vite, + ...tseslint.configs.recommended, ], + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, }, -]) +) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e5f4b74..5075ecd 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -28,59 +28,59 @@ "yjs": "^13.6.29" }, "devDependencies": { - "@eslint/js": "^9.39.1", + "@eslint/js": "^10.0.1", "@types/node": "^24.10.1", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/react-syntax-highlighter": "^15.5.13", "@vitejs/plugin-react": "^5.1.1", - "eslint": "^9.39.1", + "eslint": "^10.0.0", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.22", + "eslint-plugin-react-refresh": "^0.5.0", "globals": "^16.5.0", "typescript": "~5.9.3", - "typescript-eslint": "^8.48.1", + "typescript-eslint": "^8.56.0", "vite": "^7.2.6" } }, "node_modules/@azure/msal-browser": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.27.0.tgz", - "integrity": "sha512-bZ8Pta6YAbdd0o0PEaL1/geBsPrLEnyY/RDWqvF1PP9RUH8EMLvUMGoZFYS6jSlUan6KZ9IMTLCnwpWWpQRK/w==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.28.2.tgz", + "integrity": "sha512-6vYUMvs6kJxJgxaCmHn/F8VxjLHNh7i9wzfwPGf8kyBJ8Gg2yvBXx175Uev8LdrD1F5C4o7qHa2CC4IrhGE1XQ==", "license": "MIT", "dependencies": { - "@azure/msal-common": "15.13.3" + "@azure/msal-common": "15.14.2" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "15.13.3", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.3.tgz", - "integrity": "sha512-shSDU7Ioecya+Aob5xliW9IGq1Ui8y4EVSdWGyI1Gbm4Vg61WpP95LuzcY214/wEjSn6w4PZYD4/iVldErHayQ==", + "version": "15.14.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.14.2.tgz", + "integrity": "sha512-n8RBJEUmd5QotoqbZfd+eGBkzuFI1KX6jw2b3WcpSyGjwmzoeI/Jb99opIBPHpb8y312NB+B6+FGi2ZVSR8yfA==", "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-react": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@azure/msal-react/-/msal-react-3.0.23.tgz", - "integrity": "sha512-tHvq441nwlJD9QfQP4ZStiw6xb2hQoujNHZhZb+wpUbImb3wyr2FF6/umhX/p+yzc/aq0Lee7mbdDDpzRZzxcA==", + "version": "3.0.26", + "resolved": "https://registry.npmjs.org/@azure/msal-react/-/msal-react-3.0.26.tgz", + "integrity": "sha512-KmuFk9Xwsh2Ay3XvLGF+dbrjjQyqFEjXS87hrmJu9aG0ToBWqXQO/QKmiiJUhX4UqBOZSbD+kHn4R1Bc6WQTlA==", "license": "MIT", "engines": { "node": ">=10" }, "peerDependencies": { - "@azure/msal-browser": "^4.27.0", + "@azure/msal-browser": "^4.28.2", "react": "^16.8.0 || ^17 || ^18 || ^19.2.1" } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { @@ -93,9 +93,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "license": "MIT", "engines": { @@ -103,21 +103,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -134,14 +134,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -264,13 +264,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -336,18 +336,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -355,9 +355,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -384,9 +384,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], @@ -401,9 +401,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], @@ -418,9 +418,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], @@ -435,9 +435,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], @@ -452,9 +452,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -469,9 +469,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], @@ -486,9 +486,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -503,9 +503,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -520,9 +520,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -537,9 +537,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -554,9 +554,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -571,9 +571,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -588,9 +588,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -605,9 +605,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -622,9 +622,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -639,9 +639,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -656,9 +656,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -673,9 +673,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -690,9 +690,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -707,9 +707,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -724,9 +724,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -741,9 +741,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -758,9 +758,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -775,9 +775,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -792,9 +792,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -809,9 +809,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -868,124 +868,95 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.1.tgz", + "integrity": "sha512-uVSdg/V4dfQmTjJzR0szNczjOH/J+FyUMMjYtr07xFRXR7EDf9i1qdxrD0VusZH9knj1/ecxzCQQxyic5NzAiA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.1", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz", + "integrity": "sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0" + "@eslint/core": "^1.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz", + "integrity": "sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.1.tgz", + "integrity": "sha512-P9cq2dpr+LU8j3qbLygLcSZrl2/ds/pUpfnHNNuk5HW7mnngHs+6WSq5C9mO3rqRX8A1poxqLTC9cu0KOyJlBg==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz", + "integrity": "sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.1.0", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.10" @@ -1001,12 +972,12 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", + "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, @@ -1130,9 +1101,9 @@ } }, "node_modules/@fluentui-copilot/react-chat-input": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@fluentui-copilot/react-chat-input/-/react-chat-input-0.16.1.tgz", - "integrity": "sha512-B9XkTs6qo0QoEoNlnuzncsgLsBKdT5H/5iahmp/JWgG84J+ZVRuNKyrv0NwnoRksZZw/2SvJUaN2tC34nOqjcg==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@fluentui-copilot/react-chat-input/-/react-chat-input-0.16.2.tgz", + "integrity": "sha512-zP3p01UuiRSCvlsLk+A01PIuvDXv9TjCSoiUGCzbgea6qGfs1rfoU1DlZ1VaXCjpd9b3inb8vskKh2WbdSEVRQ==", "license": "MIT", "dependencies": { "@fluentui-copilot/chat-input-plugins": "^0.5.3", @@ -1901,30 +1872,30 @@ } }, "node_modules/@fluentui/priority-overflow": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.2.1.tgz", - "integrity": "sha512-WH5dv54aEqWo/kKQuADAwjv66W6OUMFllQMjpdkrktQp7pu4JXtmF60iYcp9+iuIX9iCeW01j8gNTU08MQlfIQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.3.0.tgz", + "integrity": "sha512-yaBC0R4e+4ZlCWDulB5S+xBrlnLwfzdg68GaarCqQO8OHjLg7Ah05xTj7PsAYcoHeEg/9vYeBwGXBpRO8+Tjqw==", "license": "MIT", "dependencies": { "@swc/helpers": "^0.5.1" } }, "node_modules/@fluentui/react-accordion": { - "version": "9.8.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.8.15.tgz", - "integrity": "sha512-/KMZKD97C6hvRUF4S/GiMaguFh2VWHAm0z58y++Si9drmgTvpAUHxXKHELxnZFYKLS76Gc0gMXnKrPMlp0wDkw==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.9.0.tgz", + "integrity": "sha512-vK7LTTRoICs/k7zRZkmBpX5v8Ig72xHdBM2uzUT/Az+Qk+pTYGzxz0pogC/Y8jq8Ynn0DhVgJ7IGm25/L19A+g==", "license": "MIT", "dependencies": { - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-motion-components-preview": "^0.14.2", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-motion-components-preview": "^0.15.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -1936,18 +1907,18 @@ } }, "node_modules/@fluentui/react-alert": { - "version": "9.0.0-beta.131", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.131.tgz", - "integrity": "sha512-mpt5uMuAjUG/J6T0yq/r54pwhVl/D/lk/OLF3ovhYzWuiNhEOinwx2b81fK02Rm/K3i4sl25QX4h19Aie5NLKg==", + "version": "9.0.0-beta.133", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.133.tgz", + "integrity": "sha512-6BW1AONX+wFyGADJr30riiJMJczIyUtJeXo11jjAY+A+AA6IDLzZHJuFfgza/7fWFBfJBD72mIoV+b/xSrCthw==", "license": "MIT", "dependencies": { - "@fluentui/react-avatar": "^9.9.13", - "@fluentui/react-button": "^9.7.1", + "@fluentui/react-avatar": "^9.10.0", + "@fluentui/react-button": "^9.8.1", "@fluentui/react-icons": "^2.0.239", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -1959,16 +1930,16 @@ } }, "node_modules/@fluentui/react-aria": { - "version": "9.17.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.17.7.tgz", - "integrity": "sha512-OsPKp6BmE+W73UNMM7JX6WNQa5H4/oFKgt/BAQxp9mhM6lYw4Skmf9ZLn0vBccFuc0wh2hYDuMgKQ2/2uTUfow==", + "version": "9.17.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.17.9.tgz", + "integrity": "sha512-L0/lin/zKzTcYDPM3i+fMeP5OtbFVfwxMHhPewLy7nbFnFb0p7dbWCxLE6r0C6yq4JFBk0nA0eWy9ox2BOMTRA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-utilities": "^9.26.1", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -1979,21 +1950,21 @@ } }, "node_modules/@fluentui/react-avatar": { - "version": "9.9.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.9.13.tgz", - "integrity": "sha512-a8eVQ2WYiGQvV7BVzcMXGkpZHfNzduC8S74ux5cMbeDuFG8JH8XKBIgOErAxQwFt0wATqyISelo5vn176sQwmw==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.10.0.tgz", + "integrity": "sha512-GQuKzoTm/ABEnw97It6/7Ut21b3ZuB+F00yVkjS30xAN+q5mYIKdVcgXykYE9LiDJHp21CmrgtcyrThlDxo4nw==", "license": "MIT", "dependencies": { - "@fluentui/react-badge": "^9.4.12", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-badge": "^9.4.14", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-popover": "^9.12.13", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-tooltip": "^9.8.12", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-popover": "^9.13.1", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-tooltip": "^9.9.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2005,16 +1976,16 @@ } }, "node_modules/@fluentui/react-badge": { - "version": "9.4.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.4.12.tgz", - "integrity": "sha512-N7B3l3PGH1HKzjvXBmnElyTpd7JIIimuxEWSu6v+4Jas3UCbbEjv6DfhmEOLeBFle09q3ILTJ/Hf7t9jhEAyyg==", + "version": "9.4.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.4.14.tgz", + "integrity": "sha512-13+0IAGhPoHrfcX2nIl47cUgqO5fyvfq6rNPAMjyxz/ZCvX/TFiAglq8P7CRyGHQWBvaUTHFME2//gy8dW2new==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2026,20 +1997,20 @@ } }, "node_modules/@fluentui/react-breadcrumb": { - "version": "9.3.14", - "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.3.14.tgz", - "integrity": "sha512-KfMXejIEWA5VWPkp0lJIN18qqlf/3TpwnkBafRCxeeVx5dVuT6z2PW5bxJiDQ1jRSpmYiGzs3MkJOnlWuMdLhw==", + "version": "9.3.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.3.16.tgz", + "integrity": "sha512-irgluPPOcq1pF7CFP18IGzTZS1TWuM7XwU51OopSNbdnyij5WgMySZBVcIiDk0jC2yL2U2SZefT+sDsSA3ZwRg==", "license": "MIT", "dependencies": { - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-button": "^9.7.1", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-button": "^9.8.1", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-link": "^9.7.1", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-link": "^9.7.3", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2051,19 +2022,19 @@ } }, "node_modules/@fluentui/react-button": { - "version": "9.7.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.7.1.tgz", - "integrity": "sha512-nPrsnORTrf4Hy4uZTxULgUmqd1hQK3ZorDfIYhzcbnBnn78+9zl9NyKQI0SqKxM8jG16FuK8jgrpHLiYq/8PSA==", + "version": "9.8.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.8.1.tgz", + "integrity": "sha512-/YaLzsK57kr91b4gDIINpz0fb4KxdhfzZA6/Ltymm15CwpZ/qOgVt6oFLPunfi/GlUraEnH7EaacJ1kVffneCA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", + "@fluentui/react-aria": "^9.17.9", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2075,18 +2046,18 @@ } }, "node_modules/@fluentui/react-card": { - "version": "9.5.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.5.8.tgz", - "integrity": "sha512-nS/q3Vw2AqAOhKTOxgwU0xgE4neFB9OT+9fK/OuwmvgFLvkV5in/oszod+QlqJzarn3hTp1avWlSOItswPoyOw==", + "version": "9.5.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.5.10.tgz", + "integrity": "sha512-WPDm1lpfe87eWoiht/Q4NGmLVqQD5voeCr4MWZz5Pa9EH9d4vX6eemtJjgrnpvXOvGlVhlOHLhx7lz7FmrUheQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-text": "^9.6.12", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-text": "^9.6.14", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2098,21 +2069,21 @@ } }, "node_modules/@fluentui/react-carousel": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-carousel/-/react-carousel-9.9.0.tgz", - "integrity": "sha512-EaiEe1oT9lFrIZfBfgF046h+2qcwKQZUJcc0Rv7yFDyWkNXrdM1YKG+q89V+D7P3z8tJYXKsNy4+tpFc/xgrKg==", + "version": "9.9.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-carousel/-/react-carousel-9.9.2.tgz", + "integrity": "sha512-+NHu80Ylv4hhU2LdzmHH/r6N8dm8bKWtRDjm98emC4zEwZGhFltO4QhtafCM3E1NiICFKCrF7RRQlsjAD8YbVQ==", "license": "MIT", "dependencies": { - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-button": "^9.7.1", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-button": "^9.8.1", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-tooltip": "^9.8.12", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-tooltip": "^9.9.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1", "embla-carousel": "^8.5.1", @@ -2127,19 +2098,19 @@ } }, "node_modules/@fluentui/react-checkbox": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.5.12.tgz", - "integrity": "sha512-km1itgOZJ/Io1/F9wLMp9yHgfgyM1HnYBKJjUD4+H+wkdVoF7ZsjWls2s8tB2EMvsbWRBqgPH80yCMNsGyipjw==", + "version": "9.5.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.5.14.tgz", + "integrity": "sha512-0tCAZZwiwK618/LtFueyJ+4o9p+LbRf3KRMMkWWBNRqAlclno8oQQ7lrPHYOjrvmVUPYi9Xg7Gt+ArckUQZEBw==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", + "@fluentui/react-field": "^9.4.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2151,18 +2122,18 @@ } }, "node_modules/@fluentui/react-color-picker": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-color-picker/-/react-color-picker-9.2.12.tgz", - "integrity": "sha512-fToyincQFiuYxzfIMii9M4A55taEFtQ0DzDZPlyIi45j/39eSmlwGzBDfFq7KKvVqGHvZKCKcSymUlxA+PPEcQ==", + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-color-picker/-/react-color-picker-9.2.14.tgz", + "integrity": "sha512-ZsdCm5j2/Q5WOpgDHX5X3AOJwP3AOf9hNlhTbt/kjDnLmkmHETkqyo5YPVeWoOfjSyEWw5ARQoN5higL7dIs2Q==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.3.4", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2174,23 +2145,23 @@ } }, "node_modules/@fluentui/react-combobox": { - "version": "9.16.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.16.13.tgz", - "integrity": "sha512-FavYGlTKOBED44h6d587Ic1AVi9/eqEh+B2Xph7EujCvq9ZFtjYPtZVDcgEuAZd/C6QY5vrFoZ5+abjLqal1bg==", + "version": "9.16.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.16.15.tgz", + "integrity": "sha512-SuffNVAq3QvZShAK0BiO/X0azjkoG8X6mD9sFitU80Nj/JZeDABNekd/da+NuBQ3IHjVspgj8336vIr2epMLyg==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-field": "^9.4.12", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-field": "^9.4.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-positioning": "^9.20.11", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-positioning": "^9.20.12", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2202,71 +2173,71 @@ } }, "node_modules/@fluentui/react-components": { - "version": "9.72.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.72.9.tgz", - "integrity": "sha512-yiNzCjPixUhYokf8kgl0ItXQ/smPceFvz9XP73z0Tp0dRNzRQG20dK0Oz3w+7vnOt9VmnAH9KGNRXqNAY+CPdg==", - "license": "MIT", - "dependencies": { - "@fluentui/react-accordion": "^9.8.15", - "@fluentui/react-alert": "9.0.0-beta.131", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-avatar": "^9.9.13", - "@fluentui/react-badge": "^9.4.12", - "@fluentui/react-breadcrumb": "^9.3.14", - "@fluentui/react-button": "^9.7.1", - "@fluentui/react-card": "^9.5.8", - "@fluentui/react-carousel": "^9.9.0", - "@fluentui/react-checkbox": "^9.5.12", - "@fluentui/react-color-picker": "^9.2.12", - "@fluentui/react-combobox": "^9.16.13", - "@fluentui/react-dialog": "^9.16.5", - "@fluentui/react-divider": "^9.5.1", - "@fluentui/react-drawer": "^9.11.1", - "@fluentui/react-field": "^9.4.12", - "@fluentui/react-image": "^9.3.12", - "@fluentui/react-infobutton": "9.0.0-beta.108", - "@fluentui/react-infolabel": "^9.4.13", - "@fluentui/react-input": "^9.7.12", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-link": "^9.7.1", - "@fluentui/react-list": "^9.6.7", - "@fluentui/react-menu": "^9.20.6", - "@fluentui/react-message-bar": "^9.6.16", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-nav": "^9.3.16", - "@fluentui/react-overflow": "^9.6.6", - "@fluentui/react-persona": "^9.5.13", - "@fluentui/react-popover": "^9.12.13", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-positioning": "^9.20.11", - "@fluentui/react-progress": "^9.4.12", - "@fluentui/react-provider": "^9.22.12", - "@fluentui/react-radio": "^9.5.12", - "@fluentui/react-rating": "^9.3.12", - "@fluentui/react-search": "^9.3.12", - "@fluentui/react-select": "^9.4.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-skeleton": "^9.4.12", - "@fluentui/react-slider": "^9.5.12", - "@fluentui/react-spinbutton": "^9.5.12", - "@fluentui/react-spinner": "^9.7.12", - "@fluentui/react-swatch-picker": "^9.4.12", - "@fluentui/react-switch": "^9.5.1", - "@fluentui/react-table": "^9.19.6", - "@fluentui/react-tabs": "^9.10.8", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-tag-picker": "^9.7.14", - "@fluentui/react-tags": "^9.7.13", - "@fluentui/react-teaching-popover": "^9.6.14", - "@fluentui/react-text": "^9.6.12", - "@fluentui/react-textarea": "^9.6.12", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-toast": "^9.7.10", - "@fluentui/react-toolbar": "^9.6.14", - "@fluentui/react-tooltip": "^9.8.12", - "@fluentui/react-tree": "^9.15.8", - "@fluentui/react-utilities": "^9.26.0", - "@fluentui/react-virtualizer": "9.0.0-alpha.108", + "version": "9.73.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.73.0.tgz", + "integrity": "sha512-4WjQ0+34Vt7iOBo8+w1KYV3U3OcDdCTD8EWLElFv7bq9W3hocK2qWMjjorT0aZCiPgGnD6fp67M3cdb7a452dA==", + "license": "MIT", + "dependencies": { + "@fluentui/react-accordion": "^9.9.0", + "@fluentui/react-alert": "9.0.0-beta.133", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-avatar": "^9.10.0", + "@fluentui/react-badge": "^9.4.14", + "@fluentui/react-breadcrumb": "^9.3.16", + "@fluentui/react-button": "^9.8.1", + "@fluentui/react-card": "^9.5.10", + "@fluentui/react-carousel": "^9.9.2", + "@fluentui/react-checkbox": "^9.5.14", + "@fluentui/react-color-picker": "^9.2.14", + "@fluentui/react-combobox": "^9.16.15", + "@fluentui/react-dialog": "^9.17.0", + "@fluentui/react-divider": "^9.6.1", + "@fluentui/react-drawer": "^9.11.3", + "@fluentui/react-field": "^9.4.14", + "@fluentui/react-image": "^9.3.14", + "@fluentui/react-infobutton": "9.0.0-beta.110", + "@fluentui/react-infolabel": "^9.4.15", + "@fluentui/react-input": "^9.7.14", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-link": "^9.7.3", + "@fluentui/react-list": "^9.6.9", + "@fluentui/react-menu": "^9.21.1", + "@fluentui/react-message-bar": "^9.6.18", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-nav": "^9.3.18", + "@fluentui/react-overflow": "^9.7.0", + "@fluentui/react-persona": "^9.6.0", + "@fluentui/react-popover": "^9.13.1", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-positioning": "^9.20.12", + "@fluentui/react-progress": "^9.4.14", + "@fluentui/react-provider": "^9.22.14", + "@fluentui/react-radio": "^9.5.14", + "@fluentui/react-rating": "^9.3.14", + "@fluentui/react-search": "^9.3.14", + "@fluentui/react-select": "^9.4.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-skeleton": "^9.4.14", + "@fluentui/react-slider": "^9.5.14", + "@fluentui/react-spinbutton": "^9.5.14", + "@fluentui/react-spinner": "^9.7.14", + "@fluentui/react-swatch-picker": "^9.4.14", + "@fluentui/react-switch": "^9.5.3", + "@fluentui/react-table": "^9.19.8", + "@fluentui/react-tabs": "^9.11.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-tag-picker": "^9.7.16", + "@fluentui/react-tags": "^9.7.15", + "@fluentui/react-teaching-popover": "^9.6.16", + "@fluentui/react-text": "^9.6.14", + "@fluentui/react-textarea": "^9.6.14", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-toast": "^9.7.12", + "@fluentui/react-toolbar": "^9.7.2", + "@fluentui/react-tooltip": "^9.9.1", + "@fluentui/react-tree": "^9.15.10", + "@fluentui/react-utilities": "^9.26.1", + "@fluentui/react-virtualizer": "9.0.0-alpha.110", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2278,12 +2249,12 @@ } }, "node_modules/@fluentui/react-context-selector": { - "version": "9.2.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.2.13.tgz", - "integrity": "sha512-Jzo4aDzGHh131wub7XqDaaZB2V+kd90HgpvFHdtBenL8LjDVxuSYpuHlqVF+Lu1mQBDu4V8JQS6KiYLv9xFp8g==", + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.2.14.tgz", + "integrity": "sha512-2dhWztUfq7P7OHa5LEUY/BAez/dWYiC7rwFCWdh9ma5KKRMhLCOmyh1lNgzaaTCvK5MytHx0VzXgBkBJYJfLqg==", "license": "MIT", "dependencies": { - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-utilities": "^9.26.1", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -2295,23 +2266,23 @@ } }, "node_modules/@fluentui/react-dialog": { - "version": "9.16.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.16.5.tgz", - "integrity": "sha512-5MogBImDZ/qXY2ShXAJBbC9XFRwgxDU7lbe31DcD1RLJYV+zXbXIXbMNvTCtSFc3qKRORZgWiYJidR9zb4MiwA==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.17.0.tgz", + "integrity": "sha512-TCvpV7snLJA0cilZ9Q+TCMCAy4RfgMSHa4JHFay0aQ0oKKSMBQEPRsXzjjvzVlRuvpzzmMw2ZGM9dRYchj6bRw==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-motion-components-preview": "^0.14.2", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-motion-components-preview": "^0.15.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2323,15 +2294,15 @@ } }, "node_modules/@fluentui/react-divider": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.5.1.tgz", - "integrity": "sha512-bWc1gbHYqT3werzx+Suw0rBJfn6+bMtmZ8PDy4UIg/Fn06oPum4IqgHn3r9HpQtmphhspBGrI/q2BD/YWEHAyg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.6.1.tgz", + "integrity": "sha512-qadRByctDJFV7JYTlafAXvXXp5q2TmaBFjdjBMzz1a8+9N5sL6LzX3MoKgEcI32mmBDalaREY9JgrcAlIehf0g==", "license": "MIT", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2343,20 +2314,20 @@ } }, "node_modules/@fluentui/react-drawer": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.11.1.tgz", - "integrity": "sha512-xGbiGCc0j7smvet+ZbGCl9yrnk9WDVxD1RN7egO6CXZ6qRurE76AX/9dtnw22/Md+HPkzOmNAw95A0LOYUg04g==", - "license": "MIT", - "dependencies": { - "@fluentui/react-dialog": "^9.16.5", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-motion-components-preview": "^0.14.2", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "version": "9.11.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.11.3.tgz", + "integrity": "sha512-VtNsSsnmYIXIsHyHMNM8XXZZ84JcJE28lQITJ8JhK4w06yIgBpNnody2LIVYD9ndc3f6DSodt8ikgBUdXBOjog==", + "license": "MIT", + "dependencies": { + "@fluentui/react-dialog": "^9.17.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-motion-components-preview": "^0.15.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2368,18 +2339,18 @@ } }, "node_modules/@fluentui/react-field": { - "version": "9.4.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.4.12.tgz", - "integrity": "sha512-GJq/SbXXAduKUJK8XpIphfGLNgBZm2fizxZt0pKttE4HkBjFbHaBbEkjlNZc8S+2d8ec0adkqx9hwC9OnqZMUw==", + "version": "9.4.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.4.14.tgz", + "integrity": "sha512-2x+ES49sWkQQ52NOEj4VazD9/CUvTjH+TbGhvVaMplbTGmaqQ00Lfcg56Cd1kweBnskyS4EuwmbXiDWBIoK+Wg==", "license": "MIT", "dependencies": { - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2391,9 +2362,9 @@ } }, "node_modules/@fluentui/react-icons": { - "version": "2.0.316", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.316.tgz", - "integrity": "sha512-tZPOtsUmoOrgLeM/rLjkzLlWOEmIghXNh/DYQzm5RD/Q4epklOzjnsFvc/Mn2tuXiVxi+vvXxsQp21E1aLpmWg==", + "version": "2.0.319", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.319.tgz", + "integrity": "sha512-4yN0ovAxlOXL5jM3ULuYu6pAwvMWm1MjojDXn5tVKDkXQwlLpXCUFwf5Vgzp5jU6jJXrENj4v64MN6w7FJjotw==", "license": "MIT", "dependencies": { "@griffel/react": "^1.0.0", @@ -2404,15 +2375,15 @@ } }, "node_modules/@fluentui/react-image": { - "version": "9.3.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.3.12.tgz", - "integrity": "sha512-S02tX0s5UrWY0MyVfkq8P/3vyyAZ6LPdFAwjy2dWIWoEpYA2XH+fCDDsnPSThSZs6IUKUqgN/BpXW0/lsPcCuA==", + "version": "9.3.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.3.14.tgz", + "integrity": "sha512-1e5MmOLhxbfF4+Nk235eOXREm9dkwCH06L1oNKZKWnwtAZBOmTwPspIW0ttXCvJtllaXXeKAeBexM3jLqG5VRw==", "license": "MIT", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2424,18 +2395,18 @@ } }, "node_modules/@fluentui/react-infobutton": { - "version": "9.0.0-beta.108", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.108.tgz", - "integrity": "sha512-mXwi5LuVNJK66HxOid4mzZaV571E3ZmyKDK8BG0Bd+nErTixc0H6D3kPIxgBbN4RaZjurPkovg5vluAYAzMgxg==", + "version": "9.0.0-beta.110", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.110.tgz", + "integrity": "sha512-SmotNqFZOe6Vd1vOkDI3IuzOV18TmTD3BGSK1Tv6uSuek21MyzkVp06bvQLxyQPsGQXrfpPjX2R2OpDDNbsI3g==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.237", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-popover": "^9.12.13", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-popover": "^9.13.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2447,19 +2418,19 @@ } }, "node_modules/@fluentui/react-infolabel": { - "version": "9.4.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.4.13.tgz", - "integrity": "sha512-szas/IPeg3XETtxily/9muYM9/czky+CVuntdbhHaCGyg1YZ1xMbRhXgaGUpJtBnOuCaLQV4wcX+r6bCYkN95A==", + "version": "9.4.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.4.15.tgz", + "integrity": "sha512-DzFJ0wx5B8rZ7Kxy8EIz7LIHYf8mDt8Bd6WEiEO2r9NVihgiFHNa4a0k/s3SoY2vVESkJgpUqqoizVIAEDDsOg==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-popover": "^9.12.13", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-popover": "^9.13.1", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2471,16 +2442,16 @@ } }, "node_modules/@fluentui/react-input": { - "version": "9.7.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.7.12.tgz", - "integrity": "sha512-91h/J6xsH4hRrtclPL0sEU2zdAfs2t2IpDz+AWwJ7LTWn+DfxNjr4ItncbBC8DCB69IoKOmNma/Hup/4LaCsMA==", + "version": "9.7.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.7.14.tgz", + "integrity": "sha512-VFNXDSxO/LdEi5wKd+zCLRRtNelGsvaJR4muAm7OJN56GmF+/3Jtq0dKlqkKosHta+zuXGWvGUgSH8fYfy64sQ==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-field": "^9.4.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2492,14 +2463,13 @@ } }, "node_modules/@fluentui/react-jsx-runtime": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.3.4.tgz", - "integrity": "sha512-socz8H63f7CBYECzBkeeZGUAGgPDvsr4kZRHQoQw5eXBKlSb+08p7F7Zdq0hYAPQhTgXoxH1DZ4JlXzCCmweVg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.4.0.tgz", + "integrity": "sha512-qkY2XPSs1bGTLebo0a8py0d8/buT0TyZwqN4/sW9oFs9j1w6+HcExJgMDyhEJJSwScVHBJQ6nVT1SlzCf/kpRA==", "license": "MIT", "dependencies": { - "@fluentui/react-utilities": "^9.26.0", - "@swc/helpers": "^0.5.1", - "react-is": "^17.0.2" + "@fluentui/react-utilities": "^9.26.1", + "@swc/helpers": "^0.5.1" }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", @@ -2507,15 +2477,15 @@ } }, "node_modules/@fluentui/react-label": { - "version": "9.3.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.3.12.tgz", - "integrity": "sha512-drVHXtiK/uhWF83lbeGm+z4r2IBVA8Zp6+VXD5lsR0nJ6o9v2TubJDTgOpgpWMaFDPDSHUO7jCAqwNdzQ3lpsw==", + "version": "9.3.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.3.14.tgz", + "integrity": "sha512-gLg6Rilh5ZJ7Yj3M2HxhoLSVBnhxnKoTONdYcTZHQvlkXZHhWXWBziU+OEuVRw7IjLm50VcyTZ3rAto4pw6sKw==", "license": "MIT", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2527,17 +2497,17 @@ } }, "node_modules/@fluentui/react-link": { - "version": "9.7.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.7.1.tgz", - "integrity": "sha512-OkFR95N8D1KQPmz4eZPu+mei79JNYjURLythuNfgvLG3SgNpOKfT7b5hzhUCafzEB1e6Oviw/nGF99t65pfdMA==", + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.7.3.tgz", + "integrity": "sha512-hE0/XwUtqk4gdlruQaUlDAZ0VNpCjqWzhljbHYAtVbNXky2WJVV4tSZ7RMJbc6v1242GPnI67zwxaxcCuz/bbw==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2549,19 +2519,19 @@ } }, "node_modules/@fluentui/react-list": { - "version": "9.6.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-list/-/react-list-9.6.7.tgz", - "integrity": "sha512-/vUcP6QeUrVuVVZGab+W/a66O/7RxbqErt9S3teC90X8e5Bq0Nb7Q1aeiC4gyQr1XvwzKGKhqe/3srU8X+54Qw==", + "version": "9.6.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-list/-/react-list-9.6.9.tgz", + "integrity": "sha512-OorRdpSEXEqwrTjqkKmzJUjofcTDauBNM41aWhE/WjfQZXA1Guu2JzafivQmdxLhBRvVxGBzJ3l5BKo9V/goGA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-checkbox": "^9.5.12", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-checkbox": "^9.5.14", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2573,22 +2543,22 @@ } }, "node_modules/@fluentui/react-menu": { - "version": "9.20.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.20.6.tgz", - "integrity": "sha512-AsbtrJigDeMlVJbIZMHDjNrW2DFe0hzgEN4/Dc/fYaHqOFIe1OazNAWZl4dsXyEHZxkCo791X5jhR12gvBDbcA==", + "version": "9.21.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.21.1.tgz", + "integrity": "sha512-dsIPAoLiTWWau3O68LmC9Odlmxe3kB8Tj2FSnKO+H069aJOO9AFOmetqoS1GWUccctjHCttgYY6MP2+Ay8yh7Q==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-positioning": "^9.20.11", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-positioning": "^9.20.12", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2600,20 +2570,20 @@ } }, "node_modules/@fluentui/react-message-bar": { - "version": "9.6.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.6.16.tgz", - "integrity": "sha512-yg1vSYLDaTKwDeia2t1ivngBy7sinx4McBjyX8l8pUaAdrT+OqDcDeevXpFNZ0/0eA2a3BVJ6qbu4iab1d9FPQ==", + "version": "9.6.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.6.18.tgz", + "integrity": "sha512-7DLTQpF+X5lxOqrs6vRflKDQoMA09FINEXNA6jB3UWC5Ol5Zk7U8zNt2ovX50n/99DXTKLPmH/22rjEsokAjjg==", "license": "MIT", "dependencies": { - "@fluentui/react-button": "^9.7.1", + "@fluentui/react-button": "^9.8.1", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-link": "^9.7.1", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-motion-components-preview": "^0.14.2", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-link": "^9.7.3", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-motion-components-preview": "^0.15.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2625,13 +2595,13 @@ } }, "node_modules/@fluentui/react-motion": { - "version": "9.11.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-motion/-/react-motion-9.11.5.tgz", - "integrity": "sha512-o4rTgeQbxER4tZ47eZ+ej/uy9iUNvQtB5fF55+8G00beBSX2acwmslb/GJOOw/mnkcB14Hoa6f8LU2JabYNXSw==", + "version": "9.11.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion/-/react-motion-9.11.6.tgz", + "integrity": "sha512-WZiqEtO0vCUYjYjkvxm9h1r/VRVEi0a4hDhVxCP3Ptsfn5ts5CEf61WbJyrmvvWD7X9TamP2SEf+lEmS8Qy89A==", "license": "MIT", "dependencies": { - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-utilities": "^9.26.1", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -2642,9 +2612,9 @@ } }, "node_modules/@fluentui/react-motion-components-preview": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.14.2.tgz", - "integrity": "sha512-QbdbgzcM02AvYCN4PbBMZCw10vMh9AvPK8kK2kbMdNWXolbRau2ndNVfXpXvZxY9KZFc2lJlYUBLWJTLDINQXA==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.15.0.tgz", + "integrity": "sha512-CUNl3WZt4RU4q6iAG56M3WRAq5sxfm8BNr9Me5dru1mkDXwgsdrCk03UFzydru3gThmuyYsBHwze79YrPzzmxw==", "license": "MIT", "dependencies": { "@fluentui/react-motion": "*", @@ -2659,25 +2629,25 @@ } }, "node_modules/@fluentui/react-nav": { - "version": "9.3.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-nav/-/react-nav-9.3.16.tgz", - "integrity": "sha512-qoPfC/pAYDZQxAhfFhzP6a5QH/1lafmOWNXLrZxX5DadGl9mg9Tr6/t6rcP/ZuJSTHGzVX1IUmxboc+z62gcww==", + "version": "9.3.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-nav/-/react-nav-9.3.18.tgz", + "integrity": "sha512-vnAwnWPOUWyZPf+p5G0BjhO8NLPDF7NygspvXwPja7YV25Xov1oW6q3ijflc+Xj8wOCuyNcdJreRMdOpTmZj6A==", "license": "MIT", "dependencies": { - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-button": "^9.7.1", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-divider": "^9.5.1", - "@fluentui/react-drawer": "^9.11.1", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-button": "^9.8.1", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-divider": "^9.6.1", + "@fluentui/react-drawer": "^9.11.3", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-motion-components-preview": "^0.14.2", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-tooltip": "^9.8.12", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-motion-components-preview": "^0.15.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-tooltip": "^9.9.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2689,15 +2659,15 @@ } }, "node_modules/@fluentui/react-overflow": { - "version": "9.6.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.6.6.tgz", - "integrity": "sha512-iXXEQCSNn6xfzzUrEURplq7uc+OrxTvU6EbWVeFxCQnwmbnEJlmxtFzWTS4XHR1Z00Z+lZ4pCUxD1q7DH9926Q==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.7.0.tgz", + "integrity": "sha512-re98BA4Cic/zcA9nLHm9I5Vwyb+keaPnlqJiUUiq/t95ki5xutT37ozqdbMY8IO3VlkS3o8raMKVn6QIMB5huQ==", "license": "MIT", "dependencies": { - "@fluentui/priority-overflow": "^9.2.1", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/priority-overflow": "^9.3.0", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2709,17 +2679,17 @@ } }, "node_modules/@fluentui/react-persona": { - "version": "9.5.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.5.13.tgz", - "integrity": "sha512-H2gUXRp3U28szgjMskKRM0OI1TvEaZ9LJwvCo2aEf03ijvWVeJYSg8Q3XLmglrAbjENRWIR7/kZg2r8Hd0vlvw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.6.0.tgz", + "integrity": "sha512-sTxIFEJcwzHtlPWDUknUFZTo6rvAEa5P4FED886svOcxhMx2HH6sfV4NUzFDgvgZAQI9PAvv8nSlT02m5iyGuQ==", "license": "MIT", "dependencies": { - "@fluentui/react-avatar": "^9.9.13", - "@fluentui/react-badge": "^9.4.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-avatar": "^9.10.0", + "@fluentui/react-badge": "^9.4.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2731,21 +2701,21 @@ } }, "node_modules/@fluentui/react-popover": { - "version": "9.12.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.12.13.tgz", - "integrity": "sha512-hb1G/zLCfoD4fUHwPLZ7Qqwaoqm5nk8dyV8s491J3tpKhifce+cVgqA2/5MYMcZeo07QRIzn5oZ10t7QZCBOKw==", + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.13.1.tgz", + "integrity": "sha512-B8ZZ5aYkIj/RM89GtDG06IfjNQJTdSZqXBCcCT6deIACYN/0fBJUMk12AIbeed2+PjkNdfvTbTTGIjKTQ02SEQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-positioning": "^9.20.11", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-positioning": "^9.20.12", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2757,14 +2727,14 @@ } }, "node_modules/@fluentui/react-portal": { - "version": "9.8.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.8.9.tgz", - "integrity": "sha512-zmaEPXwSLMmCzRlKQUZ+ZZqNjGe+h6K+Gz4NIFuz+jVbCRpOPEfumaoE6oy9wRITQFHq3DQrkPSRQxrZ7oUHRQ==", + "version": "9.8.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.8.10.tgz", + "integrity": "sha512-/dNb7o8D79KAAxseAIyDIT7ZhIE5hL9Tz9dv9Zec3c+8KfzKwXp6hzr5K/gASeg82ga2xArMn4os4JcVuzvwLg==", "license": "MIT", "dependencies": { - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2776,16 +2746,16 @@ } }, "node_modules/@fluentui/react-positioning": { - "version": "9.20.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.20.11.tgz", - "integrity": "sha512-LjLQiIZw9wM7OSSi1CesrV6yvmJTsLFOMA8jypglm4GoPCXf4BzD7bEk55fgJYBGfa1YQNGMbv2LlFqmNOGrQQ==", + "version": "9.20.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.20.12.tgz", + "integrity": "sha512-d7l/4EdfPj5IA/mQ0NLytGxsPwBvx/K/h3ZoJVf6eoY5nmnLch5OKImcPYJCku4DKozXQuneVx7xNW/8TzOJEA==", "license": "MIT", "dependencies": { "@floating-ui/devtools": "^0.2.3", "@floating-ui/dom": "^1.6.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1", "use-sync-external-store": "^1.2.0" @@ -2798,16 +2768,16 @@ } }, "node_modules/@fluentui/react-progress": { - "version": "9.4.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.4.12.tgz", - "integrity": "sha512-CGlk1yXhT6hBDbjgYyk+qgKbuU089iwYeueiYit5TLFb0LUUjfWjdcex7s73Qa+Obyss5MeHun8DQwX9Ve/FoQ==", + "version": "9.4.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.4.14.tgz", + "integrity": "sha512-Zmdb22KPdV1pRAmcjRkAGvoNAGCeSYxqvGWgPn438b9c0jyb4OL/wnLj8vHnpZEN5dXAaw3rc5zrVMZsB/zwFQ==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-field": "^9.4.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2819,17 +2789,17 @@ } }, "node_modules/@fluentui/react-provider": { - "version": "9.22.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.22.12.tgz", - "integrity": "sha512-GhNd18zORZ/7m37TjF3UTKAJCfRgCXZi3PcdoI5SvseR3SPWl93R8mYi0SDCe6tIw7TNgzCn6fS7X6O+hAV+rA==", + "version": "9.22.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.22.14.tgz", + "integrity": "sha512-VPVRmQvkbd4++8aZLa/Jf2vl1KVX+tfcWeV40M7HiPhER22LkdzJe2NGLCgnjMKJwtPPLK6FqbJTthmClJIeuw==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/core": "^1.16.0", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" @@ -2842,18 +2812,18 @@ } }, "node_modules/@fluentui/react-radio": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.5.12.tgz", - "integrity": "sha512-T0UdYn8comjc05SyZc37Cx8QT6ZhdGr/0az+ygK15uutRrj6ZQJV+xYAOo8rEwu5P51tD077nV8A9k1asf0TAQ==", - "license": "MIT", - "dependencies": { - "@fluentui/react-field": "^9.4.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "version": "9.5.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.5.14.tgz", + "integrity": "sha512-ZmSpTZn0/Ko0X4oKhfaeycqHLxkabcoUZ6jk0Xtmi4cfdTUChB9dDsRbd6xVSuMxmkmGe+hYzMrJwhKfRgjlGw==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.4.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2865,17 +2835,17 @@ } }, "node_modules/@fluentui/react-rating": { - "version": "9.3.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.3.12.tgz", - "integrity": "sha512-q8P0sQ5b5EPNLJZH6jN37avhZkm5aHPmaE4btOHMsAYivh5CMtQfgsBZ5vO/z6acXTdWV+r5DoF1gKIMdwEtrA==", + "version": "9.3.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.3.14.tgz", + "integrity": "sha512-mN+gCj63xmyqt198JwsTwn8vzjluh1UHFVibEq2TdRzJI0bZG6HF43Je8vRFqq1N2WVAszCwF4bMPEM1iLc11g==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2887,17 +2857,17 @@ } }, "node_modules/@fluentui/react-search": { - "version": "9.3.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.3.12.tgz", - "integrity": "sha512-F1qvEaoeLh4aYTbRXI5gOb63EFjBTVBeb084RKAYAzFBaiv7w4nUdPAuyK6+mevtO+wSdUHvb9HFwrxkLpY05w==", + "version": "9.3.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.3.14.tgz", + "integrity": "sha512-e7oB0x6CqtCtt0ROgAK7KaddkGR2bl4WtL5NA/a7NCtYoTTkU9C4LubjqTtfVBKqMPykLjiOdUZOID8Aq3esfg==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-input": "^9.7.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-input": "^9.7.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2909,17 +2879,17 @@ } }, "node_modules/@fluentui/react-select": { - "version": "9.4.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.4.12.tgz", - "integrity": "sha512-IwIc9qGNTmgMC/zP05mempBSaZWoSG3JknOoQjoFVpi6sOL4pw/1L2f2fH7DvnNQtWymFuXt9jEpJdI2xKPVTA==", + "version": "9.4.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.4.14.tgz", + "integrity": "sha512-wfAxwSDNsbjDn8Qh7jXKZnKb2ljMSI4M+SXg+R1ebqNLh527wtKS13i78toWV6NUKrjG7Ycgq7ZN2/oEXCv8VQ==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", + "@fluentui/react-field": "^9.4.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2931,12 +2901,12 @@ } }, "node_modules/@fluentui/react-shared-contexts": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.26.0.tgz", - "integrity": "sha512-r52B+LUevs930pe45pFsppM9XNvY+ojgRgnDE+T/6aiwR/Mo4YoGrtjhLEzlQBeTGuySICTeaAiXfuH6Keo5Dg==", + "version": "9.26.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.26.1.tgz", + "integrity": "sha512-Vf/NKiqx76DC2AqbMPfqoTMPDEw6xINTxQAStq8ymT3oMaf7K79uKu9PnmtFghuXf3FVYVWzIlDWvQmR1ng9zg==", "license": "MIT", "dependencies": { - "@fluentui/react-theme": "^9.2.0", + "@fluentui/react-theme": "^9.2.1", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -2945,16 +2915,16 @@ } }, "node_modules/@fluentui/react-skeleton": { - "version": "9.4.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.4.12.tgz", - "integrity": "sha512-aOaoOn4L3SMqGW83GmvGrRrv6TnT0uuxsDk6/mSfPW7P9QwhaZZQRiBiymH01RYSMBF9J3DFgZzKsKqVihts0w==", + "version": "9.4.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.4.14.tgz", + "integrity": "sha512-Tem5Mn4n6AgSTw2vCR0qjY88XfDvrlpKwiC7Wlu3LhRoXoDBx+JoRJEwA7eymLUYbZznDjPJV9BhS6tpLEVhdg==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-field": "^9.4.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2966,17 +2936,17 @@ } }, "node_modules/@fluentui/react-slider": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.5.12.tgz", - "integrity": "sha512-zfMyC0+ytNMtZEtqVXg+8l8dRrXAfRccPxofngZzHiVgLknMlc7L9jjWBYOGiB4VbO1XR/+D7/KrsjBf0xvXyA==", + "version": "9.5.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.5.14.tgz", + "integrity": "sha512-bLlYxAfz5uJsg/1QneE/3PjvKKAT6JCnCszVSxik3Et+kHcEp6p2dnjJcTX6NqlDu2Bz1QGpFEQbO443IknBRQ==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-field": "^9.4.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -2988,18 +2958,18 @@ } }, "node_modules/@fluentui/react-spinbutton": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.5.12.tgz", - "integrity": "sha512-+t7GOyJkaevduT6CYEX9PLlsdPnJKWeXP6Va1Ml2wFnDz8RtJTTqzbedSqmk8CLpwbZ8+/Ix40pIbp+9Q5v2Ow==", + "version": "9.5.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.5.14.tgz", + "integrity": "sha512-mXoW0ao7vWUzAq8vDButG4ueyTD3sp7pGPYnDdm/V0LNUib5hBiTKIoEA4q1bFjkGMwkHQvC405uV3hyjAIWWA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-field": "^9.4.12", + "@fluentui/react-field": "^9.4.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3011,16 +2981,16 @@ } }, "node_modules/@fluentui/react-spinner": { - "version": "9.7.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.7.12.tgz", - "integrity": "sha512-8jTG1DTKipkpkaNwl9uxDs8yMKMK8ogzYrMMbNR1pfYVtpiDSfwxwZIXTqh9r1vS4SU3WnFQ0irRu1tIIumAnQ==", + "version": "9.7.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.7.14.tgz", + "integrity": "sha512-OADtpa6nesZq8ITRWVmtbI4LMdvwBZM9N9IaWJffm9c1EOg52b1ob8p09rQAw8dFfS0vn7C48UPYQseV15T3VA==", "license": "MIT", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3032,19 +3002,19 @@ } }, "node_modules/@fluentui/react-swatch-picker": { - "version": "9.4.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-swatch-picker/-/react-swatch-picker-9.4.12.tgz", - "integrity": "sha512-c3OHBbPNneQLm+A9rzVaU757FPTBog+tYQU7nnmHlM0LZSTIhJf1XRBsLGNSnqmlAzLc94PjW/867SstQ+vuaQ==", + "version": "9.4.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-swatch-picker/-/react-swatch-picker-9.4.14.tgz", + "integrity": "sha512-iEnM4knd2JgSQnio4rlniYkcCPAHd08uXEGaQVa64d77clIGaq3VYymbkUvgPnwgCu2S3hRrJaCLmXGQujZQhw==", "license": "MIT", "dependencies": { - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-field": "^9.4.12", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-field": "^9.4.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3056,19 +3026,19 @@ } }, "node_modules/@fluentui/react-switch": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.5.1.tgz", - "integrity": "sha512-fa9EKNyssYwrkbWQn3CQ4IfnsVy+ttiRWom+s9eJDtM9NTtLZMJpei0Ve6vCD27SIbwBJhngWLe7j5/HeAg0uQ==", + "version": "9.5.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.5.3.tgz", + "integrity": "sha512-k2mA1uFHboWbTuYF3Jjuyif231SVU3/iy6njYFGO9tJS1WI2CbbblnINpwzsfpiWTAGUzzAAudY6ndvLqS2lsg==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", + "@fluentui/react-field": "^9.4.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-label": "^9.3.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-label": "^9.3.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3080,23 +3050,23 @@ } }, "node_modules/@fluentui/react-table": { - "version": "9.19.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.19.6.tgz", - "integrity": "sha512-LKGuFnYfknmaFCH35T0VjgbeaQIfg5SCVPgnNGKHDmNd85QvOR5AG7CMBm0LSltjZW6NFHblkRmnOkF2AkPucQ==", + "version": "9.19.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.19.8.tgz", + "integrity": "sha512-rDnPpmwVYNNy7iRMuN5offjmpEQILuUVEXoch0cPhrNCLca+hgSQ97YSJy6/4JmXcK7kQvp+MCJn9HpbJNfwOw==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-avatar": "^9.9.13", - "@fluentui/react-checkbox": "^9.5.12", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-avatar": "^9.10.0", + "@fluentui/react-checkbox": "^9.5.14", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-radio": "^9.5.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-radio": "^9.5.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3108,17 +3078,17 @@ } }, "node_modules/@fluentui/react-tabs": { - "version": "9.10.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.10.8.tgz", - "integrity": "sha512-Msxd4Ajhu+YZW7Iv5WQZBr2yynsOkwQjXkSH28ObjAZ/rFkb2Iq9uXvSAFJHba++Ecz1i2tchAsELWqT9oyLxA==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.11.1.tgz", + "integrity": "sha512-BeSbYJy2kRwYI6tObGw0TQ9lmcfTsfAEGCrzScfnzwzp2/DOXI2w+IPR9G+wBg9iL2eMdZ6kIpgcQ4RGhkWBgQ==", "license": "MIT", "dependencies": { - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3130,14 +3100,14 @@ } }, "node_modules/@fluentui/react-tabster": { - "version": "9.26.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.26.11.tgz", - "integrity": "sha512-x2UjXowknK4gHJT14ezIeaLAKozZrpqsvWj8Mqa6p+TiOdHyo8YO6mecpCV1QWyz86qYsOPYhK/i0MSapwaELA==", + "version": "9.26.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.26.12.tgz", + "integrity": "sha512-CuAZ04Vokfvo3oE2wpceGPOCH8yIeLukuukjzrs6YidOOdmOC75sbnrAWm7I6min3+xLr26XLM50Zh3KDK7row==", "license": "MIT", "dependencies": { - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1", "keyborg": "^2.6.0", @@ -3151,25 +3121,25 @@ } }, "node_modules/@fluentui/react-tag-picker": { - "version": "9.7.14", - "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.7.14.tgz", - "integrity": "sha512-SMrLFkuVdZ/UPLHhumodQcM/V4uxkS3GayCBykddn1OWtWGVLjN4idCes56XGdZyNq79u4BEu7Vtxwucjv3oXg==", + "version": "9.7.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.7.16.tgz", + "integrity": "sha512-b0PETuBrEvBqPHjxBCp+DSylY4dMeHChqYOSqLYa8MdsSbp37u8wjqcwhzj7XWYSalb3sFGnH0PWYzoteN3DcQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-combobox": "^9.16.13", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-field": "^9.4.12", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-combobox": "^9.16.15", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-field": "^9.4.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-positioning": "^9.20.11", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-tags": "^9.7.13", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-positioning": "^9.20.12", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-tags": "^9.7.15", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3181,20 +3151,20 @@ } }, "node_modules/@fluentui/react-tags": { - "version": "9.7.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.7.13.tgz", - "integrity": "sha512-lg6C4b0RZKroQROSyezrLusR8/p/W6poQyKrJSEigiYhGZUm32Z+oi7qS7FDahVV/DA2vpRnuY/IfclIDszvTQ==", + "version": "9.7.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.7.15.tgz", + "integrity": "sha512-T1imCOoatkqu/sAce36Jiq/LUFmGMEKovyo3yahfiRu9uKRhGOO+uaLOWTg5WeHtXYdA+kLw240sAeo5snjPnA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-avatar": "^9.9.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-avatar": "^9.10.0", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3206,21 +3176,21 @@ } }, "node_modules/@fluentui/react-teaching-popover": { - "version": "9.6.14", - "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.6.14.tgz", - "integrity": "sha512-3FRyaoRSO/XJGiOJxRe1E7bdDPr8KZEX/Dp/IYRn45Y2War308sscaUUPz0N3ut9iRQlT2edsHSlBMNprLEXRQ==", + "version": "9.6.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.6.16.tgz", + "integrity": "sha512-IV9nKU0Gd9ZnMHXra3lsz6wAg5E63db2IXnugNB+IxC+1YKMAo0ShCupPua/5pFPRH6ufAMd46ltZLUUPME/MQ==", "license": "MIT", "dependencies": { - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-button": "^9.7.1", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-button": "^9.8.1", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-popover": "^9.12.13", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-popover": "^9.13.1", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1", "use-sync-external-store": "^1.2.0" @@ -3233,15 +3203,15 @@ } }, "node_modules/@fluentui/react-text": { - "version": "9.6.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.6.12.tgz", - "integrity": "sha512-IYiyYflw3ozS2Kil93vIqgu4JAJvFLswldJ5oBgBVOAM+MGG7G7He7Dp9tVRYxqHxkA54Um5Mv3HcUUgJ5sqww==", + "version": "9.6.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.6.14.tgz", + "integrity": "sha512-ZeddqRqK+4sqctMgbUzXPxaGriHoEDY3S5T8BUM6x2Rb7wBA2cQmb/zh6kr820Rs0A8FREn09XZdM40ueOo0pA==", "license": "MIT", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3253,16 +3223,16 @@ } }, "node_modules/@fluentui/react-textarea": { - "version": "9.6.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.6.12.tgz", - "integrity": "sha512-xoRYQpc76qc0WsAlOKhygnhZActTbbPvNdQU12R6bk6P4fUPBgX6rNMsNv6cVSr3ZvPuWn3bQq80PjPO10iezA==", + "version": "9.6.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.6.14.tgz", + "integrity": "sha512-7hO333OdYbvlVHg4PcymtmsVn8dFOGU704bVDzS/AwFV/6k6PliJ74RP1ufeudtQAty9VW2EoJwHCtwGlgputw==", "license": "MIT", "dependencies": { - "@fluentui/react-field": "^9.4.12", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-field": "^9.4.14", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3274,32 +3244,32 @@ } }, "node_modules/@fluentui/react-theme": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.2.0.tgz", - "integrity": "sha512-Q0zp/MY1m5RjlkcwMcjn/PQRT2T+q3bgxuxWbhgaD07V+tLzBhGROvuqbsdg4YWF/IK21zPfLhmGyifhEu0DnQ==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.2.1.tgz", + "integrity": "sha512-lJxfz7LmmglFz+c9C41qmMqaRRZZUPtPPl9DWQ79vH+JwZd4dkN7eA78OTRwcGCOTPEKoLTX72R+EFaWEDlX+w==", "license": "MIT", "dependencies": { - "@fluentui/tokens": "1.0.0-alpha.22", + "@fluentui/tokens": "1.0.0-alpha.23", "@swc/helpers": "^0.5.1" } }, "node_modules/@fluentui/react-toast": { - "version": "9.7.10", - "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.7.10.tgz", - "integrity": "sha512-Zvh/19VpFXft7VFvlHEyURg766RyKBE6eekrmtgE416ow07pfn1a7X7VqTyfp90uEaJsowB//twJNjCc3r3oAw==", + "version": "9.7.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.7.12.tgz", + "integrity": "sha512-lehROila3FzNZihC+BLtqe/c00JHOo53awYY9ejzLpnEwU9u78MYgTm4dFweeFh0CAMiw3yEzYpI6FZhn4B3mg==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", + "@fluentui/react-aria": "^9.17.9", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-motion-components-preview": "^0.14.2", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-motion-components-preview": "^0.15.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3311,20 +3281,20 @@ } }, "node_modules/@fluentui/react-toolbar": { - "version": "9.6.14", - "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.6.14.tgz", - "integrity": "sha512-wjUqbfNSGlmgpMsJvpd8C7qzXUav3pb88ctyzziweURZskOMAIx8wv0PHUih9h9haMB5ayTiLuJL4Lcpv6jNlA==", - "license": "MIT", - "dependencies": { - "@fluentui/react-button": "^9.7.1", - "@fluentui/react-context-selector": "^9.2.13", - "@fluentui/react-divider": "^9.5.1", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-radio": "^9.5.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "version": "9.7.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.7.2.tgz", + "integrity": "sha512-zyr89s7W/HcVMNcbZ/u0rU55e3+Zyy2hEVsnf3P6hic7eIEjW5hTDJwdcLfZ6D41KZKzHG17uFKqGPH/0OSCyg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-button": "^9.8.1", + "@fluentui/react-context-selector": "^9.2.14", + "@fluentui/react-divider": "^9.6.1", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-radio": "^9.5.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3336,19 +3306,19 @@ } }, "node_modules/@fluentui/react-tooltip": { - "version": "9.8.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.8.12.tgz", - "integrity": "sha512-ZA36KqmGWhK1HmNd1HO5p3Fz3cM06p/1kSKEB6b+F2opY+Db8IQGa6ER8wVtxLnUs/WFrcjJPcy7DuD2oyeSFQ==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.9.1.tgz", + "integrity": "sha512-iSJfIis9dHHkymkasH/AI5R+2t4wI2ecCoqRwkW5dBAOV8YTWC0vgTHCubfWfTkYt303nqEdteCbGAIEene8hQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-portal": "^9.8.9", - "@fluentui/react-positioning": "^9.20.11", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-portal": "^9.8.10", + "@fluentui/react-positioning": "^9.20.12", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3360,26 +3330,26 @@ } }, "node_modules/@fluentui/react-tree": { - "version": "9.15.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.15.8.tgz", - "integrity": "sha512-T2USjFQ2tPb0TzX3FagifQzJKYGq0T8IQYHdfHO7LP7sThI13Mnt6ke7mGC3SOPi8WKUCMRaoXAksbggUMXFUQ==", + "version": "9.15.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.15.10.tgz", + "integrity": "sha512-V0q4H7XBmARre7oKPuxGZaFdz4K6ptNmBd4bNRa0geqOsSdNI4XJ8i5tAetDeGd2lS8AlA9D5NyzlBSXvBzazQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.17.7", - "@fluentui/react-avatar": "^9.9.13", - "@fluentui/react-button": "^9.7.1", - "@fluentui/react-checkbox": "^9.5.12", - "@fluentui/react-context-selector": "^9.2.13", + "@fluentui/react-aria": "^9.17.9", + "@fluentui/react-avatar": "^9.10.0", + "@fluentui/react-button": "^9.8.1", + "@fluentui/react-checkbox": "^9.5.14", + "@fluentui/react-context-selector": "^9.2.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-motion": "^9.11.5", - "@fluentui/react-motion-components-preview": "^0.14.2", - "@fluentui/react-radio": "^9.5.12", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-tabster": "^9.26.11", - "@fluentui/react-theme": "^9.2.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-motion": "^9.11.6", + "@fluentui/react-motion-components-preview": "^0.15.0", + "@fluentui/react-radio": "^9.5.14", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-tabster": "^9.26.12", + "@fluentui/react-theme": "^9.2.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3391,13 +3361,13 @@ } }, "node_modules/@fluentui/react-utilities": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.26.0.tgz", - "integrity": "sha512-3i/Vdt9UzDs/vuQvdR6HJFMhkOqB22lOGJ+v6VpkjGO81ywnQwP4LKkaKK534q+qiVbcKumCkHOeRhtMAUJXPQ==", + "version": "9.26.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.26.1.tgz", + "integrity": "sha512-TCJ7TAQh4Lf4uEdbbFARhq3MqAGoGAsVKNPf/y54NCOsKnKnTHyQUvhIKFGJGxPpiqbLxqKspPEQOVZNL9am1A==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-shared-contexts": "^9.26.0", + "@fluentui/react-shared-contexts": "^9.26.1", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -3406,14 +3376,14 @@ } }, "node_modules/@fluentui/react-virtualizer": { - "version": "9.0.0-alpha.108", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.108.tgz", - "integrity": "sha512-2uaGDhGbVZqBd/INh2tiSefVUwdAPK/PDJ8e0pJ34+N77A1Mcq9eSbyaBp5GLZ/GcycHAWnnyDCall9Avpqo6g==", + "version": "9.0.0-alpha.110", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.110.tgz", + "integrity": "sha512-8wW2BBXS5rIfG+tyPBi38KLrJgoTT1h/aCrRSOhk8TBZi9qjQEcnkCa8otZTtSohB92Mit94KhVgmYlUxY8WEA==", "license": "MIT", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.3.4", - "@fluentui/react-shared-contexts": "^9.26.0", - "@fluentui/react-utilities": "^9.26.0", + "@fluentui/react-jsx-runtime": "^9.4.0", + "@fluentui/react-shared-contexts": "^9.26.1", + "@fluentui/react-utilities": "^9.26.1", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" }, @@ -3425,9 +3395,9 @@ } }, "node_modules/@fluentui/tokens": { - "version": "1.0.0-alpha.22", - "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.22.tgz", - "integrity": "sha512-i9fgYyyCWFRdUi+vQwnV6hp7wpLGK4p09B+O/f2u71GBXzPuniubPYvrIJYtl444DD6shLjYToJhQ1S6XTFwLg==", + "version": "1.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.23.tgz", + "integrity": "sha512-uxrzF9Z+J10naP0pGS7zPmzSkspSS+3OJDmYIK3o1nkntQrgBXq3dBob4xSlTDm5aOQ0kw6EvB9wQgtlyy4eKQ==", "license": "MIT", "dependencies": { "@swc/helpers": "^0.5.1" @@ -3838,16 +3808,16 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", - "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", "cpu": [ "arm" ], @@ -3859,9 +3829,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", "cpu": [ "arm64" ], @@ -3873,9 +3843,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], @@ -3887,9 +3857,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", "cpu": [ "x64" ], @@ -3901,9 +3871,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", "cpu": [ "arm64" ], @@ -3915,9 +3885,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", "cpu": [ "x64" ], @@ -3929,9 +3899,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", "cpu": [ "arm" ], @@ -3943,9 +3913,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", "cpu": [ "arm" ], @@ -3957,9 +3927,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", "cpu": [ "arm64" ], @@ -3971,9 +3941,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", "cpu": [ "arm64" ], @@ -3985,9 +3955,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", "cpu": [ "loong64" ], @@ -3999,9 +3969,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", "cpu": [ "loong64" ], @@ -4013,9 +3983,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", "cpu": [ "ppc64" ], @@ -4027,9 +3997,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", "cpu": [ "ppc64" ], @@ -4041,9 +4011,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", "cpu": [ "riscv64" ], @@ -4055,9 +4025,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", "cpu": [ "riscv64" ], @@ -4069,9 +4039,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", "cpu": [ "s390x" ], @@ -4096,9 +4066,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", "cpu": [ "x64" ], @@ -4110,9 +4080,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", "cpu": [ "x64" ], @@ -4124,9 +4094,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", "cpu": [ "arm64" ], @@ -4138,9 +4108,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", "cpu": [ "arm64" ], @@ -4152,9 +4122,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", "cpu": [ "ia32" ], @@ -4166,9 +4136,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", "cpu": [ "x64" ], @@ -4180,9 +4150,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", "cpu": [ "x64" ], @@ -4256,6 +4226,13 @@ "@types/ms": "*" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -4303,9 +4280,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.8.tgz", - "integrity": "sha512-r0bBaXu5Swb05doFYO2kTWHMovJnNVbCsII0fhesM8bNRlLhXIuckley4a2DaD+vOdmm5G+zGkQZAPZsF80+YQ==", + "version": "24.10.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", + "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", "dev": true, "license": "MIT", "dependencies": { @@ -4313,15 +4290,15 @@ } }, "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", "license": "MIT" }, "node_modules/@types/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", - "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "dev": true, "license": "MIT", "dependencies": { @@ -4355,17 +4332,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", - "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/type-utils": "8.53.0", - "@typescript-eslint/utils": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/type-utils": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -4378,8 +4355,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.53.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/parser": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -4394,16 +4371,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz", - "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3" }, "engines": { @@ -4414,19 +4391,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", - "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", + "@typescript-eslint/tsconfig-utils": "^8.56.0", + "@typescript-eslint/types": "^8.56.0", "debug": "^4.4.3" }, "engines": { @@ -4441,14 +4418,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", - "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4459,9 +4436,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", - "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -4476,15 +4453,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", - "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -4496,14 +4473,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", - "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -4515,16 +4492,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", - "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.53.0", - "@typescript-eslint/tsconfig-utils": "8.53.0", - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", + "@typescript-eslint/project-service": "8.56.0", + "@typescript-eslint/tsconfig-utils": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -4542,36 +4519,10 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "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/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -4582,16 +4533,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", - "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0" + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4601,19 +4552,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", - "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4630,16 +4581,16 @@ "license": "ISC" }, "node_modules/@vitejs/plugin-react": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", - "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.5", + "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.53", + "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, @@ -4690,29 +4641,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "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/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -4724,16 +4652,19 @@ } }, "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==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", + "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "20 || >=22" + } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.14", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", - "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4741,14 +4672,16 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/browserslist": { @@ -4785,20 +4718,10 @@ "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.30001764", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", - "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", + "version": "1.0.30001770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", "dev": true, "funding": [ { @@ -4826,23 +4749,6 @@ "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", @@ -4892,26 +4798,6 @@ "node": ">=6" } }, - "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/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -4922,13 +4808,6 @@ "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", @@ -4994,9 +4873,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -5036,9 +4915,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", "dev": true, "license": "ISC" }, @@ -5067,9 +4946,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5080,32 +4959,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/escalade": { @@ -5132,33 +5011,30 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.0.tgz", + "integrity": "sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.0", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.0", + "@eslint/plugin-kit": "^0.6.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", - "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.0", + "eslint-visitor-keys": "^5.0.0", + "espree": "^11.1.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -5168,8 +5044,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.1.1", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -5177,7 +5052,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -5212,58 +5087,60 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", - "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.0.tgz", + "integrity": "sha512-ZYvmh7VfVgqR/7wR71I3Zl6hK/C5CcxdWYKZSpHawS5JCNgE4efhQWg/+/WPpgGAp9Ngp/rRZYyaIwmPQBq/lA==", "dev": true, "license": "MIT", "peerDependencies": { - "eslint": ">=8.40" + "eslint": ">=9" } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.0.tgz", + "integrity": "sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.0.tgz", + "integrity": "sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5493,16 +5370,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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-is-element": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", @@ -5669,23 +5536,6 @@ "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "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", @@ -5805,19 +5655,6 @@ "dev": true, "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "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", @@ -5938,13 +5775,6 @@ "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", @@ -6849,16 +6679,19 @@ "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", + "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ms": { @@ -6950,19 +6783,6 @@ "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", @@ -7097,24 +6917,24 @@ } }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.2.4" } }, "node_modules/react-error-boundary": { @@ -7133,12 +6953,6 @@ "react": ">=16.13.1" } }, - "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": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", @@ -7348,20 +7162,10 @@ "url": "https://opencollective.com/unified" } }, - "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/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, "license": "MIT", "dependencies": { @@ -7375,38 +7179,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", "cpu": [ "x64" ], @@ -7499,19 +7303,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "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-js": { "version": "1.1.21", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", @@ -7536,19 +7327,6 @@ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "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.7.0", "resolved": "https://registry.npmjs.org/tabster/-/tabster-8.7.0.tgz", @@ -7652,16 +7430,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.0.tgz", - "integrity": "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", + "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.53.0", - "@typescript-eslint/parser": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/utils": "8.53.0" + "@typescript-eslint/eslint-plugin": "8.56.0", + "@typescript-eslint/parser": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7671,7 +7449,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -7755,9 +7533,9 @@ } }, "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==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -8000,9 +7778,9 @@ } }, "node_modules/zod": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", - "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", "funding": { diff --git a/frontend/package.json b/frontend/package.json index 79c6432..f1cbb2e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,7 +18,6 @@ "@fluentui/react-components": "^9.72.9", "@fluentui/react-icons": "^2.0.316", "clsx": "^2.1.1", - "yjs": "^13.6.29", "copy-to-clipboard": "^3.3.3", "date-fns": "^4.1.0", "react": "^19.2.3", @@ -28,21 +27,25 @@ "rehype-highlight": "^7.0.2", "rehype-sanitize": "^6.0.0", "remark-breaks": "^4.0.0", - "remark-gfm": "^4.0.1" + "remark-gfm": "^4.0.1", + "yjs": "^13.6.29" + }, + "overrides": { + "minimatch": "^10.2.1" }, "devDependencies": { - "@eslint/js": "^9.39.1", + "@eslint/js": "^10.0.1", "@types/node": "^24.10.1", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/react-syntax-highlighter": "^15.5.13", "@vitejs/plugin-react": "^5.1.1", - "eslint": "^9.39.1", + "eslint": "^10.0.0", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.22", + "eslint-plugin-react-refresh": "^0.5.0", "globals": "^16.5.0", "typescript": "~5.9.3", - "typescript-eslint": "^8.48.1", + "typescript-eslint": "^8.56.0", "vite": "^7.2.6" } } diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 5ef1143..fbdd70b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,11 +5,19 @@ import { InteractionType } from "@azure/msal-browser"; import { ErrorBoundary } from "./components/core/ErrorBoundary"; import { AgentPreview } from "./components/AgentPreview"; import { loginRequest } from "./config/authConfig"; -import { useState, useEffect, useCallback } from "react"; +import { useState, useEffect, useCallback, useMemo } from "react"; import { useAuth } from "./hooks/useAuth"; import type { IAgentMetadata } from "./types/chat"; import "./App.css"; +interface AgentListItem { + id: string; + name: string; + description?: string | null; + model: string; + createdAt: number; +} + function App() { // This hook handles authentication automatically - redirects if not authenticated useMsalAuthentication(InteractionType.Redirect, loginRequest); @@ -17,6 +25,8 @@ function App() { const { getAccessToken } = useAuth(); const [agentMetadata, setAgentMetadata] = useState(null); const [isLoadingAgent, setIsLoadingAgent] = useState(true); + const [agents, setAgents] = useState([]); + const [selectedAgentId, setSelectedAgentId] = useState(null); // Wrap fetchAgentMetadata in useCallback to make it stable for the effect const fetchAgentMetadata = useCallback(async () => { @@ -25,7 +35,7 @@ function App() { try { const token = await getAccessToken(); const apiUrl = import.meta.env.VITE_API_URL || '/api'; - + const response = await fetch(`${apiUrl}/agent`, { headers: { 'Authorization': `Bearer ${token}`, @@ -39,7 +49,10 @@ function App() { const data = await response.json(); setAgentMetadata(data); - + + // Default selection to the configured agent + setSelectedAgentId((prev) => prev ?? data.id); + // Update document title with agent name document.title = data.name ? `${data.name} - Azure AI Agent` : 'Azure AI Agent'; } catch (error) { @@ -60,9 +73,74 @@ function App() { } }, [auth.status, getAccessToken]); + // Fetch agent list for the picker + const fetchAgentsList = useCallback(async () => { + if (auth.status !== 'authenticated') return; + + try { + const token = await getAccessToken(); + const apiUrl = import.meta.env.VITE_API_URL || '/api'; + + const response = await fetch(`${apiUrl}/agents`, { + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + setAgents(data.agents ?? []); + } catch (error) { + console.error('Error fetching agents list:', error); + } + }, [auth.status, getAccessToken]); + useEffect(() => { fetchAgentMetadata(); - }, [fetchAgentMetadata]); + fetchAgentsList(); + }, [fetchAgentMetadata, fetchAgentsList]); + + // Derive active agent: use rich metadata for the default agent, list data for others + const activeAgent = useMemo(() => { + if (!agentMetadata) return null; + + // If selected agent is the default (configured) agent, use rich metadata + if (!selectedAgentId || selectedAgentId === agentMetadata.id) { + return agentMetadata; + } + + // For non-default agents, use list data + const listAgent = agents.find((a) => a.id === selectedAgentId); + if (listAgent) { + return { + id: listAgent.id, + object: 'agent' as const, + createdAt: listAgent.createdAt, + name: listAgent.name, + description: listAgent.description, + model: listAgent.model, + } satisfies IAgentMetadata; + } + + // Fallback to default agent if selected agent not found in list + return agentMetadata; + }, [agentMetadata, selectedAgentId, agents]); + + // Agent picker options + const agentOptions = useMemo( + () => agents.map((a) => ({ id: a.id, name: a.name })), + [agents] + ); + + const handleAgentChange = useCallback((agentId: string) => { + setSelectedAgentId(agentId); + const agent = agents.find((a) => a.id === agentId); + document.title = agent?.name ? `${agent.name} - Azure AI Agent` : 'Azure AI Agent'; + }, [agents]); return ( @@ -83,14 +161,17 @@ function App() { ) : ( <> - {agentMetadata && ( + {activeAgent && (
-
)} diff --git a/frontend/src/components/AgentPreview.tsx b/frontend/src/components/AgentPreview.tsx index 3401d3c..f0f630f 100644 --- a/frontend/src/components/AgentPreview.tsx +++ b/frontend/src/components/AgentPreview.tsx @@ -1,21 +1,29 @@ -import React, { useState, useMemo } from 'react'; +import React, { useState, useMemo, useEffect, useCallback } from 'react'; import { ChatInterface } from './ChatInterface'; import { SettingsPanel } from './core/SettingsPanel'; import { useAppState } from '../hooks/useAppState'; import { useAuth } from '../hooks/useAuth'; import { ChatService } from '../services/chatService'; -import { useAppContext } from '../contexts/AppContext'; +import { useAppContext } from '../hooks/useAppContext'; import styles from './AgentPreview.module.css'; +interface AgentOption { + id: string; + name: string; +} + interface AgentPreviewProps { agentId: string; agentName: string; agentDescription?: string; agentLogo?: string; starterPrompts?: string[]; + agents?: AgentOption[]; + selectedAgentId?: string; + onAgentChange?: (agentId: string) => void; } -export const AgentPreview: React.FC = ({ agentId: _agentId, agentName, agentDescription, agentLogo, starterPrompts }) => { +export const AgentPreview: React.FC = ({ agentName, agentDescription, agentLogo, starterPrompts, agents, selectedAgentId, onAgentChange }) => { const { chat } = useAppState(); const { dispatch } = useAppContext(); const { getAccessToken } = useAuth(); @@ -23,11 +31,22 @@ export const AgentPreview: React.FC = ({ agentId: _agentId, a // Create service instances const apiUrl = import.meta.env.VITE_API_URL || '/api'; - + const chatService = useMemo(() => { return new ChatService(apiUrl, getAccessToken, dispatch); }, [apiUrl, getAccessToken, dispatch]); + // Sync agentId to chatService when selection changes + useEffect(() => { + chatService.setAgentId(selectedAgentId ?? null); + }, [chatService, selectedAgentId]); + + // Clear chat when agent changes, then propagate + const handleAgentChange = useCallback((newAgentId: string) => { + chatService.clearChat(); + onAgentChange?.(newAgentId); + }, [chatService, onAgentChange]); + const handleSendMessage = async (text: string, files?: File[]) => { await chatService.sendMessage(text, chat.currentConversationId, files); }; @@ -80,6 +99,10 @@ export const AgentPreview: React.FC = ({ agentId: _agentId, a ); diff --git a/frontend/src/components/ChatInterface.tsx b/frontend/src/components/ChatInterface.tsx index b4ceed7..fa2ab9f 100644 --- a/frontend/src/components/ChatInterface.tsx +++ b/frontend/src/components/ChatInterface.tsx @@ -1,4 +1,4 @@ -import { useRef, useEffect, useState } from "react"; +import { useRef, useEffect, useMemo } from "react"; import { AssistantMessage } from "./chat/AssistantMessage"; import { UserMessage } from "./chat/UserMessage"; import { McpApprovalCard } from "./chat/McpApprovalCard"; @@ -35,11 +35,33 @@ interface ChatInterfaceProps { export const ChatInterface: React.FC = (props) => { const { messages, status, error, streamingMessageId, onSendMessage, onMcpApproval, onClearError, onOpenSettings, onNewChat, onCancelStream, hasMessages, disabled, agentName, agentDescription, agentLogo, starterPrompts, conversationId } = props; const messagesEndRef = useRef(null); - const [liveRegionMessage, setLiveRegionMessage] = useState(''); - + const liveRegionRef = useRef(null); + const clearTimerRef = useRef>(undefined); + const isStreaming = status === 'streaming'; const isBusy = disabled || ['sending', 'streaming'].includes(status); + // Derive live region message from props and announce via DOM ref to avoid setState-in-effect + const lastMessageIsAssistant = messages.length > 0 && messages[messages.length - 1].role === 'assistant'; + const liveRegionMessage = useMemo(() => { + if (isStreaming) return 'Assistant is responding'; + if (status === 'idle' && lastMessageIsAssistant) return 'Response complete'; + return ''; + }, [isStreaming, status, lastMessageIsAssistant]); + + // Clear the announcement after 1s when response completes + useEffect(() => { + clearTimeout(clearTimerRef.current); + if (liveRegionMessage === 'Response complete') { + clearTimerRef.current = setTimeout(() => { + if (liveRegionRef.current) { + liveRegionRef.current.textContent = ''; + } + }, 1000); + return () => clearTimeout(clearTimerRef.current); + } + }, [liveRegionMessage]); + const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }); }; @@ -49,18 +71,6 @@ export const ChatInterface: React.FC = (props) => { scrollToBottom(); }, [messages]); - // Announce streaming status changes to screen readers - useEffect(() => { - if (isStreaming) { - setLiveRegionMessage('Assistant is responding'); - } else if (status === 'idle' && messages.length > 0 && messages[messages.length - 1].role === 'assistant') { - setLiveRegionMessage('Response complete'); - // Clear the message after announcement - const timer = setTimeout(() => setLiveRegionMessage(''), 1000); - return () => clearTimeout(timer); - } - }, [isStreaming, status, messages]); - const handleSendMessage = (messageText: string, files?: File[]) => { if (!messageText.trim() || disabled) return; onSendMessage(messageText, files); @@ -73,9 +83,10 @@ export const ChatInterface: React.FC = (props) => { return (
{/* Live region for announcing streaming status to screen readers */} -
diff --git a/frontend/src/components/chat/ChatInput.tsx b/frontend/src/components/chat/ChatInput.tsx index 5dbc8d1..e7d3247 100644 --- a/frontend/src/components/chat/ChatInput.tsx +++ b/frontend/src/components/chat/ChatInput.tsx @@ -90,7 +90,7 @@ export const ChatInput: React.FC = ({ const timer = setTimeout(() => focusInput(inputContainerRef), 100); return () => clearTimeout(timer); } - }, []); // Only on mount + }, [disabled]); // Only on mount // Restore focus after message is sent (when status changes from disabled back to enabled) useEffect(() => { diff --git a/frontend/src/components/chat/FilePreview.tsx b/frontend/src/components/chat/FilePreview.tsx index ee5430c..e483559 100644 --- a/frontend/src/components/chat/FilePreview.tsx +++ b/frontend/src/components/chat/FilePreview.tsx @@ -126,9 +126,14 @@ export const FilePreview: React.FC = ({ files, onRemove, disab useEffect(() => { const currentFileKeys = new Set(files.map(getFileKey)); - + // Clean up previews for removed files setThumbnails(prev => { + let changed = false; + for (const key of prev.keys()) { + if (!currentFileKeys.has(key)) { changed = true; break; } + } + if (!changed) return prev; const updated = new Map(); for (const [key, value] of prev) { if (currentFileKeys.has(key)) { @@ -137,8 +142,13 @@ export const FilePreview: React.FC = ({ files, onRemove, disab } return updated; }); - + setTextPreviews(prev => { + let changed = false; + for (const key of prev.keys()) { + if (!currentFileKeys.has(key)) { changed = true; break; } + } + if (!changed) return prev; const updated = new Map(); for (const [key, value] of prev) { if (currentFileKeys.has(key)) { @@ -147,7 +157,7 @@ export const FilePreview: React.FC = ({ files, onRemove, disab } return updated; }); - + // Clear pending reads for removed files for (const key of pendingReadsRef.current) { if (!currentFileKeys.has(key)) { @@ -159,52 +169,40 @@ export const FilePreview: React.FC = ({ files, onRemove, disab for (const file of files) { const fileKey = getFileKey(file); const mimeType = getEffectiveMimeType(file); - + // Skip if already loaded or currently loading if (pendingReadsRef.current.has(fileKey)) continue; - - if (mimeType.startsWith('image/')) { - // Check if already have this thumbnail - setThumbnails(prev => { - if (prev.has(fileKey)) return prev; - - pendingReadsRef.current.add(fileKey); - const reader = new FileReader(); - reader.onload = (e) => { - pendingReadsRef.current.delete(fileKey); - if (e.target?.result) { - setThumbnails(p => new Map(p).set(fileKey, e.target!.result as string)); - } - }; - reader.onerror = () => { - pendingReadsRef.current.delete(fileKey); - }; - reader.readAsDataURL(file); - return prev; - }); - } else if (isTextPreviewable(file)) { - // Check if already have this text preview - setTextPreviews(prev => { - if (prev.has(fileKey)) return prev; - - pendingReadsRef.current.add(fileKey); - const reader = new FileReader(); - reader.onload = (e) => { - pendingReadsRef.current.delete(fileKey); - if (e.target?.result) { - const text = e.target.result as string; - // Limit preview to first 200 characters for display - setTextPreviews(p => new Map(p).set(fileKey, text.slice(0, 200))); - } - }; - reader.onerror = () => { - pendingReadsRef.current.delete(fileKey); - }; - reader.readAsText(file); - return prev; - }); + + if (mimeType.startsWith('image/') && !thumbnails.has(fileKey)) { + pendingReadsRef.current.add(fileKey); + const reader = new FileReader(); + reader.onload = (e) => { + pendingReadsRef.current.delete(fileKey); + if (e.target?.result) { + setThumbnails(p => new Map(p).set(fileKey, e.target!.result as string)); + } + }; + reader.onerror = () => { + pendingReadsRef.current.delete(fileKey); + }; + reader.readAsDataURL(file); + } else if (isTextPreviewable(file) && !textPreviews.has(fileKey)) { + pendingReadsRef.current.add(fileKey); + const reader = new FileReader(); + reader.onload = (e) => { + pendingReadsRef.current.delete(fileKey); + if (e.target?.result) { + const text = e.target.result as string; + setTextPreviews(p => new Map(p).set(fileKey, text.slice(0, 200))); + } + }; + reader.onerror = () => { + pendingReadsRef.current.delete(fileKey); + }; + reader.readAsText(file); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [files]); const formatFileSize = (bytes: number): string => { diff --git a/frontend/src/components/core/AgentIcon.tsx b/frontend/src/components/core/AgentIcon.tsx index 0659cbf..8f742c3 100644 --- a/frontend/src/components/core/AgentIcon.tsx +++ b/frontend/src/components/core/AgentIcon.tsx @@ -23,7 +23,7 @@ export function AgentIcon({ aria-label={alt} image={logoUrl ? { src: logoUrl } : undefined} icon={!logoUrl ? : undefined} - size={sizeMap[size] as any} + size={sizeMap[size] as 16 | 20 | 24 | 28 | 32 | 36 | 40 | 48 | 56 | 64 | 72 | 96 | 120 | 128} color="brand" /> ); diff --git a/frontend/src/components/core/AgentPicker.tsx b/frontend/src/components/core/AgentPicker.tsx new file mode 100644 index 0000000..92a48d9 --- /dev/null +++ b/frontend/src/components/core/AgentPicker.tsx @@ -0,0 +1,46 @@ +import { useMemo } from 'react'; +import { Dropdown, Option, Label } from '@fluentui/react-components'; + +interface AgentOption { + id: string; + name: string; +} + +interface AgentPickerProps { + agents: AgentOption[]; + selectedAgentId: string; + onAgentChange: (agentId: string) => void; + disabled?: boolean; +} + +export function AgentPicker({ agents, selectedAgentId, onAgentChange, disabled }: AgentPickerProps) { + const selectedText = useMemo( + () => agents.find((a) => a.id === selectedAgentId)?.name ?? selectedAgentId, + [agents, selectedAgentId] + ); + + const selectedOptions = useMemo(() => [selectedAgentId], [selectedAgentId]); + + return ( + <> + + { + if (optionValue !== undefined) { + onAgentChange(optionValue); + } + }} + selectedOptions={selectedOptions} + value={selectedText} + disabled={disabled} + > + {agents.map((agent) => ( + + ))} + + + ); +} diff --git a/frontend/src/components/core/DefaultErrorFallback.tsx b/frontend/src/components/core/DefaultErrorFallback.tsx new file mode 100644 index 0000000..5a3284a --- /dev/null +++ b/frontend/src/components/core/DefaultErrorFallback.tsx @@ -0,0 +1,96 @@ +import { makeStyles, tokens, Text, Button } from '@fluentui/react-components'; +import { ErrorCircleRegular } from '@fluentui/react-icons'; + +const useStyles = makeStyles({ + container: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + minHeight: '100vh', + padding: tokens.spacingVerticalXXL, + gap: tokens.spacingVerticalL, + backgroundColor: tokens.colorNeutralBackground1, + }, + icon: { + fontSize: '48px', + color: tokens.colorPaletteRedForeground1, + }, + title: { + fontSize: tokens.fontSizeHero800, + fontWeight: tokens.fontWeightSemibold, + color: tokens.colorNeutralForeground1, + }, + message: { + fontSize: tokens.fontSizeBase300, + color: tokens.colorNeutralForeground2, + textAlign: 'center', + maxWidth: '600px', + }, + details: { + fontSize: tokens.fontSizeBase200, + color: tokens.colorNeutralForeground3, + fontFamily: tokens.fontFamilyMonospace, + backgroundColor: tokens.colorNeutralBackground3, + padding: tokens.spacingVerticalM, + borderRadius: tokens.borderRadiusMedium, + maxWidth: '800px', + width: '100%', + overflowX: 'auto', + }, + errorText: { + marginBottom: tokens.spacingVerticalS, + }, + stackTrace: { + margin: 0, + fontSize: tokens.fontSizeBase100, + whiteSpace: 'pre-wrap', + wordBreak: 'break-word', + }, + actions: { + display: 'flex', + gap: tokens.spacingHorizontalM, + marginTop: tokens.spacingVerticalM, + }, +}); + +/** + * Default fallback UI for ErrorBoundary + */ +export function DefaultErrorFallback({ error, resetError }: { error: Error; resetError: () => void }) { + const styles = useStyles(); + + const handleReload = () => { + window.location.reload(); + }; + + return ( +
+ + Something went wrong + + An unexpected error occurred. You can try refreshing the page or starting a new chat. + + + {import.meta.env.DEV && error.stack && ( +
+
+ Error: {error.message} +
+
+            {error.stack}
+          
+
+ )} + +
+ + +
+
+ ); +} diff --git a/frontend/src/components/core/ErrorBoundary.tsx b/frontend/src/components/core/ErrorBoundary.tsx index e492846..4f001bc 100644 --- a/frontend/src/components/core/ErrorBoundary.tsx +++ b/frontend/src/components/core/ErrorBoundary.tsx @@ -1,59 +1,5 @@ import React, { Component, type ReactNode } from 'react'; -import { makeStyles, tokens, Text, Button } from '@fluentui/react-components'; -import { ErrorCircleRegular } from '@fluentui/react-icons'; - -const useStyles = makeStyles({ - container: { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - justifyContent: 'center', - minHeight: '100vh', - padding: tokens.spacingVerticalXXL, - gap: tokens.spacingVerticalL, - backgroundColor: tokens.colorNeutralBackground1, - }, - icon: { - fontSize: '48px', - color: tokens.colorPaletteRedForeground1, - }, - title: { - fontSize: tokens.fontSizeHero800, - fontWeight: tokens.fontWeightSemibold, - color: tokens.colorNeutralForeground1, - }, - message: { - fontSize: tokens.fontSizeBase300, - color: tokens.colorNeutralForeground2, - textAlign: 'center', - maxWidth: '600px', - }, - details: { - fontSize: tokens.fontSizeBase200, - color: tokens.colorNeutralForeground3, - fontFamily: tokens.fontFamilyMonospace, - backgroundColor: tokens.colorNeutralBackground3, - padding: tokens.spacingVerticalM, - borderRadius: tokens.borderRadiusMedium, - maxWidth: '800px', - width: '100%', - overflowX: 'auto', - }, - errorText: { - marginBottom: tokens.spacingVerticalS, - }, - stackTrace: { - margin: 0, - fontSize: tokens.fontSizeBase100, - whiteSpace: 'pre-wrap', - wordBreak: 'break-word', - }, - actions: { - display: 'flex', - gap: tokens.spacingHorizontalM, - marginTop: tokens.spacingVerticalM, - }, -}); +import { DefaultErrorFallback } from './DefaultErrorFallback'; interface ErrorBoundaryProps { children: ReactNode; @@ -94,7 +40,7 @@ export class ErrorBoundary extends Component void }) { - const styles = useStyles(); - - const handleReload = () => { - window.location.reload(); - }; - - return ( -
- - Something went wrong - - An unexpected error occurred. You can try refreshing the page or starting a new chat. - - - {import.meta.env.DEV && error.stack && ( -
-
- Error: {error.message} -
-
-            {error.stack}
-          
-
- )} - -
- - -
-
- ); -} diff --git a/frontend/src/components/core/SettingsPanel.tsx b/frontend/src/components/core/SettingsPanel.tsx index 89d7caa..cea2ab9 100644 --- a/frontend/src/components/core/SettingsPanel.tsx +++ b/frontend/src/components/core/SettingsPanel.tsx @@ -10,10 +10,20 @@ import { } from '@fluentui/react-components'; import { Dismiss24Regular } from '@fluentui/react-icons'; import { ThemePicker } from './ThemePicker'; +import { AgentPicker } from './AgentPicker'; + +interface AgentOption { + id: string; + name: string; +} interface SettingsPanelProps { isOpen: boolean; onOpenChange: (open: boolean) => void; + agents?: AgentOption[]; + selectedAgentId?: string; + onAgentChange?: (agentId: string) => void; + agentPickerDisabled?: boolean; } const useStyles = makeStyles({ @@ -31,7 +41,7 @@ const useStyles = makeStyles({ }, }); -export const SettingsPanel: React.FC = ({ isOpen, onOpenChange }) => { +export const SettingsPanel: React.FC = ({ isOpen, onOpenChange, agents, selectedAgentId, onAgentChange, agentPickerDisabled }) => { const styles = useStyles(); return ( @@ -57,6 +67,17 @@ export const SettingsPanel: React.FC = ({ isOpen, onOpenChan + {agents && agents.length > 0 && selectedAgentId && onAgentChange && ( +
+
Agent
+ +
+ )}
Appearance
diff --git a/frontend/src/contexts/AppContext.tsx b/frontend/src/contexts/AppContext.tsx index 9eb4e26..0c3d5e4 100644 --- a/frontend/src/contexts/AppContext.tsx +++ b/frontend/src/contexts/AppContext.tsx @@ -1,22 +1,16 @@ -import { createContext, useContext, useReducer, useEffect, useMemo } from 'react'; -import type { ReactNode, Dispatch } from 'react'; +import { useReducer, useEffect, useMemo } from 'react'; +import type { ReactNode } from 'react'; import { useMsal } from '@azure/msal-react'; import type { AppState, AppAction } from '../types/appState'; import { initialAppState } from '../types/appState'; import { appReducer } from '../reducers/appReducer'; - -interface AppContextValue { - state: AppState; - dispatch: Dispatch; -} - -const AppContext = createContext(undefined); +import { AppContext } from './appContextValue'; // Lightweight dev logger prevents accidental prod noise const devLogger = { enabled: import.meta.env.DEV, group(label: string) { if (this.enabled) console.group(label); }, - log: function (...args: any[]) { if (this.enabled) console.log(...args); }, + log: function (...args: unknown[]) { if (this.enabled) console.log(...args); }, end() { if (this.enabled) console.groupEnd(); } }; @@ -26,7 +20,7 @@ const logStateChange = (action: AppAction, prevState: AppState, nextState: AppSt const timestamp = new Date().toISOString().split('T')[1].split('.')[0]; devLogger.group(`🔄 [${timestamp}] ${action.type}`); devLogger.log('Action:', action); - const changes: Record = {}; + const changes: Record = {}; // Track all meaningful state changes if (prevState.auth.status !== nextState.auth.status) { @@ -91,14 +85,4 @@ export const AppProvider: React.FC<{ children: ReactNode }> = ({ children }) => ); }; -/** - * Hook to access app state and dispatch - * Throws error if used outside AppProvider - */ -export const useAppContext = () => { - const context = useContext(AppContext); - if (!context) { - throw new Error('useAppContext must be used within AppProvider'); - } - return context; -}; +// useAppContext hook is in hooks/useAppContext.ts to satisfy react-refresh single-export rule diff --git a/frontend/src/contexts/appContextValue.ts b/frontend/src/contexts/appContextValue.ts new file mode 100644 index 0000000..04112a1 --- /dev/null +++ b/frontend/src/contexts/appContextValue.ts @@ -0,0 +1,10 @@ +import { createContext } from 'react'; +import type { Dispatch } from 'react'; +import type { AppState, AppAction } from '../types/appState'; + +export interface AppContextValue { + state: AppState; + dispatch: Dispatch; +} + +export const AppContext = createContext(undefined); diff --git a/frontend/src/hooks/useAppContext.ts b/frontend/src/hooks/useAppContext.ts new file mode 100644 index 0000000..8044e82 --- /dev/null +++ b/frontend/src/hooks/useAppContext.ts @@ -0,0 +1,14 @@ +import { useContext } from 'react'; +import { AppContext } from '../contexts/appContextValue'; + +/** + * Hook to access app state and dispatch + * Throws error if used outside AppProvider + */ +export const useAppContext = () => { + const context = useContext(AppContext); + if (!context) { + throw new Error('useAppContext must be used within AppProvider'); + } + return context; +}; diff --git a/frontend/src/hooks/useAppState.ts b/frontend/src/hooks/useAppState.ts index e7e3866..fadce73 100644 --- a/frontend/src/hooks/useAppState.ts +++ b/frontend/src/hooks/useAppState.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { useAppContext } from '../contexts/AppContext'; +import { useAppContext } from './useAppContext'; export const useAppState = () => { const { state, dispatch } = useAppContext(); diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 3814695..bac7d34 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,6 +1,6 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import { PublicClientApplication, EventType } from "@azure/msal-browser"; +import { PublicClientApplication, EventType, type AuthenticationResult } from "@azure/msal-browser"; import { MsalProvider } from "@azure/msal-react"; import App from "./App"; import { msalConfig } from "./config/authConfig"; @@ -21,8 +21,7 @@ msalInstance.initialize().then(() => { msalInstance.addEventCallback((event) => { if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) { - const payload = event.payload as any; - const account = payload.account; + const account = (event.payload as AuthenticationResult).account; msalInstance.setActiveAccount(account); } }); diff --git a/frontend/src/services/chatService.ts b/frontend/src/services/chatService.ts index fdbbebb..83e59d4 100644 --- a/frontend/src/services/chatService.ts +++ b/frontend/src/services/chatService.ts @@ -44,6 +44,7 @@ export class ChatService { private currentStreamAbort?: AbortController; // Flag indicating an intentional user cancellation of the active stream. private streamCancelled = false; + private agentId: string | null = null; constructor( apiUrl: string, @@ -55,6 +56,14 @@ export class ChatService { this.dispatch = dispatch; } + /** + * Set the agent ID to use for subsequent requests. + * Pass null to revert to the default agent. + */ + setAgentId(id: string | null): void { + this.agentId = id; + } + /** * Acquire authentication token using MSAL. * Attempts silent acquisition first, falls back to popup if needed. @@ -132,12 +141,13 @@ export class ChatService { conversationId: string | null, imageDataUris: string[], fileDataUris: Array<{ dataUri: string; fileName: string; mimeType: string }> - ): Record { + ): Record { return { message, conversationId, imageDataUris: imageDataUris.length > 0 ? imageDataUris : undefined, fileDataUris: fileDataUris.length > 0 ? fileDataUris : undefined, + agentId: this.agentId || undefined, }; } @@ -155,7 +165,7 @@ export class ChatService { private async initiateStream( url: string, token: string, - body: Record, + body: Record, signal: AbortSignal ): Promise { const res = await fetch(url, { @@ -393,13 +403,14 @@ export class ChatService { case 'done': return; - case 'error': - const error = createAppError( + case 'error': { + const streamError = createAppError( new Error(`Stream error for message ${messageId}: ${event.data.message}`), 'STREAM' ); - this.dispatch({ type: 'CHAT_ERROR', error }); - throw error; + this.dispatch({ type: 'CHAT_ERROR', error: streamError }); + throw streamError; + } } } } @@ -465,6 +476,7 @@ export class ChatService { approvalRequestId, approved, }, + agentId: this.agentId || undefined, }; const response = await retryWithBackoff( diff --git a/frontend/src/utils/sseParser.ts b/frontend/src/utils/sseParser.ts index f711b44..d838512 100644 --- a/frontend/src/utils/sseParser.ts +++ b/frontend/src/utils/sseParser.ts @@ -6,6 +6,7 @@ export type SseEventType = 'conversationId' | 'chunk' | 'annotations' | 'mcpAppr export interface SseEvent { type: SseEventType; + // eslint-disable-next-line @typescript-eslint/no-explicit-any data: any; }