From 012228d9d13ac6e302eaa7becf4e2e7501ae710c Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 18:28:45 +0000 Subject: [PATCH 01/46] feat: Add telemetry capture to getLLMProviderForProject method --- Common/Server/Services/LlmProviderService.ts | 51 ++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/Common/Server/Services/LlmProviderService.ts b/Common/Server/Services/LlmProviderService.ts index 621e358c90..67b384b8b6 100644 --- a/Common/Server/Services/LlmProviderService.ts +++ b/Common/Server/Services/LlmProviderService.ts @@ -6,6 +6,7 @@ import ObjectID from "../../Types/ObjectID"; import UpdateBy from "../Types/Database/UpdateBy"; import QueryHelper from "../Types/Database/QueryHelper"; import LIMIT_MAX from "../../Types/Database/LimitMax"; +import CaptureSpan from "../Utils/Telemetry/CaptureSpan"; export class Service extends DatabaseService { public constructor() { @@ -95,6 +96,56 @@ export class Service extends DatabaseService { return { updateBy, carryForward: null }; } + + @CaptureSpan() + public async getLLMProviderForProject( + projectId: ObjectID, + ): Promise { + // First try to get the default provider for the project + let provider: Model | null = await this.findOneBy({ + query: { + projectId: projectId, + isDefault: true, + }, + select: { + llmType: true, + apiKey: true, + baseUrl: true, + modelName: true, + }, + props: { + isRoot: true, + }, + }); + + if (provider) { + return provider; + } + + // If no default provider, get any global provider for the project. + provider = await this.findOneBy({ + query: { + projectId: QueryHelper.isNull(), + isGlobalLlm: true, + }, + select: { + llmType: true, + apiKey: true, + baseUrl: true, + modelName: true, + }, + props: { + isRoot: true, + }, + }); + + if (provider) { + return provider; + } + + + return null; + } } export default new Service(); From f69c81e8157075369ce13fc26e8cd6d44f868eeb Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 18:37:15 +0000 Subject: [PATCH 02/46] feat: Add AI postmortem generation method to IncidentService --- Common/Server/Services/IncidentService.ts | 86 +++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/Common/Server/Services/IncidentService.ts b/Common/Server/Services/IncidentService.ts index 847a3e2677..384603ce80 100644 --- a/Common/Server/Services/IncidentService.ts +++ b/Common/Server/Services/IncidentService.ts @@ -65,6 +65,13 @@ import OnCallDutyPolicy from "../../Models/DatabaseModels/OnCallDutyPolicy"; import Dictionary from "../../Types/Dictionary"; import IncidentTemplateService from "./IncidentTemplateService"; import IncidentTemplate from "../../Models/DatabaseModels/IncidentTemplate"; +import LLMService, { LLMProviderConfig } from "../Utils/LLM/LLMService"; +import LlmProviderService from "./LlmProviderService"; +import LlmProvider from "../../Models/DatabaseModels/LlmProvider"; +import AIContextBuilder, { + AIGenerationContext, + IncidentContextData, +} from "../Utils/AI/AIContextBuilder"; // key is incidentId for this dictionary. type UpdateCarryForward = Dictionary<{ @@ -2388,6 +2395,85 @@ ${incidentSeverity.name} ); } } + + @CaptureSpan() + public async generatePostmortemFromAI(data: { + incidentId: ObjectID; + template?: string; + }): Promise { + // Get the incident to verify it exists and get the project ID + const incident: Model | null = await this.findOneById({ + id: data.incidentId, + select: { + _id: true, + projectId: true, + }, + props: { + isRoot: true, + }, + }); + + if (!incident || !incident.projectId) { + throw new BadDataException("Incident not found"); + } + + // Get LLM provider for the project + const llmProvider: LlmProvider | null = + await LlmProviderService.getLLMProviderForProject(incident.projectId); + + if (!llmProvider) { + throw new BadDataException( + "No LLM provider configured for this project. Please configure an LLM provider in Settings > AI > LLM Providers.", + ); + } + + if (!llmProvider.llmType) { + throw new BadDataException( + "LLM provider type is not configured properly.", + ); + } + + // Build incident context - always include workspace messages + const contextData: IncidentContextData = + await AIContextBuilder.buildIncidentContext({ + incidentId: data.incidentId, + includeWorkspaceMessages: true, + workspaceMessageLimit: 500, + }); + + // Format context for postmortem generation + const aiContext: AIGenerationContext = + AIContextBuilder.formatIncidentContextForPostmortem( + contextData, + data.template, + ); + + // Generate postmortem using LLM + const llmConfig: LLMProviderConfig = { + llmType: llmProvider.llmType, + }; + + if (llmProvider.apiKey) { + llmConfig.apiKey = llmProvider.apiKey; + } + + if (llmProvider.baseUrl) { + llmConfig.baseUrl = llmProvider.baseUrl.toString(); + } + + if (llmProvider.modelName) { + llmConfig.modelName = llmProvider.modelName; + } + + const response = await LLMService.getCompletion({ + llmProviderConfig: llmConfig, + messages: aiContext.messages, + maxTokens: 8192, + temperature: 0.7, + }); + + return response.content; + } } export default new Service(); From b9ae827c2929dacfa0967fd06e49c9fb4ccbb40b Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 18:38:02 +0000 Subject: [PATCH 03/46] feat: Implement AI-driven postmortem generation endpoint in IncidentAPI --- Common/Server/API/IncidentAPI.ts | 149 +++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/Common/Server/API/IncidentAPI.ts b/Common/Server/API/IncidentAPI.ts index c24737b76c..319d572419 100644 --- a/Common/Server/API/IncidentAPI.ts +++ b/Common/Server/API/IncidentAPI.ts @@ -1,6 +1,7 @@ import Incident from "../../Models/DatabaseModels/Incident"; import File from "../../Models/DatabaseModels/File"; import NotFoundException from "../../Types/Exception/NotFoundException"; +import BadDataException from "../../Types/Exception/BadDataException"; import ObjectID from "../../Types/ObjectID"; import IncidentService, { Service as IncidentServiceType, @@ -15,6 +16,15 @@ import { } from "../Utils/Express"; import CommonAPI from "./CommonAPI"; import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps"; +import LLMService, { LLMProviderConfig } from "../Utils/LLM/LLMService"; +import AIContextBuilder, { + AIGenerationContext, + IncidentContextData, +} from "../Utils/AI/AIContextBuilder"; +import LlmProvider from "../../Models/DatabaseModels/LlmProvider"; +import LlmProviderService from "../Services/LlmProviderService"; +import JSONFunctions from "../../Types/JSONFunctions"; +import Permission from "../../Types/Permission"; export default class IncidentAPI extends BaseAPI< Incident, @@ -36,6 +46,21 @@ export default class IncidentAPI extends BaseAPI< } }, ); + + // Generate postmortem from AI + this.router.post( + `${new this.entityType() + .getCrudApiPath() + ?.toString()}/generate-postmortem-from-ai/:incidentId`, + UserMiddleware.getUserMiddleware, + async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { + try { + await this.generatePostmortemFromAI(req, res); + } catch (err) { + next(err); + } + }, + ); } private async getPostmortemAttachment( @@ -103,4 +128,128 @@ export default class IncidentAPI extends BaseAPI< Response.setNoCacheHeaders(res); return Response.sendFileResponse(req, res, attachment); } + + private async generatePostmortemFromAI( + req: ExpressRequest, + res: ExpressResponse, + ): Promise { + const incidentIdParam: string | undefined = req.params["incidentId"]; + + if (!incidentIdParam) { + throw new BadDataException("Incident ID is required"); + } + + let incidentId: ObjectID; + + try { + incidentId = new ObjectID(incidentIdParam); + } catch { + throw new BadDataException("Invalid Incident ID"); + } + + const props: DatabaseCommonInteractionProps = + await CommonAPI.getDatabaseCommonInteractionProps(req); + + // Verify user has permission to edit the incident + const permissions: Array | undefined = + props.userTenantAccessPermission?.["permissions"] as + | Array + | undefined; + + const hasPermission: boolean = permissions + ? permissions.some((p: Permission) => { + return ( + p === Permission.ProjectOwner || + p === Permission.ProjectAdmin || + p === Permission.EditProjectIncident + ); + }) + : false; + + if (!hasPermission && !props.isMasterAdmin) { + throw new BadDataException( + "You do not have permission to generate postmortem for this incident. You need to have one of these permissions: Project Owner, Project Admin, Edit Project Incident.", + ); + } + + // Get the template from request body if provided + const template: string | undefined = JSONFunctions.getJSONValueInPath( + req.body, + "template", + ) as string | undefined; + + // Always include workspace messages for comprehensive context + const includeWorkspaceMessages: boolean = true; + + // Get the incident to verify it exists and get the project ID + const incident: Incident | null = await this.service.findOneById({ + id: incidentId, + select: { + _id: true, + projectId: true, + }, + props, + }); + + if (!incident || !incident.projectId) { + throw new NotFoundException("Incident not found"); + } + + // Get LLM provider for the project + const llmProvider: LlmProvider | null = + await LlmProviderService.getLLMProviderForProject(incident.projectId); + + if (!llmProvider) { + throw new BadDataException( + "No LLM provider configured for this project. Please configure an LLM provider in Settings > AI > LLM Providers.", + ); + } + + if (!llmProvider.llmType) { + throw new BadDataException( + "LLM provider type is not configured properly.", + ); + } + + // Build incident context + const contextData: IncidentContextData = + await AIContextBuilder.buildIncidentContext({ + incidentId, + includeWorkspaceMessages, + workspaceMessageLimit: 500, + }); + + // Format context for postmortem generation + const aiContext: AIGenerationContext = + AIContextBuilder.formatIncidentContextForPostmortem(contextData, template); + + // Generate postmortem using LLM + const llmConfig: LLMProviderConfig = { + llmType: llmProvider.llmType, + }; + + if (llmProvider.apiKey) { + llmConfig.apiKey = llmProvider.apiKey; + } + + if (llmProvider.baseUrl) { + llmConfig.baseUrl = llmProvider.baseUrl.toString(); + } + + if (llmProvider.modelName) { + llmConfig.modelName = llmProvider.modelName; + } + + const response = await LLMService.getCompletion({ + llmProviderConfig: llmConfig, + messages: aiContext.messages, + maxTokens: 8192, + temperature: 0.7, + }); + + return Response.sendJsonObjectResponse(req, res, { + postmortemNote: response.content, + + }); + } } From 4cfebb5e4990cc43755050215c9b2fac31cd0275 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 18:38:17 +0000 Subject: [PATCH 04/46] feat: Add LLMService for handling multiple LLM provider completions --- Common/Server/Utils/LLM/LLMService.ts | 281 ++++++++++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 Common/Server/Utils/LLM/LLMService.ts diff --git a/Common/Server/Utils/LLM/LLMService.ts b/Common/Server/Utils/LLM/LLMService.ts new file mode 100644 index 0000000000..1a4b33b85b --- /dev/null +++ b/Common/Server/Utils/LLM/LLMService.ts @@ -0,0 +1,281 @@ +import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse"; +import HTTPResponse from "../../../Types/API/HTTPResponse"; +import URL from "../../../Types/API/URL"; +import { JSONObject } from "../../../Types/JSON"; +import API from "../../../Utils/API"; +import LlmType from "../../../Types/LLM/LlmType"; +import BadDataException from "../../../Types/Exception/BadDataException"; +import logger from "../Logger"; +import CaptureSpan from "../Telemetry/CaptureSpan"; + +export interface LLMMessage { + role: "system" | "user" | "assistant"; + content: string; +} + +export interface LLMCompletionRequest { + messages: Array; + maxTokens?: number; + temperature?: number; + llmProviderConfig: LLMProviderConfig; +} + +export interface LLMUsage { + promptTokens: number; + completionTokens: number; + totalTokens: number; +} + +export interface LLMCompletionResponse { + content: string; + usage: LLMUsage | undefined; +} + +export interface LLMProviderConfig { + llmType: LlmType; + apiKey?: string; + baseUrl?: string; + modelName?: string; + +} + +export default class LLMService { + @CaptureSpan() + public static async getCompletion( + request: LLMCompletionRequest, + ): Promise { + const config: LLMProviderConfig = request.llmProviderConfig; + + switch (config.llmType) { + case LlmType.OpenAI: + return await this.getOpenAICompletion(config, request); + case LlmType.Anthropic: + return await this.getAnthropicCompletion(config, request); + case LlmType.Ollama: + return await this.getOllamaCompletion(config, request); + default: + throw new BadDataException(`Unsupported LLM type: ${config.llmType}`); + } + } + + @CaptureSpan() + private static async getOpenAICompletion( + config: LLMProviderConfig, + request: LLMCompletionRequest, + ): Promise { + if (!config.apiKey) { + throw new BadDataException("OpenAI API key is required"); + } + + const baseUrl: string = config.baseUrl || "https://api.openai.com/v1"; + const modelName: string = config.modelName || "gpt-4o"; + + const response: HTTPErrorResponse | HTTPResponse = + await API.post({ + url: URL.fromString(`${baseUrl}/chat/completions`), + data: { + model: modelName, + messages: request.messages.map((msg: LLMMessage) => { + return { + role: msg.role, + content: msg.content, + }; + }), + max_tokens: request.maxTokens || 4096, + temperature: request.temperature ?? 0.7, + }, + headers: { + Authorization: `Bearer ${config.apiKey}`, + "Content-Type": "application/json", + }, + options: { + retries: 2, + exponentialBackoff: true, + timeout: 120000, // 2 minutes timeout for LLM calls + }, + }); + + if (response instanceof HTTPErrorResponse) { + logger.error("Error from OpenAI API:"); + logger.error(response); + throw new BadDataException( + `OpenAI API error: ${JSON.stringify(response.jsonData)}`, + ); + } + + const jsonData: JSONObject = response.jsonData as JSONObject; + const choices: Array = jsonData["choices"] as Array; + + if (!choices || choices.length === 0) { + throw new BadDataException("No response from OpenAI"); + } + + const message: JSONObject = choices[0]!["message"] as JSONObject; + const usage: JSONObject = jsonData["usage"] as JSONObject; + + return { + content: message["content"] as string, + usage: usage + ? { + promptTokens: usage["prompt_tokens"] as number, + completionTokens: usage["completion_tokens"] as number, + totalTokens: usage["total_tokens"] as number, + } + : undefined, + }; + } + + @CaptureSpan() + private static async getAnthropicCompletion( + config: LLMProviderConfig, + request: LLMCompletionRequest, + ): Promise { + if (!config.apiKey) { + throw new BadDataException("Anthropic API key is required"); + } + + const baseUrl: string = config.baseUrl || "https://api.anthropic.com/v1"; + const modelName: string = config.modelName || "claude-sonnet-4-20250514"; + + // Anthropic requires system message to be separate + let systemMessage: string = ""; + const userMessages: Array<{ role: string; content: string }> = []; + + for (const msg of request.messages) { + if (msg.role === "system") { + systemMessage = msg.content; + } else { + userMessages.push({ + role: msg.role, + content: msg.content, + }); + } + } + + const requestData: JSONObject = { + model: modelName, + messages: userMessages, + max_tokens: request.maxTokens || 4096, + temperature: request.temperature ?? 0.7, + }; + + if (systemMessage) { + requestData["system"] = systemMessage; + } + + const response: HTTPErrorResponse | HTTPResponse = + await API.post({ + url: URL.fromString(`${baseUrl}/messages`), + data: requestData, + headers: { + "x-api-key": config.apiKey, + "anthropic-version": "2023-06-01", + "Content-Type": "application/json", + }, + options: { + retries: 2, + exponentialBackoff: true, + timeout: 120000, + }, + }); + + if (response instanceof HTTPErrorResponse) { + logger.error("Error from Anthropic API:"); + logger.error(response); + throw new BadDataException( + `Anthropic API error: ${JSON.stringify(response.jsonData)}`, + ); + } + + const jsonData: JSONObject = response.jsonData as JSONObject; + const content: Array = jsonData["content"] as Array; + + if (!content || content.length === 0) { + throw new BadDataException("No response from Anthropic"); + } + + const textContent: JSONObject | undefined = content.find( + (c: JSONObject) => { + return c["type"] === "text"; + }, + ); + + if (!textContent) { + throw new BadDataException("No text content in Anthropic response"); + } + + const usage: JSONObject = jsonData["usage"] as JSONObject; + + return { + content: textContent["text"] as string, + usage: usage + ? { + promptTokens: usage["input_tokens"] as number, + completionTokens: usage["output_tokens"] as number, + totalTokens: + ((usage["input_tokens"] as number) || 0) + + ((usage["output_tokens"] as number) || 0), + } + : undefined, + }; + } + + @CaptureSpan() + private static async getOllamaCompletion( + config: LLMProviderConfig, + request: LLMCompletionRequest, + ): Promise { + if (!config.baseUrl) { + throw new BadDataException("Ollama base URL is required"); + } + + const modelName: string = config.modelName || "llama2"; + + const response: HTTPErrorResponse | HTTPResponse = + await API.post({ + url: URL.fromString(`${config.baseUrl}/api/chat`), + data: { + model: modelName, + messages: request.messages.map((msg: LLMMessage) => { + return { + role: msg.role, + content: msg.content, + }; + }), + stream: false, + options: { + temperature: request.temperature ?? 0.7, + num_predict: request.maxTokens || 4096, + }, + }, + headers: { + "Content-Type": "application/json", + }, + options: { + retries: 2, + exponentialBackoff: true, + timeout: 300000, // 5 minutes for Ollama as it may be slower + }, + }); + + if (response instanceof HTTPErrorResponse) { + logger.error("Error from Ollama API:"); + logger.error(response); + throw new BadDataException( + `Ollama API error: ${JSON.stringify(response.jsonData)}`, + ); + } + + const jsonData: JSONObject = response.jsonData as JSONObject; + const message: JSONObject = jsonData["message"] as JSONObject; + + if (!message) { + throw new BadDataException("No response from Ollama"); + } + + return { + content: message["content"] as string, + usage: undefined, // Ollama doesn't provide token usage in the same way + }; + } +} From ac12a334058dd34c56359546ebb2aac03ba499b0 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 18:41:12 +0000 Subject: [PATCH 05/46] feat: Refactor AI context handling by introducing IncidentAIContextBuilder --- Common/Server/API/IncidentAPI.ts | 8 +- Common/Server/Services/IncidentService.ts | 8 +- .../Utils/AI/IncidentAIContextBuilder.ts | 398 ++++++++++++++++++ 3 files changed, 406 insertions(+), 8 deletions(-) create mode 100644 Common/Server/Utils/AI/IncidentAIContextBuilder.ts diff --git a/Common/Server/API/IncidentAPI.ts b/Common/Server/API/IncidentAPI.ts index 319d572419..67b1ff8909 100644 --- a/Common/Server/API/IncidentAPI.ts +++ b/Common/Server/API/IncidentAPI.ts @@ -17,10 +17,10 @@ import { import CommonAPI from "./CommonAPI"; import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps"; import LLMService, { LLMProviderConfig } from "../Utils/LLM/LLMService"; -import AIContextBuilder, { +import IncidentAIContextBuilder, { AIGenerationContext, IncidentContextData, -} from "../Utils/AI/AIContextBuilder"; +} from "../Utils/AI/IncidentAIContextBuilder"; import LlmProvider from "../../Models/DatabaseModels/LlmProvider"; import LlmProviderService from "../Services/LlmProviderService"; import JSONFunctions from "../../Types/JSONFunctions"; @@ -213,7 +213,7 @@ export default class IncidentAPI extends BaseAPI< // Build incident context const contextData: IncidentContextData = - await AIContextBuilder.buildIncidentContext({ + await IncidentAIContextBuilder.buildIncidentContext({ incidentId, includeWorkspaceMessages, workspaceMessageLimit: 500, @@ -221,7 +221,7 @@ export default class IncidentAPI extends BaseAPI< // Format context for postmortem generation const aiContext: AIGenerationContext = - AIContextBuilder.formatIncidentContextForPostmortem(contextData, template); + IncidentAIContextBuilder.formatIncidentContextForPostmortem(contextData, template); // Generate postmortem using LLM const llmConfig: LLMProviderConfig = { diff --git a/Common/Server/Services/IncidentService.ts b/Common/Server/Services/IncidentService.ts index 384603ce80..31343a3eec 100644 --- a/Common/Server/Services/IncidentService.ts +++ b/Common/Server/Services/IncidentService.ts @@ -68,10 +68,10 @@ import IncidentTemplate from "../../Models/DatabaseModels/IncidentTemplate"; import LLMService, { LLMProviderConfig } from "../Utils/LLM/LLMService"; import LlmProviderService from "./LlmProviderService"; import LlmProvider from "../../Models/DatabaseModels/LlmProvider"; -import AIContextBuilder, { +import IncidentAIContextBuilder, { AIGenerationContext, IncidentContextData, -} from "../Utils/AI/AIContextBuilder"; +} from "../Utils/AI/IncidentAIContextBuilder"; // key is incidentId for this dictionary. type UpdateCarryForward = Dictionary<{ @@ -2435,7 +2435,7 @@ ${incidentSeverity.name} // Build incident context - always include workspace messages const contextData: IncidentContextData = - await AIContextBuilder.buildIncidentContext({ + await IncidentAIContextBuilder.buildIncidentContext({ incidentId: data.incidentId, includeWorkspaceMessages: true, workspaceMessageLimit: 500, @@ -2443,7 +2443,7 @@ ${incidentSeverity.name} // Format context for postmortem generation const aiContext: AIGenerationContext = - AIContextBuilder.formatIncidentContextForPostmortem( + IncidentAIContextBuilder.formatIncidentContextForPostmortem( contextData, data.template, ); diff --git a/Common/Server/Utils/AI/IncidentAIContextBuilder.ts b/Common/Server/Utils/AI/IncidentAIContextBuilder.ts new file mode 100644 index 0000000000..02b8157044 --- /dev/null +++ b/Common/Server/Utils/AI/IncidentAIContextBuilder.ts @@ -0,0 +1,398 @@ +import ObjectID from "../../../Types/ObjectID"; +import Incident from "../../../Models/DatabaseModels/Incident"; +import IncidentStateTimeline from "../../../Models/DatabaseModels/IncidentStateTimeline"; +import IncidentInternalNote from "../../../Models/DatabaseModels/IncidentInternalNote"; +import IncidentPublicNote from "../../../Models/DatabaseModels/IncidentPublicNote"; +import IncidentService from "../../Services/IncidentService"; +import IncidentStateTimelineService from "../../Services/IncidentStateTimelineService"; +import IncidentInternalNoteService from "../../Services/IncidentInternalNoteService"; +import IncidentPublicNoteService from "../../Services/IncidentPublicNoteService"; +import WorkspaceChannelMessageUtil, { + WorkspaceChannelMessage, +} from "../Workspace/WorkspaceChannelMessageUtil"; +import logger from "../Logger"; +import CaptureSpan from "../Telemetry/CaptureSpan"; +import OneUptimeDate from "../../../Types/Date"; +import SortOrder from "../../../Types/BaseDatabase/SortOrder"; +import { LLMMessage } from "../LLM/LLMService"; +import NotificationRuleWorkspaceChannel from "../../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel"; + +export interface IncidentContextData { + incident: Incident; + stateTimeline: Array; + internalNotes: Array; + publicNotes: Array; + workspaceMessages: Array; +} + +export interface AIGenerationContext { + contextText: string; + systemPrompt: string; + messages: Array; +} + +export default class IncidentAIContextBuilder { + @CaptureSpan() + public static async buildIncidentContext(data: { + incidentId: ObjectID; + includeWorkspaceMessages?: boolean; + workspaceMessageLimit?: number; + }): Promise { + const incident: Incident | null = await IncidentService.findOneById({ + id: data.incidentId, + select: { + _id: true, + title: true, + description: true, + createdAt: true, + postmortemNote: true, + remediationNotes: true, + rootCause: true, + customFields: true, + projectId: true, + incidentSeverity: { + name: true, + color: true, + }, + currentIncidentState: { + name: true, + color: true, + }, + monitors: { + name: true, + }, + labels: { + name: true, + color: true, + }, + postUpdatesToWorkspaceChannels: true, + }, + props: { + isRoot: true, + }, + }); + + if (!incident) { + throw new Error("Incident not found"); + } + + // Fetch state timeline + const stateTimeline: Array = + await IncidentStateTimelineService.findBy({ + query: { + incidentId: data.incidentId, + }, + select: { + _id: true, + createdAt: true, + startsAt: true, + endsAt: true, + rootCause: true, + incidentState: { + name: true, + color: true, + }, + createdByUser: { + name: true, + email: true, + }, + }, + sort: { + startsAt: SortOrder.Ascending, + }, + limit: 100, + skip: 0, + props: { + isRoot: true, + }, + }); + + // Fetch internal notes + const internalNotes: Array = + await IncidentInternalNoteService.findBy({ + query: { + incidentId: data.incidentId, + }, + select: { + _id: true, + note: true, + createdAt: true, + createdByUser: { + name: true, + email: true, + }, + }, + sort: { + createdAt: SortOrder.Ascending, + }, + limit: 100, + skip: 0, + props: { + isRoot: true, + }, + }); + + // Fetch public notes + const publicNotes: Array = + await IncidentPublicNoteService.findBy({ + query: { + incidentId: data.incidentId, + }, + select: { + _id: true, + note: true, + createdAt: true, + postedAt: true, + createdByUser: { + name: true, + email: true, + }, + }, + sort: { + createdAt: SortOrder.Ascending, + }, + limit: 100, + skip: 0, + props: { + isRoot: true, + }, + }); + + // Fetch workspace messages if requested and channels exist + let workspaceMessages: Array = []; + + const workspaceChannels: + | Array + | undefined = + incident.postUpdatesToWorkspaceChannels as + | Array + | undefined; + + if ( + data.includeWorkspaceMessages && + workspaceChannels && + workspaceChannels.length > 0 && + incident.projectId + ) { + try { + const channelMessagesParams: { + projectId: ObjectID; + workspaceChannels: Array; + limit?: number; + oldestTimestamp?: Date; + } = { + projectId: incident.projectId, + workspaceChannels: workspaceChannels, + limit: data.workspaceMessageLimit || 500, + }; + + if (incident.createdAt) { + channelMessagesParams.oldestTimestamp = incident.createdAt; + } + + workspaceMessages = + await WorkspaceChannelMessageUtil.getChannelMessagesForIncident( + channelMessagesParams, + ); + } catch (error) { + logger.error(`Error fetching workspace messages: ${error}`); + // Continue without workspace messages + } + } + + return { + incident, + stateTimeline, + internalNotes, + publicNotes, + workspaceMessages, + }; + } + + @CaptureSpan() + public static formatIncidentContextForPostmortem( + contextData: IncidentContextData, + template?: string, + ): AIGenerationContext { + const { incident, stateTimeline, internalNotes, publicNotes, workspaceMessages } = + contextData; + + let contextText: string = ""; + + // Basic incident information + contextText += "# Incident Information\n\n"; + contextText += `**Title:** ${incident.title || "N/A"}\n\n`; + contextText += `**Description:** ${incident.description || "N/A"}\n\n`; + contextText += `**Severity:** ${incident.incidentSeverity?.name || "N/A"}\n\n`; + contextText += `**Current State:** ${incident.currentIncidentState?.name || "N/A"}\n\n`; + contextText += `**Created At:** ${incident.createdAt ? OneUptimeDate.getDateAsFormattedString(incident.createdAt) : "N/A"}\n\n`; + + // Affected monitors + if (incident.monitors && incident.monitors.length > 0) { + contextText += "**Affected Monitors:** "; + contextText += incident.monitors + .map((m: { name?: string }) => { + return m.name; + }) + .join(", "); + contextText += "\n\n"; + } + + // Labels + if (incident.labels && incident.labels.length > 0) { + contextText += "**Labels:** "; + contextText += incident.labels + .map((l: { name?: string }) => { + return l.name; + }) + .join(", "); + contextText += "\n\n"; + } + + // Root cause if available + if (incident.rootCause) { + contextText += `**Root Cause:** ${incident.rootCause}\n\n`; + } + + // Remediation notes if available + if (incident.remediationNotes) { + contextText += `**Remediation Notes:** ${incident.remediationNotes}\n\n`; + } + + // State timeline + if (stateTimeline.length > 0) { + contextText += "# State Timeline\n\n"; + for (const timeline of stateTimeline) { + const startTime: string = timeline.startsAt + ? OneUptimeDate.getDateAsFormattedString(timeline.startsAt) + : "N/A"; + const stateName: string = + timeline.incidentState?.name?.toString() || "Unknown"; + const createdBy: string = + timeline.createdByUser?.name?.toString() || + timeline.createdByUser?.email?.toString() || + "System"; + + contextText += `- **${startTime}**: State changed to **${stateName}** by ${createdBy}\n`; + if (timeline.rootCause) { + contextText += ` - Root cause noted: ${timeline.rootCause}\n`; + } + } + contextText += "\n"; + } + + // Internal notes + if (internalNotes.length > 0) { + contextText += "# Internal Notes (Private)\n\n"; + for (const note of internalNotes) { + const noteTime: string = note.createdAt + ? OneUptimeDate.getDateAsFormattedString(note.createdAt) + : "N/A"; + const createdBy: string = + note.createdByUser?.name?.toString() || + note.createdByUser?.email?.toString() || + "Unknown"; + + contextText += `**[${noteTime}] ${createdBy}:**\n`; + contextText += `${note.note || "N/A"}\n\n`; + } + } + + // Public notes + if (publicNotes.length > 0) { + contextText += "# Public Notes\n\n"; + for (const note of publicNotes) { + const noteTime: string = note.postedAt + ? OneUptimeDate.getDateAsFormattedString(note.postedAt) + : note.createdAt + ? OneUptimeDate.getDateAsFormattedString(note.createdAt) + : "N/A"; + const createdBy: string = + note.createdByUser?.name?.toString() || + note.createdByUser?.email?.toString() || + "Unknown"; + + contextText += `**[${noteTime}] ${createdBy}:**\n`; + contextText += `${note.note || "N/A"}\n\n`; + } + } + + // Workspace messages (Slack/Teams) + if (workspaceMessages.length > 0) { + contextText += "# Discussion from Incident Channel\n\n"; + contextText += WorkspaceChannelMessageUtil.formatMessagesAsContext( + workspaceMessages, + { + includeTimestamp: true, + includeUsername: true, + maxLength: 30000, + }, + ); + contextText += "\n\n"; + } + + // System prompt for postmortem generation + const systemPrompt: string = `You are an expert Site Reliability Engineer (SRE) and incident response specialist. Your task is to generate a comprehensive, well-structured incident postmortem based on the provided incident data. + +The postmortem should: +1. Be written in a blameless manner, focusing on systemic improvements rather than individual blame +2. Include a clear executive summary +3. Provide a detailed timeline of events +4. Identify the root cause(s) and contributing factors +5. Outline the impact on users and systems +6. List actionable items to prevent recurrence +7. Include lessons learned + +${template ? `Use the following template structure:\n\n${template}` : "Use a standard incident postmortem format with sections for: Executive Summary, Timeline, Root Cause Analysis, Impact, Action Items, and Lessons Learned."} + +Write in a professional, clear, and concise manner. Use markdown formatting for better readability.`; + + // Build messages array + const messages: Array = [ + { + role: "system", + content: systemPrompt, + }, + { + role: "user", + content: `Based on the following incident data, please generate a comprehensive incident postmortem:\n\n${contextText}`, + }, + ]; + + return { + contextText, + systemPrompt, + messages, + }; + } + + @CaptureSpan() + public static buildGenericAIContext(data: { + systemPrompt: string; + userPrompt: string; + context?: string; + }): AIGenerationContext { + let userContent: string = data.userPrompt; + + if (data.context) { + userContent = `${data.userPrompt}\n\nContext:\n${data.context}`; + } + + const messages: Array = [ + { + role: "system", + content: data.systemPrompt, + }, + { + role: "user", + content: userContent, + }, + ]; + + return { + contextText: data.context || "", + systemPrompt: data.systemPrompt, + messages, + }; + } +} From 2515da12aa5fc812b277e960b33e9b7dd436dc1d Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 18:42:30 +0000 Subject: [PATCH 06/46] feat: Add AI generation functionality for postmortem notes in IncidentPostmortem --- .../src/Pages/Incidents/View/Postmortem.tsx | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx index 3d1bfbb6ec..fa116014c8 100644 --- a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx +++ b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx @@ -32,6 +32,13 @@ import AttachmentList from "../../../Components/Attachment/AttachmentList"; import { getModelIdString } from "../../../Utils/ModelId"; import SubscriberNotificationStatus from "../../../Components/StatusPageSubscribers/SubscriberNotificationStatus"; import StatusPageSubscriberNotificationStatus from "Common/Types/StatusPage/StatusPageSubscriberNotificationStatus"; +import GenerateFromAIModal, { + GenerateAIRequestData, +} from "Common/UI/Components/AI/GenerateFromAIModal"; +import { APP_API_URL } from "Common/UI/Config"; +import URL from "Common/Types/API/URL"; +import HTTPResponse from "Common/Types/API/HTTPResponse"; +import HTTPErrorResponse from "Common/Types/API/HTTPErrorResponse"; const POSTMORTEM_FORM_FIELDS: Fields = [ { @@ -110,6 +117,10 @@ const IncidentPostmortem: FunctionComponent< useState(false); const [templateInitialValues, setTemplateInitialValues] = useState | null>(null); + const [showAIGenerateModal, setShowAIGenerateModal] = useState(false); + const [aiTemplates, setAiTemplates] = useState< + Array<{ id: string; name: string; content?: string }> + >([]); const handleResendPostmortemNotification: () => Promise = async (): Promise => { @@ -209,6 +220,92 @@ const IncidentPostmortem: FunctionComponent< }); }, [showTemplateModal]); + // Fetch templates for AI generation modal + useEffect(() => { + if (!showAIGenerateModal) { + return; + } + + const fetchAITemplates: () => Promise = async (): Promise => { + try { + const listResult: ListResult = + await ModelAPI.getList({ + modelType: IncidentPostmortemTemplate, + query: {}, + limit: LIMIT_PER_PROJECT, + skip: 0, + select: { + _id: true, + templateName: true, + postmortemNote: true, + }, + sort: {}, + }); + + const templates: Array<{ id: string; name: string; content?: string }> = + listResult.data.map((template: IncidentPostmortemTemplate) => { + const templateItem: { id: string; name: string; content?: string } = { + id: template._id?.toString() || "", + name: template.templateName || "Unnamed Template", + }; + if (template.postmortemNote) { + templateItem.content = template.postmortemNote; + } + return templateItem; + }); + + setAiTemplates(templates); + } catch (err) { + // Silently fail - templates are optional + setAiTemplates([]); + } + }; + + fetchAITemplates().catch(() => { + setAiTemplates([]); + }); + }, [showAIGenerateModal]); + + const handleGeneratePostmortemFromAI: ( + data: GenerateAIRequestData, + ) => Promise = async (data: GenerateAIRequestData): Promise => { + const apiUrl: URL = URL.fromString( + APP_API_URL.toString() + + `/incident/generate-postmortem-from-ai/${modelId.toString()}`, + ); + + const response: HTTPResponse | HTTPErrorResponse = + await API.post({ + url: apiUrl, + data: { + template: data.template, + }, + }); + + if (response instanceof HTTPErrorResponse) { + throw new Error(API.getFriendlyMessage(response)); + } + + const postmortemNote: string = + (response.data as JSONObject)["postmortemNote"] as string; + + if (!postmortemNote) { + throw new Error("Failed to generate postmortem note from AI."); + } + + return postmortemNote; + }; + + const handleAIGenerationSuccess: (generatedContent: string) => void = ( + generatedContent: string, + ): void => { + setShowAIGenerateModal(false); + setTemplateInitialValues({ + postmortemNote: generatedContent, + }); + setShowTemplateEditModal(true); + }; + return ( <> @@ -218,6 +315,14 @@ const IncidentPostmortem: FunctionComponent< description: "Document the summary, learnings, and follow-ups for this incident.", buttons: [ + { + title: "Generate from AI", + icon: IconProp.Bolt, + buttonStyle: ButtonStyleType.SUCCESS, + onClick: () => { + setShowAIGenerateModal(true); + }, + }, { title: "Apply Template", icon: IconProp.Template, @@ -446,6 +551,21 @@ const IncidentPostmortem: FunctionComponent< ) : ( <> )} + + {showAIGenerateModal ? ( + { + setShowAIGenerateModal(false); + }} + onGenerate={handleGeneratePostmortemFromAI} + onSuccess={handleAIGenerationSuccess} + templates={aiTemplates} + /> + ) : ( + <> + )} ); }; From ab1d357625f9c5c3f049b74008d30a9c2ddc9c7f Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 18:46:38 +0000 Subject: [PATCH 07/46] feat: Add data source items for AI generation in IncidentPostmortem --- .../UI/Components/AI/GenerateFromAIModal.tsx | 203 ++++++++++++++++++ .../src/Pages/Incidents/View/Postmortem.tsx | 6 + 2 files changed, 209 insertions(+) create mode 100644 Common/UI/Components/AI/GenerateFromAIModal.tsx diff --git a/Common/UI/Components/AI/GenerateFromAIModal.tsx b/Common/UI/Components/AI/GenerateFromAIModal.tsx new file mode 100644 index 0000000000..4918ad7210 --- /dev/null +++ b/Common/UI/Components/AI/GenerateFromAIModal.tsx @@ -0,0 +1,203 @@ +import React, { FunctionComponent, ReactElement, useState } from "react"; +import Modal, { ModalWidth } from "../Modal/Modal"; +import ComponentLoader from "../ComponentLoader/ComponentLoader"; +import ErrorMessage from "../ErrorMessage/ErrorMessage"; +import BasicForm from "../Forms/BasicForm"; +import FormFieldSchemaType from "../Forms/Types/FormFieldSchemaType"; +import { JSONObject } from "../../../Types/JSON"; +import { DropdownOption } from "../Dropdown/Dropdown"; +import ButtonType from "../Button/ButtonTypes"; +import { ButtonStyleType } from "../Button/Button"; +import IconProp from "../../../Types/Icon/IconProp"; + +export interface GenerateFromAIModalProps { + title: string; + description?: string; + onClose: () => void; + onGenerate: (data: GenerateAIRequestData) => Promise; + onSuccess: (generatedContent: string) => void; + templates?: Array<{ id: string; name: string; content?: string }>; + /** Optional list of data sources that will be used for generation (shown when no templates) */ + dataSourceItems?: Array; +} + +export interface GenerateAIRequestData { + template?: string; + templateId?: string; +} + +const GenerateFromAIModal: FunctionComponent = ( + props: GenerateFromAIModalProps, +): ReactElement => { + const [isGenerating, setIsGenerating] = useState(false); + const [error, setError] = useState(""); + const [formData, setFormData] = useState({}); + + const templateOptions: Array = props.templates + ? props.templates.map((template: { id: string; name: string }) => { + return { + label: template.name, + value: template.id, + }; + }) + : []; + + // Add "No template" option at the beginning + if (templateOptions.length > 0) { + templateOptions.unshift({ + label: "No template (AI will use default format)", + value: "", + }); + } + + const handleGenerate: () => Promise = async (): Promise => { + setIsGenerating(true); + setError(""); + + try { + // Get template content if a template was selected + let templateContent: string | undefined = undefined; + const selectedTemplateId: string | undefined = formData[ + "templateId" + ] as string; + + if (selectedTemplateId && props.templates) { + const selectedTemplate = props.templates.find( + (t: { id: string; name: string; content?: string }) => { + return t.id === selectedTemplateId; + }, + ); + templateContent = selectedTemplate?.content; + } + + const requestData: GenerateAIRequestData = {}; + + if (templateContent) { + requestData.template = templateContent; + } + + if (selectedTemplateId) { + requestData.templateId = selectedTemplateId; + } + + const generatedContent: string = await props.onGenerate(requestData); + props.onSuccess(generatedContent); + } catch (err) { + if (err instanceof Error) { + setError(err.message); + } else { + setError("An error occurred while generating content."); + } + } finally { + setIsGenerating(false); + } + }; + + const formFields: Array<{ + field: { [key: string]: boolean }; + title: string; + fieldType: FormFieldSchemaType; + required?: boolean; + description?: string; + dropdownOptions?: Array; + defaultValue?: boolean; + }> = []; + + // Add template selection if templates are provided + if (props.templates && props.templates.length > 0) { + formFields.push({ + field: { + templateId: true, + }, + title: "Select Template (Optional)", + fieldType: FormFieldSchemaType.Dropdown, + required: false, + description: "Choose a template to guide the AI generation.", + dropdownOptions: templateOptions, + }); + } + + return ( + { + if (!isGenerating) { + props.onClose(); + } + }} + submitButtonText={isGenerating ? "Generating..." : "Generate with AI"} + submitButtonStyleType={ButtonStyleType.SUCCESS} + submitButtonType={ButtonType.Button} + isLoading={isGenerating} + disableSubmitButton={isGenerating} + onSubmit={handleGenerate} + modalWidth={ModalWidth.Medium} + icon={IconProp.Bolt} + > + <> + {error && } + + {isGenerating && ( +
+ +
+

Generating content with AI...

+

+ This may take a moment depending on the amount of data. +

+ {props.dataSourceItems && props.dataSourceItems.length > 0 && ( +
+

+ Data sources being used: +

+
    + {props.dataSourceItems.map( + (item: string, index: number): ReactElement => { + return
  • {item}
  • ; + }, + )} +
+
+ )} +
+
+ )} + + {!isGenerating && formFields.length > 0 && ( + { + setFormData(values); + }} + /> + )} + + {!isGenerating && formFields.length === 0 && ( +
+

+ Click "Generate with AI" to create content based on the + available data. +

+ {props.dataSourceItems && props.dataSourceItems.length > 0 && ( +
    + {props.dataSourceItems.map( + (item: string, index: number): ReactElement => { + return
  • {item}
  • ; + }, + )} +
+ )} +
+ )} + +
+ ); +}; + +export default GenerateFromAIModal; diff --git a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx index fa116014c8..960c51a4b1 100644 --- a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx +++ b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx @@ -562,6 +562,12 @@ const IncidentPostmortem: FunctionComponent< onGenerate={handleGeneratePostmortemFromAI} onSuccess={handleAIGenerationSuccess} templates={aiTemplates} + dataSourceItems={[ + "Incident details and description", + "State timeline and history", + "Internal and public notes", + "Slack/Teams channel discussions", + ]} /> ) : ( <> From db895a0f11b7143698f57b50345b37f33f119e1b Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 19:00:36 +0000 Subject: [PATCH 08/46] feat: Enhance channel message retrieval for Slack and Microsoft Teams --- .../Utils/AI/IncidentAIContextBuilder.ts | 91 +++++++++- .../MicrosoftTeams/MicrosoftTeams.ts | 161 ++++++++++++++++++ Common/Server/Utils/Workspace/Slack/Slack.ts | 134 +++++++++++++++ Common/Server/Utils/Workspace/Workspace.ts | 126 ++++++++++++++ 4 files changed, 504 insertions(+), 8 deletions(-) diff --git a/Common/Server/Utils/AI/IncidentAIContextBuilder.ts b/Common/Server/Utils/AI/IncidentAIContextBuilder.ts index 02b8157044..4da86cb459 100644 --- a/Common/Server/Utils/AI/IncidentAIContextBuilder.ts +++ b/Common/Server/Utils/AI/IncidentAIContextBuilder.ts @@ -7,15 +7,18 @@ import IncidentService from "../../Services/IncidentService"; import IncidentStateTimelineService from "../../Services/IncidentStateTimelineService"; import IncidentInternalNoteService from "../../Services/IncidentInternalNoteService"; import IncidentPublicNoteService from "../../Services/IncidentPublicNoteService"; -import WorkspaceChannelMessageUtil, { +import WorkspaceUtil, { WorkspaceChannelMessage, -} from "../Workspace/WorkspaceChannelMessageUtil"; +} from "../Workspace/Workspace"; +import WorkspaceProjectAuthTokenService from "../../Services/WorkspaceProjectAuthTokenService"; +import WorkspaceProjectAuthToken from "../../../Models/DatabaseModels/WorkspaceProjectAuthToken"; import logger from "../Logger"; import CaptureSpan from "../Telemetry/CaptureSpan"; import OneUptimeDate from "../../../Types/Date"; import SortOrder from "../../../Types/BaseDatabase/SortOrder"; import { LLMMessage } from "../LLM/LLMService"; import NotificationRuleWorkspaceChannel from "../../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel"; +import WorkspaceType from "../../../Types/Workspace/WorkspaceType"; export interface IncidentContextData { incident: Incident; @@ -175,7 +178,7 @@ export default class IncidentAIContextBuilder { incident.projectId ) { try { - const channelMessagesParams: { + const fetchParams: { projectId: ObjectID; workspaceChannels: Array; limit?: number; @@ -187,13 +190,11 @@ export default class IncidentAIContextBuilder { }; if (incident.createdAt) { - channelMessagesParams.oldestTimestamp = incident.createdAt; + fetchParams.oldestTimestamp = incident.createdAt; } workspaceMessages = - await WorkspaceChannelMessageUtil.getChannelMessagesForIncident( - channelMessagesParams, - ); + await this.getWorkspaceMessagesForIncident(fetchParams); } catch (error) { logger.error(`Error fetching workspace messages: ${error}`); // Continue without workspace messages @@ -320,7 +321,7 @@ export default class IncidentAIContextBuilder { // Workspace messages (Slack/Teams) if (workspaceMessages.length > 0) { contextText += "# Discussion from Incident Channel\n\n"; - contextText += WorkspaceChannelMessageUtil.formatMessagesAsContext( + contextText += WorkspaceUtil.formatMessagesAsContext( workspaceMessages, { includeTimestamp: true, @@ -395,4 +396,78 @@ Write in a professional, clear, and concise manner. Use markdown formatting for messages, }; } + + @CaptureSpan() + private static async getWorkspaceMessagesForIncident(data: { + projectId: ObjectID; + workspaceChannels: Array; + limit?: number; + oldestTimestamp?: Date; + }): Promise> { + const allMessages: Array = []; + + for (const channel of data.workspaceChannels) { + try { + // Get auth token for this workspace type + const projectAuth: WorkspaceProjectAuthToken | null = + await WorkspaceProjectAuthTokenService.getProjectAuth({ + projectId: data.projectId, + workspaceType: channel.workspaceType, + }); + + if (!projectAuth || !projectAuth.authToken) { + logger.debug( + `No auth token found for workspace type: ${channel.workspaceType}`, + ); + continue; + } + + const messagesParams: { + channelId: string; + authToken: string; + projectId: ObjectID; + workspaceType: WorkspaceType; + teamId?: string; + limit?: number; + oldestTimestamp?: Date; + } = { + channelId: channel.id, + authToken: projectAuth.authToken, + projectId: data.projectId, + workspaceType: channel.workspaceType, + }; + + if (channel.teamId) { + messagesParams.teamId = channel.teamId; + } + + if (data.limit !== undefined) { + messagesParams.limit = data.limit; + } + + if (data.oldestTimestamp) { + messagesParams.oldestTimestamp = data.oldestTimestamp; + } + + const messages: Array = + await WorkspaceUtil.getChannelMessages(messagesParams); + + allMessages.push(...messages); + } catch (error) { + logger.error( + `Error fetching messages from channel ${channel.id}: ${error}`, + ); + // Continue with other channels even if one fails + } + } + + // Sort all messages by timestamp + allMessages.sort( + (a: WorkspaceChannelMessage, b: WorkspaceChannelMessage) => { + return a.timestamp.getTime() - b.timestamp.getTime(); + }, + ); + + return allMessages; + } } diff --git a/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts b/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts index b0656664b0..21527c5594 100644 --- a/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +++ b/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts @@ -3062,4 +3062,165 @@ All monitoring checks are passing normally.`; throw error; } } + + @CaptureSpan() + public static async getChannelMessages(params: { + channelId: string; + teamId: string; + projectId: ObjectID; + limit?: number; + oldestTimestamp?: Date; + }): Promise< + Array<{ + messageId: string; + text: string; + userId?: string; + username?: string; + timestamp: Date; + isBot: boolean; + }> + > { + const messages: Array<{ + messageId: string; + text: string; + userId?: string; + username?: string; + timestamp: Date; + isBot: boolean; + }> = []; + + try { + // Get valid access token + const projectAuth: WorkspaceProjectAuthToken | null = + await WorkspaceProjectAuthTokenService.getProjectAuth({ + projectId: params.projectId, + workspaceType: WorkspaceType.MicrosoftTeams, + }); + + if (!projectAuth || !projectAuth.miscData) { + logger.error( + "Microsoft Teams integration not found for this project", + ); + return messages; + } + + const miscData: JSONObject = projectAuth.miscData as JSONObject; + const accessToken: string = miscData["appAccessToken"] as string; + const tokenExpiresAt: string = miscData[ + "appAccessTokenExpiresAt" + ] as string; + + // Check if token is expired + if ( + !accessToken || + (tokenExpiresAt && + OneUptimeDate.isInThePast(OneUptimeDate.fromString(tokenExpiresAt))) + ) { + logger.debug( + "Microsoft Teams access token expired or missing, skipping message fetch", + ); + return messages; + } + + // Fetch messages from Microsoft Teams channel + let nextLink: string | undefined = undefined; + const maxMessages: number = params.limit || 1000; + const maxPages: number = 10; + let pageCount: number = 0; + + do { + let requestUrl: string; + + if (nextLink) { + requestUrl = nextLink; + } else { + requestUrl = `https://graph.microsoft.com/v1.0/teams/${params.teamId}/channels/${params.channelId}/messages`; + requestUrl += `?$top=${Math.min(50, maxMessages - messages.length)}`; + } + + const response: HTTPErrorResponse | HTTPResponse = + await API.get({ + url: URL.fromString(requestUrl), + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + options: { + retries: 2, + exponentialBackoff: true, + }, + }); + + if (response instanceof HTTPErrorResponse) { + logger.error( + "Error response from Microsoft Teams API for channel messages:", + ); + logger.error(response); + break; + } + + const jsonData: JSONObject = response.jsonData as JSONObject; + const teamsMessages: Array = + (jsonData["value"] as Array) || []; + + for (const msg of teamsMessages) { + // Skip system messages + if (msg["messageType"] !== "message") { + continue; + } + + const body: JSONObject = msg["body"] as JSONObject; + let text: string = (body?.["content"] as string) || ""; + + // Remove HTML tags if present (Teams uses HTML) + text = text.replace(/<[^>]*>/g, ""); + text = text.trim(); + + // Skip empty messages + if (!text) { + continue; + } + + const from: JSONObject = msg["from"] as JSONObject; + const user: JSONObject = from?.["user"] as JSONObject; + const isBot: boolean = Boolean(from?.["application"]); + + const createdDateTime: string = msg["createdDateTime"] as string; + const timestamp: Date = createdDateTime + ? new Date(createdDateTime) + : new Date(); + + // Check if message is older than the oldest timestamp filter + if (params.oldestTimestamp && timestamp < params.oldestTimestamp) { + continue; + } + + messages.push({ + messageId: msg["id"] as string, + text: text, + userId: user?.["id"] as string, + username: user?.["displayName"] as string, + timestamp: timestamp, + isBot: isBot, + }); + } + + nextLink = jsonData["@odata.nextLink"] as string; + pageCount++; + } while (nextLink && messages.length < maxMessages && pageCount < maxPages); + + logger.debug( + `Retrieved ${messages.length} messages from Microsoft Teams channel ${params.channelId}`, + ); + + // Sort by timestamp (oldest first) + messages.sort((a, b) => { + return a.timestamp.getTime() - b.timestamp.getTime(); + }); + } catch (error) { + logger.error(`Error fetching Microsoft Teams channel messages: ${error}`); + } + + return messages; + } } diff --git a/Common/Server/Utils/Workspace/Slack/Slack.ts b/Common/Server/Utils/Workspace/Slack/Slack.ts index d053e04cd2..332cb7ac4a 100644 --- a/Common/Server/Utils/Workspace/Slack/Slack.ts +++ b/Common/Server/Utils/Workspace/Slack/Slack.ts @@ -1896,4 +1896,138 @@ export default class SlackUtil extends WorkspaceBase { public static convertMarkdownToSlackRichText(markdown: string): string { return SlackifyMarkdown(markdown); } + + @CaptureSpan() + public static async getChannelMessages(params: { + channelId: string; + authToken: string; + limit?: number; + oldestTimestamp?: Date; + }): Promise< + Array<{ + messageId: string; + text: string; + userId?: string; + username?: string; + timestamp: Date; + isBot: boolean; + }> + > { + const messages: Array<{ + messageId: string; + text: string; + userId?: string; + username?: string; + timestamp: Date; + isBot: boolean; + }> = []; + let cursor: string | undefined = undefined; + const maxMessages: number = params.limit || 1000; + const maxPages: number = 10; + let pageCount: number = 0; + + do { + const requestData: JSONObject = { + channel: params.channelId, + limit: Math.min(200, maxMessages - messages.length), + }; + + if (cursor) { + requestData["cursor"] = cursor; + } + + if (params.oldestTimestamp) { + requestData["oldest"] = ( + params.oldestTimestamp.getTime() / 1000 + ).toString(); + } + + const response: HTTPErrorResponse | HTTPResponse = + await API.post({ + url: URL.fromString("https://slack.com/api/conversations.history"), + data: requestData, + headers: { + Authorization: `Bearer ${params.authToken}`, + "Content-Type": "application/x-www-form-urlencoded", + }, + options: { + retries: 3, + exponentialBackoff: true, + }, + }); + + if (response instanceof HTTPErrorResponse) { + logger.error("Error response from Slack API for channel history:"); + logger.error(response); + break; + } + + const jsonData: JSONObject = response.jsonData as JSONObject; + + if (jsonData["ok"] !== true) { + logger.error("Invalid response from Slack API for channel history:"); + logger.error(jsonData); + break; + } + + const slackMessages: Array = + (jsonData["messages"] as Array) || []; + + for (const msg of slackMessages) { + // Skip bot messages if they're from the OneUptime bot (app messages) + const isBot: boolean = + Boolean(msg["bot_id"]) || msg["subtype"] === "bot_message"; + + // Extract text, handling attachments and blocks + let text: string = (msg["text"] as string) || ""; + + // If there are attachments, append their text + const attachments: Array | undefined = msg["attachments"] as + | Array + | undefined; + if (attachments && Array.isArray(attachments)) { + for (const attachment of attachments) { + if (attachment && attachment["text"]) { + text += "\n" + (attachment["text"] as string); + } + if (attachment && attachment["fallback"]) { + text += "\n" + (attachment["fallback"] as string); + } + } + } + + // Skip empty messages + if (!text.trim()) { + continue; + } + + const timestamp: Date = msg["ts"] + ? new Date(parseFloat(msg["ts"] as string) * 1000) + : new Date(); + + messages.push({ + messageId: msg["ts"] as string, + text: text, + userId: msg["user"] as string, + username: msg["username"] as string, + timestamp: timestamp, + isBot: isBot, + }); + } + + cursor = (jsonData["response_metadata"] as JSONObject)?.[ + "next_cursor" + ] as string; + pageCount++; + } while (cursor && messages.length < maxMessages && pageCount < maxPages); + + logger.debug( + `Retrieved ${messages.length} messages from Slack channel ${params.channelId}`, + ); + + // Reverse to get chronological order (Slack returns newest first) + messages.reverse(); + + return messages; + } } diff --git a/Common/Server/Utils/Workspace/Workspace.ts b/Common/Server/Utils/Workspace/Workspace.ts index bd4a5385d0..8dfa0caa72 100644 --- a/Common/Server/Utils/Workspace/Workspace.ts +++ b/Common/Server/Utils/Workspace/Workspace.ts @@ -17,6 +17,16 @@ import WorkspaceUserAuthToken from "../../../Models/DatabaseModels/WorkspaceUser import WorkspaceUserAuthTokenService from "../../Services/WorkspaceUserAuthTokenService"; import UserService from "../../Services/UserService"; import CaptureSpan from "../Telemetry/CaptureSpan"; +import OneUptimeDate from "../../../Types/Date"; + +export interface WorkspaceChannelMessage { + messageId: string; + text: string; + userId?: string; + username?: string; + timestamp: Date; + isBot: boolean; +} export default class WorkspaceUtil { @CaptureSpan() @@ -236,4 +246,120 @@ export default class WorkspaceUtil { return result; } + + @CaptureSpan() + public static async getChannelMessages(params: { + channelId: string; + authToken: string; + projectId: ObjectID; + workspaceType: WorkspaceType; + teamId?: string; + limit?: number; + oldestTimestamp?: Date; + }): Promise> { + switch (params.workspaceType) { + case WorkspaceType.Slack: { + const slackParams: { + channelId: string; + authToken: string; + limit?: number; + oldestTimestamp?: Date; + } = { + channelId: params.channelId, + authToken: params.authToken, + }; + + if (params.limit !== undefined) { + slackParams.limit = params.limit; + } + + if (params.oldestTimestamp) { + slackParams.oldestTimestamp = params.oldestTimestamp; + } + + return await SlackWorkspace.getChannelMessages(slackParams); + } + case WorkspaceType.MicrosoftTeams: { + if (!params.teamId) { + logger.error( + "Team ID is required for Microsoft Teams channel messages", + ); + return []; + } + + const teamsParams: { + channelId: string; + teamId: string; + projectId: ObjectID; + limit?: number; + oldestTimestamp?: Date; + } = { + channelId: params.channelId, + teamId: params.teamId, + projectId: params.projectId, + }; + + if (params.limit !== undefined) { + teamsParams.limit = params.limit; + } + + if (params.oldestTimestamp) { + teamsParams.oldestTimestamp = params.oldestTimestamp; + } + + return await MicrosoftTeamsUtil.getChannelMessages(teamsParams); + } + default: + logger.debug( + `Unsupported workspace type for channel messages: ${params.workspaceType}`, + ); + return []; + } + } + + @CaptureSpan() + public static formatMessagesAsContext( + messages: Array, + options?: { + includeTimestamp?: boolean; + includeUsername?: boolean; + maxLength?: number; + }, + ): string { + const includeTimestamp: boolean = options?.includeTimestamp ?? true; + const includeUsername: boolean = options?.includeUsername ?? true; + const maxLength: number = options?.maxLength || 50000; + + let context: string = ""; + + for (const msg of messages) { + let line: string = ""; + + if (includeTimestamp) { + const dateStr: string = OneUptimeDate.getDateAsFormattedString( + msg.timestamp, + ); + line += `[${dateStr}] `; + } + + if (includeUsername && msg.username) { + line += `${msg.username}: `; + } else if (includeUsername && msg.userId) { + line += `User ${msg.userId}: `; + } + + line += msg.text; + line += "\n"; + + // Check if adding this line would exceed max length + if (context.length + line.length > maxLength) { + context += "\n... (messages truncated due to length)"; + break; + } + + context += line; + } + + return context.trim(); + } } From 93d9c045e2ce0eced1e5ff669157a4a32834d942 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 19:01:02 +0000 Subject: [PATCH 09/46] style: Improve code formatting and readability across multiple files --- Common/Server/API/IncidentAPI.ts | 14 ++++---- Common/Server/Services/LlmProviderService.ts | 1 - .../Utils/AI/IncidentAIContextBuilder.ts | 33 +++++++++---------- Common/Server/Utils/LLM/LLMService.ts | 1 - .../MicrosoftTeams/MicrosoftTeams.ts | 10 +++--- Common/Server/Utils/Workspace/Slack/Slack.ts | 6 ++-- .../src/Pages/Incidents/View/Postmortem.tsx | 21 +++++++----- 7 files changed, 46 insertions(+), 40 deletions(-) diff --git a/Common/Server/API/IncidentAPI.ts b/Common/Server/API/IncidentAPI.ts index 67b1ff8909..03bfd9ddc0 100644 --- a/Common/Server/API/IncidentAPI.ts +++ b/Common/Server/API/IncidentAPI.ts @@ -151,10 +151,10 @@ export default class IncidentAPI extends BaseAPI< await CommonAPI.getDatabaseCommonInteractionProps(req); // Verify user has permission to edit the incident - const permissions: Array | undefined = - props.userTenantAccessPermission?.["permissions"] as - | Array - | undefined; + const permissions: Array | undefined = props + .userTenantAccessPermission?.["permissions"] as + | Array + | undefined; const hasPermission: boolean = permissions ? permissions.some((p: Permission) => { @@ -221,7 +221,10 @@ export default class IncidentAPI extends BaseAPI< // Format context for postmortem generation const aiContext: AIGenerationContext = - IncidentAIContextBuilder.formatIncidentContextForPostmortem(contextData, template); + IncidentAIContextBuilder.formatIncidentContextForPostmortem( + contextData, + template, + ); // Generate postmortem using LLM const llmConfig: LLMProviderConfig = { @@ -249,7 +252,6 @@ export default class IncidentAPI extends BaseAPI< return Response.sendJsonObjectResponse(req, res, { postmortemNote: response.content, - }); } } diff --git a/Common/Server/Services/LlmProviderService.ts b/Common/Server/Services/LlmProviderService.ts index 67b384b8b6..b8c3a6b7e2 100644 --- a/Common/Server/Services/LlmProviderService.ts +++ b/Common/Server/Services/LlmProviderService.ts @@ -143,7 +143,6 @@ export class Service extends DatabaseService { return provider; } - return null; } } diff --git a/Common/Server/Utils/AI/IncidentAIContextBuilder.ts b/Common/Server/Utils/AI/IncidentAIContextBuilder.ts index 4da86cb459..bfe4bc9b28 100644 --- a/Common/Server/Utils/AI/IncidentAIContextBuilder.ts +++ b/Common/Server/Utils/AI/IncidentAIContextBuilder.ts @@ -7,9 +7,7 @@ import IncidentService from "../../Services/IncidentService"; import IncidentStateTimelineService from "../../Services/IncidentStateTimelineService"; import IncidentInternalNoteService from "../../Services/IncidentInternalNoteService"; import IncidentPublicNoteService from "../../Services/IncidentPublicNoteService"; -import WorkspaceUtil, { - WorkspaceChannelMessage, -} from "../Workspace/Workspace"; +import WorkspaceUtil, { WorkspaceChannelMessage } from "../Workspace/Workspace"; import WorkspaceProjectAuthTokenService from "../../Services/WorkspaceProjectAuthTokenService"; import WorkspaceProjectAuthToken from "../../../Models/DatabaseModels/WorkspaceProjectAuthToken"; import logger from "../Logger"; @@ -166,10 +164,9 @@ export default class IncidentAIContextBuilder { const workspaceChannels: | Array - | undefined = - incident.postUpdatesToWorkspaceChannels as - | Array - | undefined; + | undefined = incident.postUpdatesToWorkspaceChannels as + | Array + | undefined; if ( data.includeWorkspaceMessages && @@ -215,8 +212,13 @@ export default class IncidentAIContextBuilder { contextData: IncidentContextData, template?: string, ): AIGenerationContext { - const { incident, stateTimeline, internalNotes, publicNotes, workspaceMessages } = - contextData; + const { + incident, + stateTimeline, + internalNotes, + publicNotes, + workspaceMessages, + } = contextData; let contextText: string = ""; @@ -321,14 +323,11 @@ export default class IncidentAIContextBuilder { // Workspace messages (Slack/Teams) if (workspaceMessages.length > 0) { contextText += "# Discussion from Incident Channel\n\n"; - contextText += WorkspaceUtil.formatMessagesAsContext( - workspaceMessages, - { - includeTimestamp: true, - includeUsername: true, - maxLength: 30000, - }, - ); + contextText += WorkspaceUtil.formatMessagesAsContext(workspaceMessages, { + includeTimestamp: true, + includeUsername: true, + maxLength: 30000, + }); contextText += "\n\n"; } diff --git a/Common/Server/Utils/LLM/LLMService.ts b/Common/Server/Utils/LLM/LLMService.ts index 1a4b33b85b..23dbbb4a9e 100644 --- a/Common/Server/Utils/LLM/LLMService.ts +++ b/Common/Server/Utils/LLM/LLMService.ts @@ -36,7 +36,6 @@ export interface LLMProviderConfig { apiKey?: string; baseUrl?: string; modelName?: string; - } export default class LLMService { diff --git a/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts b/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts index 21527c5594..c7263b0311 100644 --- a/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +++ b/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts @@ -3098,9 +3098,7 @@ All monitoring checks are passing normally.`; }); if (!projectAuth || !projectAuth.miscData) { - logger.error( - "Microsoft Teams integration not found for this project", - ); + logger.error("Microsoft Teams integration not found for this project"); return messages; } @@ -3207,7 +3205,11 @@ All monitoring checks are passing normally.`; nextLink = jsonData["@odata.nextLink"] as string; pageCount++; - } while (nextLink && messages.length < maxMessages && pageCount < maxPages); + } while ( + nextLink && + messages.length < maxMessages && + pageCount < maxPages + ); logger.debug( `Retrieved ${messages.length} messages from Microsoft Teams channel ${params.channelId}`, diff --git a/Common/Server/Utils/Workspace/Slack/Slack.ts b/Common/Server/Utils/Workspace/Slack/Slack.ts index 332cb7ac4a..aa03fd36de 100644 --- a/Common/Server/Utils/Workspace/Slack/Slack.ts +++ b/Common/Server/Utils/Workspace/Slack/Slack.ts @@ -1982,9 +1982,9 @@ export default class SlackUtil extends WorkspaceBase { let text: string = (msg["text"] as string) || ""; // If there are attachments, append their text - const attachments: Array | undefined = msg["attachments"] as - | Array - | undefined; + const attachments: Array | undefined = msg[ + "attachments" + ] as Array | undefined; if (attachments && Array.isArray(attachments)) { for (const attachment of attachments) { if (attachment && attachment["text"]) { diff --git a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx index 960c51a4b1..ae93f40016 100644 --- a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx +++ b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx @@ -117,7 +117,8 @@ const IncidentPostmortem: FunctionComponent< useState(false); const [templateInitialValues, setTemplateInitialValues] = useState | null>(null); - const [showAIGenerateModal, setShowAIGenerateModal] = useState(false); + const [showAIGenerateModal, setShowAIGenerateModal] = + useState(false); const [aiTemplates, setAiTemplates] = useState< Array<{ id: string; name: string; content?: string }> >([]); @@ -244,10 +245,11 @@ const IncidentPostmortem: FunctionComponent< const templates: Array<{ id: string; name: string; content?: string }> = listResult.data.map((template: IncidentPostmortemTemplate) => { - const templateItem: { id: string; name: string; content?: string } = { - id: template._id?.toString() || "", - name: template.templateName || "Unnamed Template", - }; + const templateItem: { id: string; name: string; content?: string } = + { + id: template._id?.toString() || "", + name: template.templateName || "Unnamed Template", + }; if (template.postmortemNote) { templateItem.content = template.postmortemNote; } @@ -268,7 +270,9 @@ const IncidentPostmortem: FunctionComponent< const handleGeneratePostmortemFromAI: ( data: GenerateAIRequestData, - ) => Promise = async (data: GenerateAIRequestData): Promise => { + ) => Promise = async ( + data: GenerateAIRequestData, + ): Promise => { const apiUrl: URL = URL.fromString( APP_API_URL.toString() + `/incident/generate-postmortem-from-ai/${modelId.toString()}`, @@ -286,8 +290,9 @@ const IncidentPostmortem: FunctionComponent< throw new Error(API.getFriendlyMessage(response)); } - const postmortemNote: string = - (response.data as JSONObject)["postmortemNote"] as string; + const postmortemNote: string = (response.data as JSONObject)[ + "postmortemNote" + ] as string; if (!postmortemNote) { throw new Error("Failed to generate postmortem note from AI."); From 8fda0325d925ea403e2072f2eff52da13f6781c7 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 19:03:26 +0000 Subject: [PATCH 10/46] feat: Integrate AI template fetching and handling in IncidentPostmortem component --- .../src/Pages/Incidents/View/Postmortem.tsx | 69 +++++-------------- 1 file changed, 19 insertions(+), 50 deletions(-) diff --git a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx index ae93f40016..10052940b3 100644 --- a/Dashboard/src/Pages/Incidents/View/Postmortem.tsx +++ b/Dashboard/src/Pages/Incidents/View/Postmortem.tsx @@ -163,13 +163,29 @@ const IncidentPostmortem: FunctionComponent< limit: LIMIT_PER_PROJECT, skip: 0, select: { - templateName: true, _id: true, + templateName: true, + postmortemNote: true, }, sort: {}, }); setIncidentPostmortemTemplates(listResult.data); + + // Also set AI templates format + const templates: Array<{ id: string; name: string; content?: string }> = + listResult.data.map((template: IncidentPostmortemTemplate) => { + const templateItem: { id: string; name: string; content?: string } = { + id: template._id?.toString() || "", + name: template.templateName || "Unnamed Template", + }; + if (template.postmortemNote) { + templateItem.content = template.postmortemNote; + } + return templateItem; + }); + + setAiTemplates(templates); } catch (err) { setError(API.getFriendlyMessage(err)); } @@ -212,61 +228,14 @@ const IncidentPostmortem: FunctionComponent< }; useEffect(() => { - if (!showTemplateModal) { + if (!showTemplateModal && !showAIGenerateModal) { return; } fetchTemplates().catch((err: Error) => { setError(API.getFriendlyMessage(err)); }); - }, [showTemplateModal]); - - // Fetch templates for AI generation modal - useEffect(() => { - if (!showAIGenerateModal) { - return; - } - - const fetchAITemplates: () => Promise = async (): Promise => { - try { - const listResult: ListResult = - await ModelAPI.getList({ - modelType: IncidentPostmortemTemplate, - query: {}, - limit: LIMIT_PER_PROJECT, - skip: 0, - select: { - _id: true, - templateName: true, - postmortemNote: true, - }, - sort: {}, - }); - - const templates: Array<{ id: string; name: string; content?: string }> = - listResult.data.map((template: IncidentPostmortemTemplate) => { - const templateItem: { id: string; name: string; content?: string } = - { - id: template._id?.toString() || "", - name: template.templateName || "Unnamed Template", - }; - if (template.postmortemNote) { - templateItem.content = template.postmortemNote; - } - return templateItem; - }); - - setAiTemplates(templates); - } catch (err) { - // Silently fail - templates are optional - setAiTemplates([]); - } - }; - - fetchAITemplates().catch(() => { - setAiTemplates([]); - }); - }, [showAIGenerateModal]); + }, [showTemplateModal, showAIGenerateModal]); const handleGeneratePostmortemFromAI: ( data: GenerateAIRequestData, From 035edaf43564899436e917fa0d873b24a5cd7dfb Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 20:13:36 +0000 Subject: [PATCH 11/46] feat: Add AI Logs functionality with LLM logging and management - Introduced LlmLog model to track AI API calls, including details like provider, tokens used, cost, and status. - Implemented AILogService to handle AI log creation and management, including billing checks and log updates. - Created LlmLogsTable component for displaying AI logs in the dashboard with filtering and modal views for request/response details. - Added new routes and pages for viewing AI logs in the context of incidents, alerts, and settings. - Updated PageMap and RouteMap to include new AI log views. - Enhanced error handling and logging for AI API interactions. --- .../src/Pages/Settings/LlmProviders/Index.tsx | 24 + Common/Models/DatabaseModels/Index.ts | 2 + Common/Models/DatabaseModels/LlmLog.ts | 870 ++++++++++++++++++ Common/Models/DatabaseModels/LlmProvider.ts | 21 + Common/Server/API/IncidentAPI.ts | 45 +- Common/Server/Services/AILogService.ts | 222 +++++ Common/Server/Services/LlmLogService.ts | 10 + Common/Server/Services/LlmProviderService.ts | 8 + Common/Types/LlmLogStatus.ts | 7 + Common/Types/Permission.ts | 9 + .../src/Components/AILogs/LlmLogsTable.tsx | 229 +++++ Dashboard/src/Pages/Alerts/View/AILogs.tsx | 13 + Dashboard/src/Pages/Alerts/View/SideMenu.tsx | 12 +- Dashboard/src/Pages/Incidents/View/AILogs.tsx | 13 + .../src/Pages/Incidents/View/SideMenu.tsx | 12 +- Dashboard/src/Pages/Settings/AILogs.tsx | 9 + Dashboard/src/Pages/Settings/SideMenu.tsx | 9 + Dashboard/src/Routes/AlertRoutes.tsx | 17 + Dashboard/src/Routes/IncidentsRoutes.tsx | 18 + Dashboard/src/Routes/SettingsRoutes.tsx | 15 + Dashboard/src/Utils/PageMap.ts | 5 + Dashboard/src/Utils/RouteMap.ts | 21 + 22 files changed, 1551 insertions(+), 40 deletions(-) create mode 100644 Common/Models/DatabaseModels/LlmLog.ts create mode 100644 Common/Server/Services/AILogService.ts create mode 100644 Common/Server/Services/LlmLogService.ts create mode 100644 Common/Types/LlmLogStatus.ts create mode 100644 Dashboard/src/Components/AILogs/LlmLogsTable.tsx create mode 100644 Dashboard/src/Pages/Alerts/View/AILogs.tsx create mode 100644 Dashboard/src/Pages/Incidents/View/AILogs.tsx create mode 100644 Dashboard/src/Pages/Settings/AILogs.tsx diff --git a/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx b/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx index 15e68e1426..b31d067801 100644 --- a/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx +++ b/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx @@ -83,6 +83,10 @@ const Settings: FunctionComponent = (): ReactElement => { title: "Provider Settings", id: "provider-settings", }, + { + title: "Cost Settings", + id: "cost-settings", + }, ]} formFields={[ { @@ -156,6 +160,18 @@ const Settings: FunctionComponent = (): ReactElement => { description: "Required for Ollama. Optional for others to use custom endpoints.", }, + { + field: { + costPerMillionTokensInUSDCents: true, + }, + title: "Cost Per Million Tokens (USD Cents)", + stepId: "cost-settings", + fieldType: FormFieldSchemaType.Number, + required: false, + placeholder: "0", + description: + "Cost per million tokens in USD cents. For example, if the cost is $0.01 per 1M tokens, enter 1.", + }, ]} selectMoreFields={{ apiKey: true, @@ -206,6 +222,14 @@ const Settings: FunctionComponent = (): ReactElement => { type: FieldType.Text, noValueMessage: "-", }, + { + field: { + costPerMillionTokensInUSDCents: true, + }, + title: "Cost (cents/1M)", + type: FieldType.Number, + noValueMessage: "0", + }, ]} /> diff --git a/Common/Models/DatabaseModels/Index.ts b/Common/Models/DatabaseModels/Index.ts index 9e20822d82..c45b77b2b8 100644 --- a/Common/Models/DatabaseModels/Index.ts +++ b/Common/Models/DatabaseModels/Index.ts @@ -73,6 +73,7 @@ import Probe from "./Probe"; import ProbeOwnerTeam from "./ProbeOwnerTeam"; import ProbeOwnerUser from "./ProbeOwnerUser"; import LlmProvider from "./LlmProvider"; +import LlmLog from "./LlmLog"; import Project from "./Project"; import ProjectCallSMSConfig from "./ProjectCallSMSConfig"; // Project SMTP Config. @@ -379,6 +380,7 @@ const AllModelTypes: Array<{ ProbeOwnerUser, LlmProvider, + LlmLog, UserSession, UserTotpAuth, diff --git a/Common/Models/DatabaseModels/LlmLog.ts b/Common/Models/DatabaseModels/LlmLog.ts new file mode 100644 index 0000000000..7129398a66 --- /dev/null +++ b/Common/Models/DatabaseModels/LlmLog.ts @@ -0,0 +1,870 @@ +import Project from "./Project"; +import Incident from "./Incident"; +import Alert from "./Alert"; +import ScheduledMaintenance from "./ScheduledMaintenance"; +import User from "./User"; +import LlmProvider from "./LlmProvider"; +import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel"; +import Route from "../../Types/API/Route"; +import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl"; +import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl"; +import ColumnLength from "../../Types/Database/ColumnLength"; +import ColumnType from "../../Types/Database/ColumnType"; +import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint"; +import EnableDocumentation from "../../Types/Database/EnableDocumentation"; +import TableColumn from "../../Types/Database/TableColumn"; +import TableColumnType from "../../Types/Database/TableColumnType"; +import TableMetadata from "../../Types/Database/TableMetadata"; +import TenantColumn from "../../Types/Database/TenantColumn"; +import IconProp from "../../Types/Icon/IconProp"; +import ObjectID from "../../Types/ObjectID"; +import Permission from "../../Types/Permission"; +import LlmLogStatus from "../../Types/LlmLogStatus"; +import LlmType from "../../Types/LLM/LlmType"; +import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; + +@EnableDocumentation() +@TenantColumn("projectId") +@TableAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + delete: [], + update: [], +}) +@CrudApiEndpoint(new Route("/llm-log")) +@Entity({ + name: "LlmLog", +}) +@TableMetadata({ + tableName: "LlmLog", + singularName: "LLM Log", + pluralName: "LLM Logs", + icon: IconProp.Bolt, + tableDescription: + "Logs of all the LLM API calls for AI features in this project.", +}) +export default class LlmLog extends BaseModel { + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "projectId", + type: TableColumnType.Entity, + modelType: Project, + title: "Project", + description: "Relation to Project Resource in which this object belongs", + }) + @ManyToOne( + () => { + return Project; + }, + { + eager: false, + nullable: true, + onDelete: "CASCADE", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "projectId" }) + public project?: Project = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: true, + canReadOnRelationQuery: true, + title: "Project ID", + description: "ID of your OneUptime Project in which this object belongs", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: false, + transformer: ObjectID.getDatabaseTransformer(), + }) + public projectId?: ObjectID = undefined; + + // LLM Provider Relation + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "llmProviderId", + type: TableColumnType.Entity, + modelType: LlmProvider, + title: "LLM Provider", + description: "LLM Provider used for this API call", + }) + @ManyToOne( + () => { + return LlmProvider; + }, + { + eager: false, + nullable: true, + onDelete: "SET NULL", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "llmProviderId" }) + public llmProvider?: LlmProvider = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: false, + canReadOnRelationQuery: true, + title: "LLM Provider ID", + description: "ID of LLM Provider used for this API call", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public llmProviderId?: ObjectID = undefined; + + // Denormalized provider info for historical reference + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.ShortText, + title: "LLM Provider Name", + description: "Name of the LLM Provider at time of call", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.ShortText, + length: ColumnLength.ShortText, + }) + public llmProviderName?: string = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.ShortText, + title: "LLM Type", + description: "Type of LLM (OpenAI, Anthropic, Ollama)", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.ShortText, + length: ColumnLength.ShortText, + }) + public llmType?: LlmType = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.ShortText, + title: "Model Name", + description: "Name of the model used (e.g., gpt-4, claude-3-opus)", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.ShortText, + length: ColumnLength.ShortText, + }) + public modelName?: string = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: true, + type: TableColumnType.Boolean, + title: "Is Global Provider", + description: "Was a global LLM provider used for this call?", + canReadOnRelationQuery: false, + isDefaultValueColumn: true, + defaultValue: false, + }) + @Column({ + nullable: false, + type: ColumnType.Boolean, + default: false, + }) + public isGlobalProvider?: boolean = undefined; + + // Token usage + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: true, + type: TableColumnType.Number, + title: "Input Tokens", + description: "Number of input (prompt) tokens used", + canReadOnRelationQuery: false, + isDefaultValueColumn: true, + defaultValue: 0, + }) + @Column({ + nullable: false, + default: 0, + type: ColumnType.Number, + }) + public inputTokens?: number = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: true, + type: TableColumnType.Number, + title: "Output Tokens", + description: "Number of output (completion) tokens used", + canReadOnRelationQuery: false, + isDefaultValueColumn: true, + defaultValue: 0, + }) + @Column({ + nullable: false, + default: 0, + type: ColumnType.Number, + }) + public outputTokens?: number = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: true, + type: TableColumnType.Number, + title: "Total Tokens", + description: "Total tokens used (input + output)", + canReadOnRelationQuery: false, + isDefaultValueColumn: true, + defaultValue: 0, + }) + @Column({ + nullable: false, + default: 0, + type: ColumnType.Number, + }) + public totalTokens?: number = undefined; + + // Cost tracking + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: true, + type: TableColumnType.Number, + title: "Cost (USD Cents)", + description: "Total cost in USD cents", + canReadOnRelationQuery: false, + isDefaultValueColumn: true, + defaultValue: 0, + }) + @Column({ + nullable: false, + default: 0, + type: ColumnType.Number, + }) + public costInUSDCents?: number = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: true, + type: TableColumnType.Boolean, + title: "Was Billed", + description: "Was the project charged for this API call?", + canReadOnRelationQuery: false, + isDefaultValueColumn: true, + defaultValue: false, + }) + @Column({ + nullable: false, + type: ColumnType.Boolean, + default: false, + }) + public wasBilled?: boolean = undefined; + + // Status + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: true, + type: TableColumnType.ShortText, + title: "Status", + description: "Status of the LLM API call", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: false, + type: ColumnType.ShortText, + length: ColumnLength.ShortText, + }) + public status?: LlmLogStatus = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.LongText, + title: "Status Message", + description: "Status Message (error details if failed)", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.LongText, + length: ColumnLength.LongText, + }) + public statusMessage?: string = undefined; + + // Feature identification + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.ShortText, + title: "Feature", + description: + "The feature that triggered this API call (e.g., IncidentPostmortem)", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.ShortText, + length: ColumnLength.ShortText, + }) + public feature?: string = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.VeryLongText, + title: "Request Prompt", + description: "The prompt sent to the LLM (truncated)", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.VeryLongText, + }) + public requestPrompt?: string = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.VeryLongText, + title: "Response Preview", + description: "Preview of the LLM response (truncated)", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.VeryLongText, + }) + public responsePreview?: string = undefined; + + // Related resources + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "incidentId", + type: TableColumnType.Entity, + modelType: Incident, + title: "Incident", + description: "Incident associated with this LLM call (if any)", + }) + @ManyToOne( + () => { + return Incident; + }, + { + eager: false, + nullable: true, + onDelete: "CASCADE", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "incidentId" }) + public incident?: Incident = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: false, + canReadOnRelationQuery: true, + title: "Incident ID", + description: "ID of Incident associated with this LLM call (if any)", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public incidentId?: ObjectID = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "alertId", + type: TableColumnType.Entity, + modelType: Alert, + title: "Alert", + description: "Alert associated with this LLM call (if any)", + }) + @ManyToOne( + () => { + return Alert; + }, + { + eager: false, + nullable: true, + onDelete: "CASCADE", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "alertId" }) + public alert?: Alert = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: false, + canReadOnRelationQuery: true, + title: "Alert ID", + description: "ID of Alert associated with this LLM call (if any)", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public alertId?: ObjectID = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "scheduledMaintenanceId", + type: TableColumnType.Entity, + modelType: ScheduledMaintenance, + title: "Scheduled Maintenance", + description: "Scheduled Maintenance associated with this LLM call (if any)", + }) + @ManyToOne( + () => { + return ScheduledMaintenance; + }, + { + eager: false, + nullable: true, + onDelete: "CASCADE", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "scheduledMaintenanceId" }) + public scheduledMaintenance?: ScheduledMaintenance = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: false, + canReadOnRelationQuery: true, + title: "Scheduled Maintenance ID", + description: + "ID of Scheduled Maintenance associated with this LLM call (if any)", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public scheduledMaintenanceId?: ObjectID = undefined; + + // User who triggered the request + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "userId", + type: TableColumnType.Entity, + modelType: User, + title: "User", + description: "User who triggered this LLM call (if any)", + }) + @ManyToOne( + () => { + return User; + }, + { + eager: false, + nullable: true, + onDelete: "CASCADE", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "userId" }) + public user?: User = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: false, + canReadOnRelationQuery: true, + title: "User ID", + description: "ID of User who triggered this LLM call (if any)", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public userId?: ObjectID = undefined; + + // Timestamps and duration + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.Date, + title: "Request Started At", + description: "When the LLM request started", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.Date, + }) + public requestStartedAt?: Date = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.Date, + title: "Request Completed At", + description: "When the LLM request completed", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.Date, + }) + public requestCompletedAt?: Date = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadLlmLog, + ], + update: [], + }) + @TableColumn({ + required: false, + type: TableColumnType.Number, + title: "Duration (ms)", + description: "Request duration in milliseconds", + canReadOnRelationQuery: false, + }) + @Column({ + nullable: true, + type: ColumnType.Number, + }) + public durationMs?: number = undefined; + + // Deleted by user + + @ColumnAccessControl({ + create: [], + read: [], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "deletedByUserId", + type: TableColumnType.Entity, + title: "Deleted by User", + modelType: User, + description: + "Relation to User who deleted this object (if this object was deleted by a User)", + }) + @ManyToOne( + () => { + return User; + }, + { + cascade: false, + eager: false, + nullable: true, + onDelete: "SET NULL", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "deletedByUserId" }) + public deletedByUser?: User = undefined; + + @ColumnAccessControl({ + create: [], + read: [], + update: [], + }) + @TableColumn({ + type: TableColumnType.ObjectID, + title: "Deleted by User ID", + description: + "User ID who deleted this object (if this object was deleted by a User)", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public deletedByUserId?: ObjectID = undefined; +} diff --git a/Common/Models/DatabaseModels/LlmProvider.ts b/Common/Models/DatabaseModels/LlmProvider.ts index e22030a41a..c57cc84af4 100644 --- a/Common/Models/DatabaseModels/LlmProvider.ts +++ b/Common/Models/DatabaseModels/LlmProvider.ts @@ -462,4 +462,25 @@ export default class LlmProvider extends BaseModel { default: false, }) public isDefault?: boolean = undefined; + + @ColumnAccessControl({ + create: [], + read: [Permission.Public], + update: [], + }) + @TableColumn({ + isDefaultValueColumn: true, + required: true, + type: TableColumnType.Number, + title: "Cost Per Million Tokens (USD Cents)", + description: + "Cost per million tokens in USD cents. Used for billing when using global LLM providers.", + defaultValue: 0, + }) + @Column({ + type: ColumnType.Number, + nullable: false, + default: 0, + }) + public costPerMillionTokensInUSDCents?: number = undefined; } diff --git a/Common/Server/API/IncidentAPI.ts b/Common/Server/API/IncidentAPI.ts index 03bfd9ddc0..466d287c43 100644 --- a/Common/Server/API/IncidentAPI.ts +++ b/Common/Server/API/IncidentAPI.ts @@ -16,13 +16,11 @@ import { } from "../Utils/Express"; import CommonAPI from "./CommonAPI"; import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps"; -import LLMService, { LLMProviderConfig } from "../Utils/LLM/LLMService"; +import AILogService from "../Services/AILogService"; import IncidentAIContextBuilder, { AIGenerationContext, IncidentContextData, } from "../Utils/AI/IncidentAIContextBuilder"; -import LlmProvider from "../../Models/DatabaseModels/LlmProvider"; -import LlmProviderService from "../Services/LlmProviderService"; import JSONFunctions from "../../Types/JSONFunctions"; import Permission from "../../Types/Permission"; @@ -195,22 +193,6 @@ export default class IncidentAPI extends BaseAPI< throw new NotFoundException("Incident not found"); } - // Get LLM provider for the project - const llmProvider: LlmProvider | null = - await LlmProviderService.getLLMProviderForProject(incident.projectId); - - if (!llmProvider) { - throw new BadDataException( - "No LLM provider configured for this project. Please configure an LLM provider in Settings > AI > LLM Providers.", - ); - } - - if (!llmProvider.llmType) { - throw new BadDataException( - "LLM provider type is not configured properly.", - ); - } - // Build incident context const contextData: IncidentContextData = await IncidentAIContextBuilder.buildIncidentContext({ @@ -226,25 +208,12 @@ export default class IncidentAPI extends BaseAPI< template, ); - // Generate postmortem using LLM - const llmConfig: LLMProviderConfig = { - llmType: llmProvider.llmType, - }; - - if (llmProvider.apiKey) { - llmConfig.apiKey = llmProvider.apiKey; - } - - if (llmProvider.baseUrl) { - llmConfig.baseUrl = llmProvider.baseUrl.toString(); - } - - if (llmProvider.modelName) { - llmConfig.modelName = llmProvider.modelName; - } - - const response = await LLMService.getCompletion({ - llmProviderConfig: llmConfig, + // Generate postmortem using AILogService (handles billing and logging) + const response = await AILogService.executeWithLogging({ + projectId: incident.projectId, + userId: props.userId, + feature: "Incident Postmortem", + incidentId: incidentId, messages: aiContext.messages, maxTokens: 8192, temperature: 0.7, diff --git a/Common/Server/Services/AILogService.ts b/Common/Server/Services/AILogService.ts new file mode 100644 index 0000000000..f6a96fdea6 --- /dev/null +++ b/Common/Server/Services/AILogService.ts @@ -0,0 +1,222 @@ +import { IsBillingEnabled } from "../EnvironmentConfig"; +import BaseService from "./BaseService"; +import LlmProviderService from "./LlmProviderService"; +import LlmLogService from "./LlmLogService"; +import ProjectService from "./ProjectService"; +import AIBillingService from "./AIBillingService"; +import LLMService, { + LLMProviderConfig, + LLMCompletionResponse, + LLMMessage, +} from "../Utils/LLM/LLMService"; +import LlmProvider from "../../Models/DatabaseModels/LlmProvider"; +import LlmLog from "../../Models/DatabaseModels/LlmLog"; +import LlmLogStatus from "../../Types/LlmLogStatus"; +import ObjectID from "../../Types/ObjectID"; +import BadDataException from "../../Types/Exception/BadDataException"; +import CaptureSpan from "../Utils/Telemetry/CaptureSpan"; +import logger from "../Utils/Logger"; + +export interface AILogRequest { + projectId: ObjectID; + userId?: ObjectID; + feature: string; // e.g., "IncidentPostmortem", "IncidentNote" + incidentId?: ObjectID; + alertId?: ObjectID; + scheduledMaintenanceId?: ObjectID; + messages: Array; + maxTokens?: number; + temperature?: number; +} + +export interface AILogResponse { + content: string; + llmLog: LlmLog; +} + +export class Service extends BaseService { + public constructor() { + super(); + } + + @CaptureSpan() + public async executeWithLogging( + request: AILogRequest, + ): Promise { + const startTime: Date = new Date(); + + // Get LLM provider for the project + const llmProvider: LlmProvider | null = + await LlmProviderService.getLLMProviderForProject(request.projectId); + + if (!llmProvider) { + throw new BadDataException( + "No LLM provider configured for this project. Please configure an LLM provider in Settings > AI > LLM Providers.", + ); + } + + if (!llmProvider.llmType) { + throw new BadDataException( + "LLM provider type is not configured properly.", + ); + } + + // Create log entry (will be updated after completion) + const logEntry: LlmLog = new LlmLog(); + logEntry.projectId = request.projectId; + logEntry.llmProviderId = llmProvider.id; + logEntry.llmProviderName = llmProvider.name; + logEntry.llmType = llmProvider.llmType; + logEntry.modelName = llmProvider.modelName; + logEntry.isGlobalProvider = llmProvider.isGlobalLlm || false; + logEntry.feature = request.feature; + logEntry.requestPrompt = request.messages + .map((m: LLMMessage) => { + return m.content; + }) + .join("\n") + .substring(0, 5000); // Store first 5000 chars + logEntry.userId = request.userId; + logEntry.incidentId = request.incidentId; + logEntry.alertId = request.alertId; + logEntry.scheduledMaintenanceId = request.scheduledMaintenanceId; + logEntry.requestStartedAt = startTime; + + // Check if billing should apply + const shouldBill: boolean = + IsBillingEnabled && (llmProvider.isGlobalLlm || false); + + // Check balance if billing enabled and using global provider + if (shouldBill) { + const project = await ProjectService.findOneById({ + id: request.projectId, + select: { aiCurrentBalanceInUSDCents: true }, + props: { isRoot: true }, + }); + + if (!project || (project.aiCurrentBalanceInUSDCents || 0) <= 0) { + logEntry.status = LlmLogStatus.InsufficientBalance; + logEntry.statusMessage = "Insufficient AI balance"; + logEntry.requestCompletedAt = new Date(); + logEntry.durationMs = new Date().getTime() - startTime.getTime(); + + await LlmLogService.create({ + data: logEntry, + props: { isRoot: true }, + }); + + throw new BadDataException( + "Insufficient AI balance. Please recharge your AI balance in Project Settings > Billing.", + ); + } + } + + try { + // Build LLM config + const llmConfig: LLMProviderConfig = { + llmType: llmProvider.llmType, + }; + + if (llmProvider.apiKey) { + llmConfig.apiKey = llmProvider.apiKey; + } + + if (llmProvider.baseUrl) { + llmConfig.baseUrl = llmProvider.baseUrl.toString(); + } + + if (llmProvider.modelName) { + llmConfig.modelName = llmProvider.modelName; + } + + // Execute LLM call + const response: LLMCompletionResponse = await LLMService.getCompletion({ + llmProviderConfig: llmConfig, + messages: request.messages, + maxTokens: request.maxTokens || 4096, + temperature: request.temperature ?? 0.7, + }); + + const endTime: Date = new Date(); + + // Update log with success info + logEntry.status = LlmLogStatus.Success; + logEntry.inputTokens = response.usage?.promptTokens || 0; + logEntry.outputTokens = response.usage?.completionTokens || 0; + logEntry.totalTokens = response.usage?.totalTokens || 0; + logEntry.responsePreview = response.content.substring(0, 2000); // Store first 2000 chars + logEntry.requestCompletedAt = endTime; + logEntry.durationMs = endTime.getTime() - startTime.getTime(); + + // Calculate and apply costs if using global provider with billing enabled + if (shouldBill && response.usage) { + const totalCost: number = Math.ceil( + (response.usage.totalTokens / 1_000_000) * + (llmProvider.costPerMillionTokensInUSDCents || 0), + ); + + logEntry.costInUSDCents = totalCost; + logEntry.wasBilled = true; + + // Deduct from project balance + if (totalCost > 0) { + const project = await ProjectService.findOneById({ + id: request.projectId, + select: { aiCurrentBalanceInUSDCents: true }, + props: { isRoot: true }, + }); + + if (project) { + const newBalance: number = Math.max( + 0, + (project.aiCurrentBalanceInUSDCents || 0) - totalCost, + ); + + await ProjectService.updateOneById({ + id: request.projectId, + data: { + aiCurrentBalanceInUSDCents: newBalance, + }, + props: { isRoot: true }, + }); + } + + // Check if auto-recharge is needed (do this async, don't wait) + AIBillingService.rechargeIfBalanceIsLow(request.projectId).catch( + (err: Error) => { + logger.error("Error during AI balance auto-recharge check:"); + logger.error(err); + }, + ); + } + } + + // Save log entry + const savedLog = await LlmLogService.create({ + data: logEntry, + props: { isRoot: true }, + }); + + return { + content: response.content, + llmLog: savedLog, + }; + } catch (error) { + // Log the error + logEntry.status = LlmLogStatus.Error; + logEntry.statusMessage = + error instanceof Error ? error.message : String(error); + logEntry.requestCompletedAt = new Date(); + logEntry.durationMs = new Date().getTime() - startTime.getTime(); + + await LlmLogService.create({ + data: logEntry, + props: { isRoot: true }, + }); + + throw error; + } + } +} + +export default new Service(); diff --git a/Common/Server/Services/LlmLogService.ts b/Common/Server/Services/LlmLogService.ts new file mode 100644 index 0000000000..f15b7c9ed9 --- /dev/null +++ b/Common/Server/Services/LlmLogService.ts @@ -0,0 +1,10 @@ +import DatabaseService from "./DatabaseService"; +import Model from "../../Models/DatabaseModels/LlmLog"; + +export class Service extends DatabaseService { + public constructor() { + super(Model); + } +} + +export default new Service(); diff --git a/Common/Server/Services/LlmProviderService.ts b/Common/Server/Services/LlmProviderService.ts index b8c3a6b7e2..af4c7bf099 100644 --- a/Common/Server/Services/LlmProviderService.ts +++ b/Common/Server/Services/LlmProviderService.ts @@ -108,10 +108,14 @@ export class Service extends DatabaseService { isDefault: true, }, select: { + _id: true, + name: true, llmType: true, apiKey: true, baseUrl: true, modelName: true, + isGlobalLlm: true, + costPerMillionTokensInUSDCents: true, }, props: { isRoot: true, @@ -129,10 +133,14 @@ export class Service extends DatabaseService { isGlobalLlm: true, }, select: { + _id: true, + name: true, llmType: true, apiKey: true, baseUrl: true, modelName: true, + isGlobalLlm: true, + costPerMillionTokensInUSDCents: true, }, props: { isRoot: true, diff --git a/Common/Types/LlmLogStatus.ts b/Common/Types/LlmLogStatus.ts new file mode 100644 index 0000000000..769e509d13 --- /dev/null +++ b/Common/Types/LlmLogStatus.ts @@ -0,0 +1,7 @@ +enum LlmLogStatus { + Success = "Success", + Error = "Error", + InsufficientBalance = "Insufficient Balance", +} + +export default LlmLogStatus; diff --git a/Common/Types/Permission.ts b/Common/Types/Permission.ts index 0ab3a8d884..67c20cedcc 100644 --- a/Common/Types/Permission.ts +++ b/Common/Types/Permission.ts @@ -147,6 +147,7 @@ enum Permission { ReadCallLog = "ReadCallLog", ReadPushLog = "ReadPushLog", ReadWorkspaceNotificationLog = "ReadWorkspaceNotificationLog", + ReadLlmLog = "ReadLlmLog", CreateIncidentOwnerTeam = "CreateIncidentOwnerTeam", DeleteIncidentOwnerTeam = "DeleteIncidentOwnerTeam", @@ -3143,6 +3144,14 @@ export class PermissionHelper { isAccessControlPermission: false, }, + { + permission: Permission.ReadLlmLog, + title: "Read LLM Log", + description: "This permission can read LLM Logs of this project.", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { permission: Permission.CreateMonitorProbe, title: "Create Monitor Probe", diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx new file mode 100644 index 0000000000..b5ff96dc27 --- /dev/null +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -0,0 +1,229 @@ +import React, { FunctionComponent, ReactElement, useState } from "react"; +import ModelTable from "Common/UI/Components/ModelTable/ModelTable"; +import LlmLog from "Common/Models/DatabaseModels/LlmLog"; +import FieldType from "Common/UI/Components/Types/FieldType"; +import Columns from "Common/UI/Components/ModelTable/Columns"; +import Pill from "Common/UI/Components/Pill/Pill"; +import { Green, Red, Yellow } from "Common/Types/BrandColors"; +import LlmLogStatus from "Common/Types/LlmLogStatus"; +import ProjectUtil from "Common/UI/Utils/Project"; +import Filter from "Common/UI/Components/ModelFilter/Filter"; +import ConfirmModal from "Common/UI/Components/Modal/ConfirmModal"; +import IconProp from "Common/Types/Icon/IconProp"; +import { ButtonStyleType } from "Common/UI/Components/Button/Button"; +import Query from "Common/Types/BaseDatabase/Query"; +import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel"; +import UserElement from "../User/User"; +import User from "Common/Models/DatabaseModels/User"; + +export interface LlmLogsTableProps { + query?: Query; + singularName?: string; +} + +const LlmLogsTable: FunctionComponent = ( + props: LlmLogsTableProps, +): ReactElement => { + const [showModal, setShowModal] = useState(false); + const [modalText, setModalText] = useState(""); + const [modalTitle, setModalTitle] = useState(""); + + const defaultColumns: Columns = [ + { + field: { llmProviderName: true }, + title: "Provider", + type: FieldType.Text, + noValueMessage: "-", + }, + { + field: { llmType: true }, + title: "Type", + type: FieldType.Text, + noValueMessage: "-", + }, + { + field: { modelName: true }, + title: "Model", + type: FieldType.Text, + noValueMessage: "-", + }, + { + field: { isGlobalProvider: true }, + title: "Global", + type: FieldType.Boolean, + }, + { + field: { feature: true }, + title: "Feature", + type: FieldType.Text, + noValueMessage: "-", + }, + { + field: { + user: { + name: true, + email: true, + profilePictureId: true, + }, + }, + title: "User", + type: FieldType.Text, + noValueMessage: "-", + getElement: (item: LlmLog): ReactElement => { + if (!item["user"]) { + return

-

; + } + + return ; + }, + }, + { + field: { inputTokens: true }, + title: "Input Tokens", + type: FieldType.Number, + }, + { + field: { outputTokens: true }, + title: "Output Tokens", + type: FieldType.Number, + }, + { + field: { costInUSDCents: true }, + title: "Cost (cents)", + type: FieldType.Number, + }, + { + field: { createdAt: true }, + title: "Time", + type: FieldType.DateTime, + }, + { + field: { status: true }, + title: "Status", + type: FieldType.Text, + getElement: (item: LlmLog): ReactElement => { + if (item["status"]) { + let color = Green; + if (item["status"] === LlmLogStatus.Error) { + color = Red; + } + if (item["status"] === LlmLogStatus.InsufficientBalance) { + color = Yellow; + } + return ( + + ); + } + return <>; + }, + }, + ]; + + const defaultFilters: Array> = [ + { field: { createdAt: true }, title: "Time", type: FieldType.Date }, + { field: { status: true }, title: "Status", type: FieldType.Text }, + { field: { llmType: true }, title: "Provider Type", type: FieldType.Text }, + { field: { feature: true }, title: "Feature", type: FieldType.Text }, + ]; + + return ( + <> + + modelType={LlmLog} + id={ + props.singularName + ? `${props.singularName.replace(/\s+/g, "-").toLowerCase()}-llm-logs-table` + : "llm-logs-table" + } + name="AI Logs" + isDeleteable={false} + isEditable={false} + isCreateable={false} + showViewIdButton={true} + isViewable={false} + query={{ + projectId: ProjectUtil.getCurrentProjectId()!, + ...(props.query || {}), + }} + selectMoreFields={{ + requestPrompt: true, + responsePreview: true, + statusMessage: true, + }} + cardProps={{ + title: "AI Logs", + description: props.singularName + ? `AI usage logs for this ${props.singularName}.` + : "AI usage logs for this project.", + }} + noItemsMessage={ + props.singularName + ? `No AI logs for this ${props.singularName}.` + : "No AI logs." + } + showRefreshButton={true} + columns={defaultColumns} + filters={defaultFilters} + actionButtons={[ + { + title: "View Request", + buttonStyleType: ButtonStyleType.NORMAL, + icon: IconProp.List, + onClick: async (item: LlmLog, onCompleteAction: VoidFunction) => { + setModalText( + (item["requestPrompt"] as string) || "No request data", + ); + setModalTitle("Request Prompt"); + setShowModal(true); + onCompleteAction(); + }, + }, + { + title: "View Response", + buttonStyleType: ButtonStyleType.NORMAL, + icon: IconProp.File, + onClick: async (item: LlmLog, onCompleteAction: VoidFunction) => { + setModalText( + (item["responsePreview"] as string) || "No response data", + ); + setModalTitle("Response Preview"); + setShowModal(true); + onCompleteAction(); + }, + }, + { + title: "View Error", + buttonStyleType: ButtonStyleType.NORMAL, + icon: IconProp.Error, + onClick: async (item: LlmLog, onCompleteAction: VoidFunction) => { + setModalText( + (item["statusMessage"] as string) || "No error message", + ); + setModalTitle("Status Message"); + setShowModal(true); + onCompleteAction(); + }, + }, + ]} + /> + + {showModal && ( + { + return setShowModal(false); + }} + submitButtonText="Close" + submitButtonType={ButtonStyleType.NORMAL} + /> + )} + + ); +}; + +export default LlmLogsTable; diff --git a/Dashboard/src/Pages/Alerts/View/AILogs.tsx b/Dashboard/src/Pages/Alerts/View/AILogs.tsx new file mode 100644 index 0000000000..80156f4136 --- /dev/null +++ b/Dashboard/src/Pages/Alerts/View/AILogs.tsx @@ -0,0 +1,13 @@ +import React, { FunctionComponent, ReactElement } from "react"; +import PageComponentProps from "../../PageComponentProps"; +import LlmLogsTable from "../../../Components/AILogs/LlmLogsTable"; +import Navigation from "Common/UI/Utils/Navigation"; +import ObjectID from "Common/Types/ObjectID"; + +const AlertAILogs: FunctionComponent = (): ReactElement => { + const modelId: ObjectID = Navigation.getLastParamAsObjectID(1); + + return ; +}; + +export default AlertAILogs; diff --git a/Dashboard/src/Pages/Alerts/View/SideMenu.tsx b/Dashboard/src/Pages/Alerts/View/SideMenu.tsx index e9e9a8c1a6..a36c1502b4 100644 --- a/Dashboard/src/Pages/Alerts/View/SideMenu.tsx +++ b/Dashboard/src/Pages/Alerts/View/SideMenu.tsx @@ -100,7 +100,7 @@ const DashboardSideMenu: FunctionComponent = ( /> - + = ( }} icon={IconProp.Bell} /> + diff --git a/Dashboard/src/Pages/Incidents/View/AILogs.tsx b/Dashboard/src/Pages/Incidents/View/AILogs.tsx new file mode 100644 index 0000000000..8de092e6f4 --- /dev/null +++ b/Dashboard/src/Pages/Incidents/View/AILogs.tsx @@ -0,0 +1,13 @@ +import React, { FunctionComponent, ReactElement } from "react"; +import PageComponentProps from "../../PageComponentProps"; +import LlmLogsTable from "../../../Components/AILogs/LlmLogsTable"; +import Navigation from "Common/UI/Utils/Navigation"; +import ObjectID from "Common/Types/ObjectID"; + +const IncidentAILogs: FunctionComponent = (): ReactElement => { + const modelId: ObjectID = Navigation.getLastParamAsObjectID(1); + + return ; +}; + +export default IncidentAILogs; diff --git a/Dashboard/src/Pages/Incidents/View/SideMenu.tsx b/Dashboard/src/Pages/Incidents/View/SideMenu.tsx index f4b11d654d..af6faa8343 100644 --- a/Dashboard/src/Pages/Incidents/View/SideMenu.tsx +++ b/Dashboard/src/Pages/Incidents/View/SideMenu.tsx @@ -111,7 +111,7 @@ const DashboardSideMenu: FunctionComponent = ( /> - + = ( }} icon={IconProp.Bell} /> + diff --git a/Dashboard/src/Pages/Settings/AILogs.tsx b/Dashboard/src/Pages/Settings/AILogs.tsx new file mode 100644 index 0000000000..e7db08bf74 --- /dev/null +++ b/Dashboard/src/Pages/Settings/AILogs.tsx @@ -0,0 +1,9 @@ +import React, { FunctionComponent, ReactElement } from "react"; +import PageComponentProps from "../PageComponentProps"; +import LlmLogsTable from "../../Components/AILogs/LlmLogsTable"; + +const SettingsAILogs: FunctionComponent = (): ReactElement => { + return ; +}; + +export default SettingsAILogs; diff --git a/Dashboard/src/Pages/Settings/SideMenu.tsx b/Dashboard/src/Pages/Settings/SideMenu.tsx index 39b3d6b53c..ed676265c1 100644 --- a/Dashboard/src/Pages/Settings/SideMenu.tsx +++ b/Dashboard/src/Pages/Settings/SideMenu.tsx @@ -373,6 +373,15 @@ const DashboardSideMenu: () => JSX.Element = (): ReactElement => { }, ] : []), + { + link: { + title: "AI Logs", + to: RouteUtil.populateRouteParams( + RouteMap[PageMap.SETTINGS_AI_LOGS] as Route, + ), + }, + icon: IconProp.Bolt, + }, ], }, { diff --git a/Dashboard/src/Routes/AlertRoutes.tsx b/Dashboard/src/Routes/AlertRoutes.tsx index ee32624460..6b4a08c78d 100644 --- a/Dashboard/src/Routes/AlertRoutes.tsx +++ b/Dashboard/src/Routes/AlertRoutes.tsx @@ -31,6 +31,11 @@ const AlertViewNotificationLogs: LazyExoticComponent< return import("../Pages/Alerts/View/NotificationLogs"); }); +const AlertViewAILogs: LazyExoticComponent> = + lazy(() => { + return import("../Pages/Alerts/View/AILogs"); + }); + const AlertsWorkspaceConnectionSlack: LazyExoticComponent< FunctionComponent > = lazy(() => { @@ -194,6 +199,18 @@ const AlertsRoutes: FunctionComponent = ( } /> + + + + } + /> + +> = lazy(() => { + return import("../Pages/Incidents/View/AILogs"); +}); + const IncidentViewDelete: LazyExoticComponent< FunctionComponent > = lazy(() => { @@ -405,6 +411,18 @@ const IncidentsRoutes: FunctionComponent = ( } /> + + + + + } + /> ); diff --git a/Dashboard/src/Routes/SettingsRoutes.tsx b/Dashboard/src/Routes/SettingsRoutes.tsx index 2992f6d89f..f4a3bf917f 100644 --- a/Dashboard/src/Routes/SettingsRoutes.tsx +++ b/Dashboard/src/Routes/SettingsRoutes.tsx @@ -249,6 +249,10 @@ const SettingsNotificationLogs: LazyExoticComponent< > = lazy(() => { return import("../Pages/Settings/NotificationLogs"); }); +const SettingsAILogs: LazyExoticComponent> = + lazy(() => { + return import("../Pages/Settings/AILogs"); + }); const SettingsNotifications: LazyExoticComponent< FunctionComponent > = lazy(() => { @@ -348,6 +352,17 @@ const SettingsRoutes: FunctionComponent = ( } /> + + + + } + /> = { [PageMap.INCIDENT_VIEW_OWNERS]: `${RouteParams.ModelID}/owners`, [PageMap.INCIDENT_VIEW_ON_CALL_POLICY_EXECUTION_LOGS]: `${RouteParams.ModelID}/on-call-policy-execution-logs`, [PageMap.INCIDENT_VIEW_NOTIFICATION_LOGS]: `${RouteParams.ModelID}/notification-logs`, + [PageMap.INCIDENT_VIEW_AI_LOGS]: `${RouteParams.ModelID}/ai-logs`, [PageMap.INCIDENT_VIEW_DELETE]: `${RouteParams.ModelID}/delete`, [PageMap.INCIDENT_VIEW_SETTINGS]: `${RouteParams.ModelID}/settings`, [PageMap.INCIDENT_VIEW_CUSTOM_FIELDS]: `${RouteParams.ModelID}/custom-fields`, @@ -182,6 +183,7 @@ export const AlertsRoutePath: Dictionary = { [PageMap.ALERT_VIEW_OWNERS]: `${RouteParams.ModelID}/owners`, [PageMap.ALERT_VIEW_ON_CALL_POLICY_EXECUTION_LOGS]: `${RouteParams.ModelID}/on-call-policy-execution-logs`, [PageMap.ALERT_VIEW_NOTIFICATION_LOGS]: `${RouteParams.ModelID}/notification-logs`, + [PageMap.ALERT_VIEW_AI_LOGS]: `${RouteParams.ModelID}/ai-logs`, [PageMap.ALERT_VIEW_DELETE]: `${RouteParams.ModelID}/delete`, [PageMap.ALERT_VIEW_DESCRIPTION]: `${RouteParams.ModelID}/description`, [PageMap.ALERT_VIEW_ROOT_CAUSE]: `${RouteParams.ModelID}/root-cause`, @@ -213,6 +215,7 @@ export const SettingsRoutePath: Dictionary = { [PageMap.SETTINGS_DANGERZONE]: "danger-zone", [PageMap.SETTINGS_NOTIFICATION_SETTINGS]: "notification-settings", [PageMap.SETTINGS_NOTIFICATION_LOGS]: "notification-logs", + [PageMap.SETTINGS_AI_LOGS]: "ai-logs", [PageMap.SETTINGS_APIKEYS]: `api-keys`, [PageMap.SETTINGS_APIKEY_VIEW]: `api-keys/${RouteParams.ModelID}`, [PageMap.SETTINGS_TELEMETRY_INGESTION_KEYS]: `telemetry-ingestion-keys`, @@ -541,6 +544,12 @@ const RouteMap: Dictionary = { }`, ), + [PageMap.ALERT_VIEW_AI_LOGS]: new Route( + `/dashboard/${RouteParams.ProjectID}/alerts/${ + AlertsRoutePath[PageMap.ALERT_VIEW_AI_LOGS] + }`, + ), + [PageMap.ALERT_VIEW_DELETE]: new Route( `/dashboard/${RouteParams.ProjectID}/alerts/${ AlertsRoutePath[PageMap.ALERT_VIEW_DELETE] @@ -682,6 +691,12 @@ const RouteMap: Dictionary = { }`, ), + [PageMap.INCIDENT_VIEW_AI_LOGS]: new Route( + `/dashboard/${RouteParams.ProjectID}/incidents/${ + IncidentsRoutePath[PageMap.INCIDENT_VIEW_AI_LOGS] + }`, + ), + [PageMap.INCIDENT_VIEW_DELETE]: new Route( `/dashboard/${RouteParams.ProjectID}/incidents/${ IncidentsRoutePath[PageMap.INCIDENT_VIEW_DELETE] @@ -1635,6 +1650,12 @@ const RouteMap: Dictionary = { }`, ), + [PageMap.SETTINGS_AI_LOGS]: new Route( + `/dashboard/${RouteParams.ProjectID}/settings/${ + SettingsRoutePath[PageMap.SETTINGS_AI_LOGS] + }`, + ), + [PageMap.SETTINGS_APIKEYS]: new Route( `/dashboard/${RouteParams.ProjectID}/settings/${ SettingsRoutePath[PageMap.SETTINGS_APIKEYS] From 393e01eb9e626af7e3793ae9c0f4f5aafe64fd06 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 20:18:17 +0000 Subject: [PATCH 12/46] feat: Update AILogService and IncidentAPI to handle optional userId and improve logging in LlmLogsTable --- Common/Server/API/IncidentAPI.ts | 13 ++++--- Common/Server/Services/AILogService.ts | 34 ++++++++++++++----- .../src/Components/AILogs/LlmLogsTable.tsx | 8 +++-- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/Common/Server/API/IncidentAPI.ts b/Common/Server/API/IncidentAPI.ts index 466d287c43..92cee99483 100644 --- a/Common/Server/API/IncidentAPI.ts +++ b/Common/Server/API/IncidentAPI.ts @@ -16,7 +16,7 @@ import { } from "../Utils/Express"; import CommonAPI from "./CommonAPI"; import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps"; -import AILogService from "../Services/AILogService"; +import AILogService, { AILogRequest } from "../Services/AILogService"; import IncidentAIContextBuilder, { AIGenerationContext, IncidentContextData, @@ -209,15 +209,20 @@ export default class IncidentAPI extends BaseAPI< ); // Generate postmortem using AILogService (handles billing and logging) - const response = await AILogService.executeWithLogging({ + const aiLogRequest: AILogRequest = { projectId: incident.projectId, - userId: props.userId, feature: "Incident Postmortem", incidentId: incidentId, messages: aiContext.messages, maxTokens: 8192, temperature: 0.7, - }); + }; + + if (props.userId) { + aiLogRequest.userId = props.userId; + } + + const response = await AILogService.executeWithLogging(aiLogRequest); return Response.sendJsonObjectResponse(req, res, { postmortemNote: response.content, diff --git a/Common/Server/Services/AILogService.ts b/Common/Server/Services/AILogService.ts index f6a96fdea6..3015beca57 100644 --- a/Common/Server/Services/AILogService.ts +++ b/Common/Server/Services/AILogService.ts @@ -64,10 +64,6 @@ export class Service extends BaseService { // Create log entry (will be updated after completion) const logEntry: LlmLog = new LlmLog(); logEntry.projectId = request.projectId; - logEntry.llmProviderId = llmProvider.id; - logEntry.llmProviderName = llmProvider.name; - logEntry.llmType = llmProvider.llmType; - logEntry.modelName = llmProvider.modelName; logEntry.isGlobalProvider = llmProvider.isGlobalLlm || false; logEntry.feature = request.feature; logEntry.requestPrompt = request.messages @@ -76,12 +72,34 @@ export class Service extends BaseService { }) .join("\n") .substring(0, 5000); // Store first 5000 chars - logEntry.userId = request.userId; - logEntry.incidentId = request.incidentId; - logEntry.alertId = request.alertId; - logEntry.scheduledMaintenanceId = request.scheduledMaintenanceId; logEntry.requestStartedAt = startTime; + // Set optional fields only if they have values + if (llmProvider.id) { + logEntry.llmProviderId = llmProvider.id; + } + if (llmProvider.name) { + logEntry.llmProviderName = llmProvider.name; + } + if (llmProvider.llmType) { + logEntry.llmType = llmProvider.llmType; + } + if (llmProvider.modelName) { + logEntry.modelName = llmProvider.modelName; + } + if (request.userId) { + logEntry.userId = request.userId; + } + if (request.incidentId) { + logEntry.incidentId = request.incidentId; + } + if (request.alertId) { + logEntry.alertId = request.alertId; + } + if (request.scheduledMaintenanceId) { + logEntry.scheduledMaintenanceId = request.scheduledMaintenanceId; + } + // Check if billing should apply const shouldBill: boolean = IsBillingEnabled && (llmProvider.isGlobalLlm || false); diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx index b5ff96dc27..ec1e725dfd 100644 --- a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -12,12 +12,11 @@ import ConfirmModal from "Common/UI/Components/Modal/ConfirmModal"; import IconProp from "Common/Types/Icon/IconProp"; import { ButtonStyleType } from "Common/UI/Components/Button/Button"; import Query from "Common/Types/BaseDatabase/Query"; -import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel"; import UserElement from "../User/User"; import User from "Common/Models/DatabaseModels/User"; export interface LlmLogsTableProps { - query?: Query; + query?: Query; singularName?: string; } @@ -139,6 +138,11 @@ const LlmLogsTable: FunctionComponent = ( ? `${props.singularName.replace(/\s+/g, "-").toLowerCase()}-llm-logs-table` : "llm-logs-table" } + userPreferencesKey={ + props.singularName + ? `${props.singularName.replace(/\s+/g, "-").toLowerCase()}-llm-logs-table` + : "llm-logs-table" + } name="AI Logs" isDeleteable={false} isEditable={false} From bb485070afade002868bfd686817eb640e51f695 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 20:19:06 +0000 Subject: [PATCH 13/46] style: Improve code formatting and readability in AILogs components --- Dashboard/src/Pages/Incidents/View/AILogs.tsx | 8 ++++++-- Dashboard/src/Pages/Settings/AILogs.tsx | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Dashboard/src/Pages/Incidents/View/AILogs.tsx b/Dashboard/src/Pages/Incidents/View/AILogs.tsx index 8de092e6f4..ebca1387b2 100644 --- a/Dashboard/src/Pages/Incidents/View/AILogs.tsx +++ b/Dashboard/src/Pages/Incidents/View/AILogs.tsx @@ -4,10 +4,14 @@ import LlmLogsTable from "../../../Components/AILogs/LlmLogsTable"; import Navigation from "Common/UI/Utils/Navigation"; import ObjectID from "Common/Types/ObjectID"; -const IncidentAILogs: FunctionComponent = (): ReactElement => { +const IncidentAILogs: FunctionComponent< + PageComponentProps +> = (): ReactElement => { const modelId: ObjectID = Navigation.getLastParamAsObjectID(1); - return ; + return ( + + ); }; export default IncidentAILogs; diff --git a/Dashboard/src/Pages/Settings/AILogs.tsx b/Dashboard/src/Pages/Settings/AILogs.tsx index e7db08bf74..5d9ba5d2b3 100644 --- a/Dashboard/src/Pages/Settings/AILogs.tsx +++ b/Dashboard/src/Pages/Settings/AILogs.tsx @@ -2,7 +2,9 @@ import React, { FunctionComponent, ReactElement } from "react"; import PageComponentProps from "../PageComponentProps"; import LlmLogsTable from "../../Components/AILogs/LlmLogsTable"; -const SettingsAILogs: FunctionComponent = (): ReactElement => { +const SettingsAILogs: FunctionComponent< + PageComponentProps +> = (): ReactElement => { return ; }; From 17ba51a35927d97505a2c8c75b9bebfe2be8ce9b Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 20:30:33 +0000 Subject: [PATCH 14/46] feat: Enhance type definitions and improve type safety in various components and services --- Common/Server/API/IncidentAPI.ts | 8 ++++++-- Common/Server/Services/AILogService.ts | 7 ++++--- Common/Server/Services/IncidentService.ts | 7 +++++-- .../Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts | 9 ++++++--- Common/UI/Components/AI/GenerateFromAIModal.tsx | 8 +++++++- Dashboard/src/Components/AILogs/LlmLogsTable.tsx | 3 ++- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/Common/Server/API/IncidentAPI.ts b/Common/Server/API/IncidentAPI.ts index 92cee99483..b580b0bcba 100644 --- a/Common/Server/API/IncidentAPI.ts +++ b/Common/Server/API/IncidentAPI.ts @@ -16,7 +16,10 @@ import { } from "../Utils/Express"; import CommonAPI from "./CommonAPI"; import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps"; -import AILogService, { AILogRequest } from "../Services/AILogService"; +import AILogService, { + AILogRequest, + AILogResponse, +} from "../Services/AILogService"; import IncidentAIContextBuilder, { AIGenerationContext, IncidentContextData, @@ -222,7 +225,8 @@ export default class IncidentAPI extends BaseAPI< aiLogRequest.userId = props.userId; } - const response = await AILogService.executeWithLogging(aiLogRequest); + const response: AILogResponse = + await AILogService.executeWithLogging(aiLogRequest); return Response.sendJsonObjectResponse(req, res, { postmortemNote: response.content, diff --git a/Common/Server/Services/AILogService.ts b/Common/Server/Services/AILogService.ts index 3015beca57..f9a50229ff 100644 --- a/Common/Server/Services/AILogService.ts +++ b/Common/Server/Services/AILogService.ts @@ -3,6 +3,7 @@ import BaseService from "./BaseService"; import LlmProviderService from "./LlmProviderService"; import LlmLogService from "./LlmLogService"; import ProjectService from "./ProjectService"; +import Project from "../../Models/DatabaseModels/Project"; import AIBillingService from "./AIBillingService"; import LLMService, { LLMProviderConfig, @@ -106,7 +107,7 @@ export class Service extends BaseService { // Check balance if billing enabled and using global provider if (shouldBill) { - const project = await ProjectService.findOneById({ + const project: Project | null = await ProjectService.findOneById({ id: request.projectId, select: { aiCurrentBalanceInUSDCents: true }, props: { isRoot: true }, @@ -178,7 +179,7 @@ export class Service extends BaseService { // Deduct from project balance if (totalCost > 0) { - const project = await ProjectService.findOneById({ + const project: Project | null = await ProjectService.findOneById({ id: request.projectId, select: { aiCurrentBalanceInUSDCents: true }, props: { isRoot: true }, @@ -210,7 +211,7 @@ export class Service extends BaseService { } // Save log entry - const savedLog = await LlmLogService.create({ + const savedLog: LlmLog = await LlmLogService.create({ data: logEntry, props: { isRoot: true }, }); diff --git a/Common/Server/Services/IncidentService.ts b/Common/Server/Services/IncidentService.ts index 31343a3eec..b2ca4b6712 100644 --- a/Common/Server/Services/IncidentService.ts +++ b/Common/Server/Services/IncidentService.ts @@ -65,7 +65,10 @@ import OnCallDutyPolicy from "../../Models/DatabaseModels/OnCallDutyPolicy"; import Dictionary from "../../Types/Dictionary"; import IncidentTemplateService from "./IncidentTemplateService"; import IncidentTemplate from "../../Models/DatabaseModels/IncidentTemplate"; -import LLMService, { LLMProviderConfig } from "../Utils/LLM/LLMService"; +import LLMService, { + LLMProviderConfig, + LLMCompletionResponse, +} from "../Utils/LLM/LLMService"; import LlmProviderService from "./LlmProviderService"; import LlmProvider from "../../Models/DatabaseModels/LlmProvider"; import IncidentAIContextBuilder, { @@ -2465,7 +2468,7 @@ ${incidentSeverity.name} llmConfig.modelName = llmProvider.modelName; } - const response = await LLMService.getCompletion({ + const response: LLMCompletionResponse = await LLMService.getCompletion({ llmProviderConfig: llmConfig, messages: aiContext.messages, maxTokens: 8192, diff --git a/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts b/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts index c7263b0311..5ed57bde59 100644 --- a/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +++ b/Common/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts @@ -1,3 +1,4 @@ +import { WorkspaceChannelMessage } from "../Workspace"; import HTTPErrorResponse from "../../../../Types/API/HTTPErrorResponse"; import HTTPResponse from "../../../../Types/API/HTTPResponse"; import URL from "../../../../Types/API/URL"; @@ -3216,9 +3217,11 @@ All monitoring checks are passing normally.`; ); // Sort by timestamp (oldest first) - messages.sort((a, b) => { - return a.timestamp.getTime() - b.timestamp.getTime(); - }); + messages.sort( + (a: WorkspaceChannelMessage, b: WorkspaceChannelMessage) => { + return a.timestamp.getTime() - b.timestamp.getTime(); + }, + ); } catch (error) { logger.error(`Error fetching Microsoft Teams channel messages: ${error}`); } diff --git a/Common/UI/Components/AI/GenerateFromAIModal.tsx b/Common/UI/Components/AI/GenerateFromAIModal.tsx index 4918ad7210..27685998c5 100644 --- a/Common/UI/Components/AI/GenerateFromAIModal.tsx +++ b/Common/UI/Components/AI/GenerateFromAIModal.tsx @@ -62,7 +62,13 @@ const GenerateFromAIModal: FunctionComponent = ( ] as string; if (selectedTemplateId && props.templates) { - const selectedTemplate = props.templates.find( + const selectedTemplate: + | { + id: string; + name: string; + content?: string; + } + | undefined = props.templates.find( (t: { id: string; name: string; content?: string }) => { return t.id === selectedTemplateId; }, diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx index ec1e725dfd..483ef66386 100644 --- a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -4,6 +4,7 @@ import LlmLog from "Common/Models/DatabaseModels/LlmLog"; import FieldType from "Common/UI/Components/Types/FieldType"; import Columns from "Common/UI/Components/ModelTable/Columns"; import Pill from "Common/UI/Components/Pill/Pill"; +import Color from "Common/Types/Color"; import { Green, Red, Yellow } from "Common/Types/BrandColors"; import LlmLogStatus from "Common/Types/LlmLogStatus"; import ProjectUtil from "Common/UI/Utils/Project"; @@ -102,7 +103,7 @@ const LlmLogsTable: FunctionComponent = ( type: FieldType.Text, getElement: (item: LlmLog): ReactElement => { if (item["status"]) { - let color = Green; + let color: Color = Green; if (item["status"] === LlmLogStatus.Error) { color = Red; } From 632849b33423a2f11977989468092ff8a771827e Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 20:33:09 +0000 Subject: [PATCH 15/46] feat: Add LlmLog table and related constraints for enhanced logging functionality --- .../1765830758857-MigrationName.ts | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts diff --git a/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts b/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts new file mode 100644 index 0000000000..f35a649fb1 --- /dev/null +++ b/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts @@ -0,0 +1,46 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MigrationName1765830758857 implements MigrationInterface { + name = 'MigrationName1765830758857' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "LlmLog" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "projectId" uuid NOT NULL, "llmProviderId" uuid, "llmProviderName" character varying(100), "llmType" character varying(100), "modelName" character varying(100), "isGlobalProvider" boolean NOT NULL DEFAULT false, "inputTokens" integer NOT NULL DEFAULT '0', "outputTokens" integer NOT NULL DEFAULT '0', "totalTokens" integer NOT NULL DEFAULT '0', "costInUSDCents" integer NOT NULL DEFAULT '0', "wasBilled" boolean NOT NULL DEFAULT false, "status" character varying(100) NOT NULL, "statusMessage" character varying(500), "feature" character varying(100), "requestPrompt" text, "responsePreview" text, "incidentId" uuid, "alertId" uuid, "scheduledMaintenanceId" uuid, "userId" uuid, "requestStartedAt" TIMESTAMP WITH TIME ZONE, "requestCompletedAt" TIMESTAMP WITH TIME ZONE, "durationMs" integer, "deletedByUserId" uuid, CONSTRAINT "PK_807b7f4578f9dcbb1f7aeeb94f8" PRIMARY KEY ("_id"))`); + await queryRunner.query(`CREATE INDEX "IDX_c3c061a924f368e2cc68a23308" ON "LlmLog" ("projectId") `); + await queryRunner.query(`CREATE INDEX "IDX_bfd15354697dc30fedf7a96976" ON "LlmLog" ("llmProviderId") `); + await queryRunner.query(`CREATE INDEX "IDX_159d2b07c02788dcac8575bf4a" ON "LlmLog" ("incidentId") `); + await queryRunner.query(`CREATE INDEX "IDX_83696b0732c0a3601a9d5d7afe" ON "LlmLog" ("alertId") `); + await queryRunner.query(`CREATE INDEX "IDX_19d277440e9b9e3ed4fa46c227" ON "LlmLog" ("scheduledMaintenanceId") `); + await queryRunner.query(`CREATE INDEX "IDX_5c6c985581a3f85d84a2987daa" ON "LlmLog" ("userId") `); + await queryRunner.query(`ALTER TABLE "LlmProvider" ADD "costPerMillionTokensInUSDCents" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "rotation" SET DEFAULT '{"_type":"Recurring","value":{"intervalType":"Day","intervalCount":{"_type":"PositiveNumber","value":1}}}'`); + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "restrictionTimes" SET DEFAULT '{"_type":"RestrictionTimes","value":{"restictionType":"None","dayRestrictionTimes":null,"weeklyRestrictionTimes":[]}}'`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD CONSTRAINT "FK_c3c061a924f368e2cc68a233083" FOREIGN KEY ("projectId") REFERENCES "Project"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD CONSTRAINT "FK_bfd15354697dc30fedf7a96976e" FOREIGN KEY ("llmProviderId") REFERENCES "LlmProvider"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD CONSTRAINT "FK_159d2b07c02788dcac8575bf4a6" FOREIGN KEY ("incidentId") REFERENCES "Incident"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD CONSTRAINT "FK_83696b0732c0a3601a9d5d7afe1" FOREIGN KEY ("alertId") REFERENCES "Alert"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD CONSTRAINT "FK_19d277440e9b9e3ed4fa46c227a" FOREIGN KEY ("scheduledMaintenanceId") REFERENCES "ScheduledMaintenance"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD CONSTRAINT "FK_5c6c985581a3f85d84a2987daae" FOREIGN KEY ("userId") REFERENCES "User"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD CONSTRAINT "FK_bbe2bdcf251d6ef1ea43b666370" FOREIGN KEY ("deletedByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "LlmLog" DROP CONSTRAINT "FK_bbe2bdcf251d6ef1ea43b666370"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP CONSTRAINT "FK_5c6c985581a3f85d84a2987daae"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP CONSTRAINT "FK_19d277440e9b9e3ed4fa46c227a"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP CONSTRAINT "FK_83696b0732c0a3601a9d5d7afe1"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP CONSTRAINT "FK_159d2b07c02788dcac8575bf4a6"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP CONSTRAINT "FK_bfd15354697dc30fedf7a96976e"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP CONSTRAINT "FK_c3c061a924f368e2cc68a233083"`); + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "restrictionTimes" SET DEFAULT '{"_type": "RestrictionTimes", "value": {"restictionType": "None", "dayRestrictionTimes": null, "weeklyRestrictionTimes": []}}'`); + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "rotation" SET DEFAULT '{"_type": "Recurring", "value": {"intervalType": "Day", "intervalCount": {"_type": "PositiveNumber", "value": 1}}}'`); + await queryRunner.query(`ALTER TABLE "LlmProvider" DROP COLUMN "costPerMillionTokensInUSDCents"`); + await queryRunner.query(`DROP INDEX "public"."IDX_5c6c985581a3f85d84a2987daa"`); + await queryRunner.query(`DROP INDEX "public"."IDX_19d277440e9b9e3ed4fa46c227"`); + await queryRunner.query(`DROP INDEX "public"."IDX_83696b0732c0a3601a9d5d7afe"`); + await queryRunner.query(`DROP INDEX "public"."IDX_159d2b07c02788dcac8575bf4a"`); + await queryRunner.query(`DROP INDEX "public"."IDX_bfd15354697dc30fedf7a96976"`); + await queryRunner.query(`DROP INDEX "public"."IDX_c3c061a924f368e2cc68a23308"`); + await queryRunner.query(`DROP TABLE "LlmLog"`); + } + +} From ee83583044016f31f1d92c47aed7ce65dfda9eb8 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 20:33:42 +0000 Subject: [PATCH 16/46] fix: Add public access modifier to name property in MigrationName1765830758857 class --- .../Postgres/SchemaMigrations/1765830758857-MigrationName.ts | 2 +- Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts b/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts index f35a649fb1..1c2bc6272d 100644 --- a/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts +++ b/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts @@ -1,7 +1,7 @@ import { MigrationInterface, QueryRunner } from "typeorm"; export class MigrationName1765830758857 implements MigrationInterface { - name = 'MigrationName1765830758857' + public name = 'MigrationName1765830758857' public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(`CREATE TABLE "LlmLog" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "projectId" uuid NOT NULL, "llmProviderId" uuid, "llmProviderName" character varying(100), "llmType" character varying(100), "modelName" character varying(100), "isGlobalProvider" boolean NOT NULL DEFAULT false, "inputTokens" integer NOT NULL DEFAULT '0', "outputTokens" integer NOT NULL DEFAULT '0', "totalTokens" integer NOT NULL DEFAULT '0', "costInUSDCents" integer NOT NULL DEFAULT '0', "wasBilled" boolean NOT NULL DEFAULT false, "status" character varying(100) NOT NULL, "statusMessage" character varying(500), "feature" character varying(100), "requestPrompt" text, "responsePreview" text, "incidentId" uuid, "alertId" uuid, "scheduledMaintenanceId" uuid, "userId" uuid, "requestStartedAt" TIMESTAMP WITH TIME ZONE, "requestCompletedAt" TIMESTAMP WITH TIME ZONE, "durationMs" integer, "deletedByUserId" uuid, CONSTRAINT "PK_807b7f4578f9dcbb1f7aeeb94f8" PRIMARY KEY ("_id"))`); diff --git a/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts b/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts index d278291ea3..bd075001ec 100644 --- a/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +++ b/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts @@ -200,6 +200,7 @@ import { MigrationName1765580181582 } from "./1765580181582-MigrationName"; import { MigrationName1765633554715 } from "./1765633554715-MigrationName"; import { MigrationName1765801357168 } from "./1765801357168-MigrationName"; import { MigrationName1765810218488 } from "./1765810218488-MigrationName"; +import { MigrationName1765830758857 } from "./1765830758857-MigrationName"; export default [ InitialMigration, @@ -404,4 +405,5 @@ export default [ MigrationName1765633554715, MigrationName1765801357168, MigrationName1765810218488, + MigrationName1765830758857 ]; From b361d854bbbc3a5ed661d6b13e1f3e9fd4e077e4 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 21:29:07 +0000 Subject: [PATCH 17/46] feat: Add LlmLog API integration to BaseAPIFeatureSet for enhanced logging capabilities --- App/FeatureSet/BaseAPI/Index.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/App/FeatureSet/BaseAPI/Index.ts b/App/FeatureSet/BaseAPI/Index.ts index 85d76317cc..70c3886a0a 100644 --- a/App/FeatureSet/BaseAPI/Index.ts +++ b/App/FeatureSet/BaseAPI/Index.ts @@ -358,6 +358,10 @@ import ProbeOwnerUserService, { Service as ProbeOwnerUserServiceType, } from "Common/Server/Services/ProbeOwnerUserService"; +import LlmLogService, { + Service as LlmLogServiceType, +} from "Common/Server/Services/LlmLogService"; + import TelemetryExceptionService, { Service as TelemetryExceptionServiceType, } from "Common/Server/Services/TelemetryExceptionService"; @@ -467,6 +471,7 @@ import WorkflowLog from "Common/Models/DatabaseModels/WorkflowLog"; import WorkflowVariable from "Common/Models/DatabaseModels/WorkflowVariable"; import ProbeOwnerTeam from "Common/Models/DatabaseModels/ProbeOwnerTeam"; import ProbeOwnerUser from "Common/Models/DatabaseModels/ProbeOwnerUser"; +import LlmLog from "Common/Models/DatabaseModels/LlmLog"; import ServiceCatalogDependency from "Common/Models/DatabaseModels/ServiceCatalogDependency"; import ExceptionInstance from "Common/Models/AnalyticsModels/ExceptionInstance"; import TelemetyException from "Common/Models/DatabaseModels/TelemetryException"; @@ -1682,6 +1687,14 @@ const BaseAPIFeatureSet: FeatureSet = { new LlmProviderAPI().getRouter(), ); + app.use( + `/${APP_NAME.toLocaleLowerCase()}`, + new BaseAPI( + LlmLog, + LlmLogService, + ).getRouter(), + ); + app.use( `/${APP_NAME.toLocaleLowerCase()}`, new StatusPageSubscriberAPI().getRouter(), From cac0ef715566e4da65cb81867e3b36b0eb3c02b1 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 21:30:59 +0000 Subject: [PATCH 18/46] feat: Update cost display in LlmLogsTable to show USD instead of cents --- Dashboard/src/Components/AILogs/LlmLogsTable.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx index 483ef66386..cfed725bcc 100644 --- a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -89,8 +89,16 @@ const LlmLogsTable: FunctionComponent = ( }, { field: { costInUSDCents: true }, - title: "Cost (cents)", - type: FieldType.Number, + title: "Cost (USD)", + type: FieldType.Text, + getElement: (item: LlmLog): ReactElement => { + const cents = item["costInUSDCents"] as number; + if (cents === undefined || cents === null) { + return

-

; + } + const usd = cents / 100; + return

${usd.toFixed(4)}

; + }, }, { field: { createdAt: true }, From 863737c2a33c2d261c8b118bde20ffd1c2eb7687 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 21:32:06 +0000 Subject: [PATCH 19/46] feat: Conditionally display cost column in LlmLogsTable based on billing configuration --- .../src/Components/AILogs/LlmLogsTable.tsx | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx index cfed725bcc..15bea7336c 100644 --- a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -15,6 +15,7 @@ import { ButtonStyleType } from "Common/UI/Components/Button/Button"; import Query from "Common/Types/BaseDatabase/Query"; import UserElement from "../User/User"; import User from "Common/Models/DatabaseModels/User"; +import { BILLING_ENABLED } from "Common/UI/Config"; export interface LlmLogsTableProps { query?: Query; @@ -87,19 +88,24 @@ const LlmLogsTable: FunctionComponent = ( title: "Output Tokens", type: FieldType.Number, }, - { - field: { costInUSDCents: true }, - title: "Cost (USD)", - type: FieldType.Text, - getElement: (item: LlmLog): ReactElement => { - const cents = item["costInUSDCents"] as number; - if (cents === undefined || cents === null) { - return

-

; - } - const usd = cents / 100; - return

${usd.toFixed(4)}

; - }, - }, + // Only show cost column if billing is enabled + ...(BILLING_ENABLED + ? [ + { + field: { costInUSDCents: true }, + title: "Cost (USD)", + type: FieldType.Text, + getElement: (item: LlmLog): ReactElement => { + const cents = item["costInUSDCents"] as number; + if (cents === undefined || cents === null) { + return

-

; + } + const usd = cents / 100; + return

${usd.toFixed(4)}

; + }, + }, + ] + : []), { field: { createdAt: true }, title: "Time", From 60955f0e1cd56a56f4bb9044f3c860accd675780 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 21:35:12 +0000 Subject: [PATCH 20/46] fix: Update error message for missing payment methods to provide clearer instructions --- Dashboard/src/Pages/Settings/Invoices.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dashboard/src/Pages/Settings/Invoices.tsx b/Dashboard/src/Pages/Settings/Invoices.tsx index 868f9cce6e..b596471b80 100644 --- a/Dashboard/src/Pages/Settings/Invoices.tsx +++ b/Dashboard/src/Pages/Settings/Invoices.tsx @@ -113,7 +113,7 @@ const Settings: FunctionComponent = ( }); if (!paymentMethodsResult || paymentMethodsResult.data.length === 0) { - setError("Payment methods not found. Please try again later"); + setError("Payment methods not found. Please add one in Project Settings -> Billing."); return; } From bc05f75304dbae0a8cb0db6f18b802c2e2b9f16f Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 21:38:27 +0000 Subject: [PATCH 21/46] feat: Refactor LlmLog model by removing input and output tokens, and update related migrations and table display --- Common/Models/DatabaseModels/LlmLog.ts | 54 +------------------ .../1765834537501-MigrationName.ts | 24 +++++++++ .../Postgres/SchemaMigrations/Index.ts | 4 +- Common/Server/Services/AILogService.ts | 2 - .../src/Components/AILogs/LlmLogsTable.tsx | 9 +--- 5 files changed, 30 insertions(+), 63 deletions(-) create mode 100644 Common/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.ts diff --git a/Common/Models/DatabaseModels/LlmLog.ts b/Common/Models/DatabaseModels/LlmLog.ts index 7129398a66..390e32a2c4 100644 --- a/Common/Models/DatabaseModels/LlmLog.ts +++ b/Common/Models/DatabaseModels/LlmLog.ts @@ -278,59 +278,7 @@ export default class LlmLog extends BaseModel { @TableColumn({ required: true, type: TableColumnType.Number, - title: "Input Tokens", - description: "Number of input (prompt) tokens used", - canReadOnRelationQuery: false, - isDefaultValueColumn: true, - defaultValue: 0, - }) - @Column({ - nullable: false, - default: 0, - type: ColumnType.Number, - }) - public inputTokens?: number = undefined; - - @ColumnAccessControl({ - create: [], - read: [ - Permission.ProjectOwner, - Permission.ProjectAdmin, - Permission.ProjectMember, - Permission.ReadLlmLog, - ], - update: [], - }) - @TableColumn({ - required: true, - type: TableColumnType.Number, - title: "Output Tokens", - description: "Number of output (completion) tokens used", - canReadOnRelationQuery: false, - isDefaultValueColumn: true, - defaultValue: 0, - }) - @Column({ - nullable: false, - default: 0, - type: ColumnType.Number, - }) - public outputTokens?: number = undefined; - - @ColumnAccessControl({ - create: [], - read: [ - Permission.ProjectOwner, - Permission.ProjectAdmin, - Permission.ProjectMember, - Permission.ReadLlmLog, - ], - update: [], - }) - @TableColumn({ - required: true, - type: TableColumnType.Number, - title: "Total Tokens", + title: "Tokens Used", description: "Total tokens used (input + output)", canReadOnRelationQuery: false, isDefaultValueColumn: true, diff --git a/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.ts b/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.ts new file mode 100644 index 0000000000..3bdd497868 --- /dev/null +++ b/Common/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.ts @@ -0,0 +1,24 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MigrationName1765834537501 implements MigrationInterface { + public name = 'MigrationName1765834537501' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "LlmLog" DROP COLUMN "inputTokens"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP COLUMN "outputTokens"`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP COLUMN "totalTokens"`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD "totalTokens" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "rotation" SET DEFAULT '{"_type":"Recurring","value":{"intervalType":"Day","intervalCount":{"_type":"PositiveNumber","value":1}}}'`); + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "restrictionTimes" SET DEFAULT '{"_type":"RestrictionTimes","value":{"restictionType":"None","dayRestrictionTimes":null,"weeklyRestrictionTimes":[]}}'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "restrictionTimes" SET DEFAULT '{"_type": "RestrictionTimes", "value": {"restictionType": "None", "dayRestrictionTimes": null, "weeklyRestrictionTimes": []}}'`); + await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ALTER COLUMN "rotation" SET DEFAULT '{"_type": "Recurring", "value": {"intervalType": "Day", "intervalCount": {"_type": "PositiveNumber", "value": 1}}}'`); + await queryRunner.query(`ALTER TABLE "LlmLog" DROP COLUMN "totalTokens"`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD "totalTokens" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD "outputTokens" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "LlmLog" ADD "inputTokens" integer NOT NULL DEFAULT '0'`); + } + +} diff --git a/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts b/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts index bd075001ec..abe1ea29c6 100644 --- a/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +++ b/Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts @@ -201,6 +201,7 @@ import { MigrationName1765633554715 } from "./1765633554715-MigrationName"; import { MigrationName1765801357168 } from "./1765801357168-MigrationName"; import { MigrationName1765810218488 } from "./1765810218488-MigrationName"; import { MigrationName1765830758857 } from "./1765830758857-MigrationName"; +import { MigrationName1765834537501 } from "./1765834537501-MigrationName"; export default [ InitialMigration, @@ -405,5 +406,6 @@ export default [ MigrationName1765633554715, MigrationName1765801357168, MigrationName1765810218488, - MigrationName1765830758857 + MigrationName1765830758857, + MigrationName1765834537501 ]; diff --git a/Common/Server/Services/AILogService.ts b/Common/Server/Services/AILogService.ts index f9a50229ff..3d5678f3ed 100644 --- a/Common/Server/Services/AILogService.ts +++ b/Common/Server/Services/AILogService.ts @@ -160,8 +160,6 @@ export class Service extends BaseService { // Update log with success info logEntry.status = LlmLogStatus.Success; - logEntry.inputTokens = response.usage?.promptTokens || 0; - logEntry.outputTokens = response.usage?.completionTokens || 0; logEntry.totalTokens = response.usage?.totalTokens || 0; logEntry.responsePreview = response.content.substring(0, 2000); // Store first 2000 chars logEntry.requestCompletedAt = endTime; diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx index 15bea7336c..ba6cabd58a 100644 --- a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -79,13 +79,8 @@ const LlmLogsTable: FunctionComponent = ( }, }, { - field: { inputTokens: true }, - title: "Input Tokens", - type: FieldType.Number, - }, - { - field: { outputTokens: true }, - title: "Output Tokens", + field: { totalTokens: true }, + title: "Tokens Used", type: FieldType.Number, }, // Only show cost column if billing is enabled From 931a5f9e630765945be1c1843e7447c9291eb856 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Mon, 15 Dec 2025 21:43:26 +0000 Subject: [PATCH 22/46] feat: Add AI Logs section to Scheduled Maintenance with routing and component integration --- .../View/AILogs.tsx | 20 ++++++++++++++++ .../View/SideMenu.tsx | 12 +++++++++- .../ScheduleMaintenanceEventsRoutes.tsx | 23 +++++++++++++++++++ Dashboard/src/Utils/PageMap.ts | 1 + Dashboard/src/Utils/RouteMap.ts | 9 ++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 Dashboard/src/Pages/ScheduledMaintenanceEvents/View/AILogs.tsx diff --git a/Dashboard/src/Pages/ScheduledMaintenanceEvents/View/AILogs.tsx b/Dashboard/src/Pages/ScheduledMaintenanceEvents/View/AILogs.tsx new file mode 100644 index 0000000000..90a2065d50 --- /dev/null +++ b/Dashboard/src/Pages/ScheduledMaintenanceEvents/View/AILogs.tsx @@ -0,0 +1,20 @@ +import React, { FunctionComponent, ReactElement } from "react"; +import PageComponentProps from "../../PageComponentProps"; +import LlmLogsTable from "../../../Components/AILogs/LlmLogsTable"; +import Navigation from "Common/UI/Utils/Navigation"; +import ObjectID from "Common/Types/ObjectID"; + +const ScheduledMaintenanceAILogs: FunctionComponent< + PageComponentProps +> = (): ReactElement => { + const modelId: ObjectID = Navigation.getLastParamAsObjectID(1); + + return ( + + ); +}; + +export default ScheduledMaintenanceAILogs; diff --git a/Dashboard/src/Pages/ScheduledMaintenanceEvents/View/SideMenu.tsx b/Dashboard/src/Pages/ScheduledMaintenanceEvents/View/SideMenu.tsx index c37f686cbd..c5bcdfe1d3 100644 --- a/Dashboard/src/Pages/ScheduledMaintenanceEvents/View/SideMenu.tsx +++ b/Dashboard/src/Pages/ScheduledMaintenanceEvents/View/SideMenu.tsx @@ -63,7 +63,7 @@ const DashboardSideMenu: FunctionComponent = ( />
- + = ( }} icon={IconProp.Bell} /> + diff --git a/Dashboard/src/Routes/ScheduleMaintenanceEventsRoutes.tsx b/Dashboard/src/Routes/ScheduleMaintenanceEventsRoutes.tsx index c0b126b930..ce05dce836 100644 --- a/Dashboard/src/Routes/ScheduleMaintenanceEventsRoutes.tsx +++ b/Dashboard/src/Routes/ScheduleMaintenanceEventsRoutes.tsx @@ -96,6 +96,12 @@ const ScheduledMaintenanceEventViewNotificationLogs: LazyExoticComponent< return import("../Pages/ScheduledMaintenanceEvents/View/NotificationLogs"); }); +const ScheduledMaintenanceEventViewAILogs: LazyExoticComponent< + FunctionComponent +> = lazy(() => { + return import("../Pages/ScheduledMaintenanceEvents/View/AILogs"); +}); + const ScheduledMaintenanceEventViewDescription: LazyExoticComponent< FunctionComponent > = lazy(() => { @@ -279,6 +285,23 @@ const ScheduledMaintenanceEventsRoutes: FunctionComponent = ( } /> + + + + } + /> = { [PageMap.SCHEDULED_MAINTENANCE_VIEW_CUSTOM_FIELDS]: `${RouteParams.ModelID}/custom-fields`, [PageMap.SCHEDULED_MAINTENANCE_VIEW_SETTINGS]: `${RouteParams.ModelID}/settings`, [PageMap.SCHEDULED_MAINTENANCE_VIEW_NOTIFICATION_LOGS]: `${RouteParams.ModelID}/notification-logs`, + [PageMap.SCHEDULED_MAINTENANCE_VIEW_AI_LOGS]: `${RouteParams.ModelID}/ai-logs`, }; export const SettingsRoutePath: Dictionary = { @@ -839,6 +840,14 @@ const RouteMap: Dictionary = { }`, ), + [PageMap.SCHEDULED_MAINTENANCE_VIEW_AI_LOGS]: new Route( + `/dashboard/${RouteParams.ProjectID}/scheduled-maintenance-events/${ + ScheduledMaintenanceEventsRoutePath[ + PageMap.SCHEDULED_MAINTENANCE_VIEW_AI_LOGS + ] + }`, + ), + [PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE]: new Route( `/dashboard/${RouteParams.ProjectID}/scheduled-maintenance-events/${ ScheduledMaintenanceEventsRoutePath[ From 5652298f38523576dfa629217673af07577a1cc6 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 10:25:31 +0000 Subject: [PATCH 23/46] feat: Implement hard delete for LlmLog items older than 3 days when billing is enabled; refactor LlmLogsTable by removing unused fields and action buttons --- Common/Server/Services/LlmLogService.ts | 4 ++ .../src/Components/AILogs/LlmLogsTable.tsx | 45 ------------------- 2 files changed, 4 insertions(+), 45 deletions(-) diff --git a/Common/Server/Services/LlmLogService.ts b/Common/Server/Services/LlmLogService.ts index f15b7c9ed9..67efa20b88 100644 --- a/Common/Server/Services/LlmLogService.ts +++ b/Common/Server/Services/LlmLogService.ts @@ -1,9 +1,13 @@ import DatabaseService from "./DatabaseService"; import Model from "../../Models/DatabaseModels/LlmLog"; +import { IsBillingEnabled } from "../EnvironmentConfig"; export class Service extends DatabaseService { public constructor() { super(Model); + if (IsBillingEnabled) { + this.hardDeleteItemsOlderThanInDays("createdAt", 3); + } } } diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx index ba6cabd58a..eeeccb5453 100644 --- a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -36,23 +36,6 @@ const LlmLogsTable: FunctionComponent = ( type: FieldType.Text, noValueMessage: "-", }, - { - field: { llmType: true }, - title: "Type", - type: FieldType.Text, - noValueMessage: "-", - }, - { - field: { modelName: true }, - title: "Model", - type: FieldType.Text, - noValueMessage: "-", - }, - { - field: { isGlobalProvider: true }, - title: "Global", - type: FieldType.Boolean, - }, { field: { feature: true }, title: "Feature", @@ -164,8 +147,6 @@ const LlmLogsTable: FunctionComponent = ( ...(props.query || {}), }} selectMoreFields={{ - requestPrompt: true, - responsePreview: true, statusMessage: true, }} cardProps={{ @@ -183,32 +164,6 @@ const LlmLogsTable: FunctionComponent = ( columns={defaultColumns} filters={defaultFilters} actionButtons={[ - { - title: "View Request", - buttonStyleType: ButtonStyleType.NORMAL, - icon: IconProp.List, - onClick: async (item: LlmLog, onCompleteAction: VoidFunction) => { - setModalText( - (item["requestPrompt"] as string) || "No request data", - ); - setModalTitle("Request Prompt"); - setShowModal(true); - onCompleteAction(); - }, - }, - { - title: "View Response", - buttonStyleType: ButtonStyleType.NORMAL, - icon: IconProp.File, - onClick: async (item: LlmLog, onCompleteAction: VoidFunction) => { - setModalText( - (item["responsePreview"] as string) || "No response data", - ); - setModalTitle("Response Preview"); - setShowModal(true); - onCompleteAction(); - }, - }, { title: "View Error", buttonStyleType: ButtonStyleType.NORMAL, From cc077aff99ee2f2ac387d6795be4730ad7742bac Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 10:27:21 +0000 Subject: [PATCH 24/46] feat: Conditionally display cost settings based on billing configuration in LlmProviders settings --- .../src/Pages/Settings/LlmProviders/Index.tsx | 61 +++++++++++-------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx b/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx index b31d067801..5fdba9845b 100644 --- a/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx +++ b/AdminDashboard/src/Pages/Settings/LlmProviders/Index.tsx @@ -13,6 +13,7 @@ import LlmProvider from "Common/Models/DatabaseModels/LlmProvider"; import LlmType from "Common/Types/LLM/LlmType"; import React, { FunctionComponent, ReactElement } from "react"; import DropdownUtil from "Common/UI/Utils/Dropdown"; +import { BILLING_ENABLED } from "Common/UI/Config"; const Settings: FunctionComponent = (): ReactElement => { return ( @@ -83,10 +84,14 @@ const Settings: FunctionComponent = (): ReactElement => { title: "Provider Settings", id: "provider-settings", }, - { - title: "Cost Settings", - id: "cost-settings", - }, + ...(BILLING_ENABLED + ? [ + { + title: "Cost Settings", + id: "cost-settings", + }, + ] + : []), ]} formFields={[ { @@ -160,18 +165,22 @@ const Settings: FunctionComponent = (): ReactElement => { description: "Required for Ollama. Optional for others to use custom endpoints.", }, - { - field: { - costPerMillionTokensInUSDCents: true, - }, - title: "Cost Per Million Tokens (USD Cents)", - stepId: "cost-settings", - fieldType: FormFieldSchemaType.Number, - required: false, - placeholder: "0", - description: - "Cost per million tokens in USD cents. For example, if the cost is $0.01 per 1M tokens, enter 1.", - }, + ...(BILLING_ENABLED + ? [ + { + field: { + costPerMillionTokensInUSDCents: true, + }, + title: "Cost Per Million Tokens (USD Cents)", + stepId: "cost-settings", + fieldType: FormFieldSchemaType.Number, + required: false, + placeholder: "0", + description: + "Cost per million tokens in USD cents. For example, if the cost is $0.01 per 1M tokens, enter 1.", + }, + ] + : []), ]} selectMoreFields={{ apiKey: true, @@ -222,14 +231,18 @@ const Settings: FunctionComponent = (): ReactElement => { type: FieldType.Text, noValueMessage: "-", }, - { - field: { - costPerMillionTokensInUSDCents: true, - }, - title: "Cost (cents/1M)", - type: FieldType.Number, - noValueMessage: "0", - }, + ...(BILLING_ENABLED + ? [ + { + field: { + costPerMillionTokensInUSDCents: true, + }, + title: "Cost (cents/1M)", + type: FieldType.Number, + noValueMessage: "0", + }, + ] + : []), ]} /> From 6371ac4e3632f19d5511fead9e57e07351eb95dc Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 10:28:52 +0000 Subject: [PATCH 25/46] feat: Refactor AI logging service by renaming AILogService to AIService and updating references in IncidentAPI --- Common/Server/API/IncidentAPI.ts | 8 ++++---- Common/Server/Services/{AILogService.ts => AIService.ts} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename Common/Server/Services/{AILogService.ts => AIService.ts} (100%) diff --git a/Common/Server/API/IncidentAPI.ts b/Common/Server/API/IncidentAPI.ts index b580b0bcba..5da8f380d8 100644 --- a/Common/Server/API/IncidentAPI.ts +++ b/Common/Server/API/IncidentAPI.ts @@ -16,10 +16,10 @@ import { } from "../Utils/Express"; import CommonAPI from "./CommonAPI"; import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps"; -import AILogService, { +import AIService, { AILogRequest, AILogResponse, -} from "../Services/AILogService"; +} from "../Services/AIService"; import IncidentAIContextBuilder, { AIGenerationContext, IncidentContextData, @@ -211,7 +211,7 @@ export default class IncidentAPI extends BaseAPI< template, ); - // Generate postmortem using AILogService (handles billing and logging) + // Generate postmortem using AIService (handles billing and logging) const aiLogRequest: AILogRequest = { projectId: incident.projectId, feature: "Incident Postmortem", @@ -226,7 +226,7 @@ export default class IncidentAPI extends BaseAPI< } const response: AILogResponse = - await AILogService.executeWithLogging(aiLogRequest); + await AIService.executeWithLogging(aiLogRequest); return Response.sendJsonObjectResponse(req, res, { postmortemNote: response.content, diff --git a/Common/Server/Services/AILogService.ts b/Common/Server/Services/AIService.ts similarity index 100% rename from Common/Server/Services/AILogService.ts rename to Common/Server/Services/AIService.ts From 28181465430ff8deceb323329cfd343bc0866669 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 10:33:04 +0000 Subject: [PATCH 26/46] feat: Introduce AILoader component for enhanced loading experience during AI content generation --- Common/UI/Components/AI/AILoader.tsx | 220 ++++++++++++++++++ .../UI/Components/AI/GenerateFromAIModal.tsx | 30 +-- 2 files changed, 226 insertions(+), 24 deletions(-) create mode 100644 Common/UI/Components/AI/AILoader.tsx diff --git a/Common/UI/Components/AI/AILoader.tsx b/Common/UI/Components/AI/AILoader.tsx new file mode 100644 index 0000000000..16def00980 --- /dev/null +++ b/Common/UI/Components/AI/AILoader.tsx @@ -0,0 +1,220 @@ +import React, { FunctionComponent, ReactElement, useEffect, useState } from "react"; +import Icon from "../Icon/Icon"; +import IconProp from "../../../Types/Icon/IconProp"; + +export interface AILoaderProps { + /** Optional title to display */ + title?: string; + /** Optional subtitle/description */ + subtitle?: string; + /** Data sources that AI is analyzing */ + dataSourceItems?: Array; + /** Whether to show data sources (can be toggled) */ + showDataSources?: boolean; +} + +interface LoadingStage { + label: string; + icon: IconProp; +} + +const loadingStages: Array = [ + { label: "Gathering context", icon: IconProp.Database }, + { label: "Analyzing data", icon: IconProp.Search }, + { label: "Generating content", icon: IconProp.Edit }, +]; + +const AILoader: FunctionComponent = ( + props: AILoaderProps, +): ReactElement => { + const [currentStageIndex, setCurrentStageIndex] = useState(0); + const [showSources, setShowSources] = useState(false); + + // Cycle through stages + useEffect(() => { + const interval: NodeJS.Timeout = setInterval(() => { + setCurrentStageIndex((prev: number) => { + return (prev + 1) % loadingStages.length; + }); + }, 2500); + + return () => { + clearInterval(interval); + }; + }, []); + + const currentStage: LoadingStage = loadingStages[currentStageIndex]!; + + return ( +
+ {/* Main AI animation container */} +
+ {/* Animated AI icon with pulse rings */} +
+ {/* Outer pulse rings */} +
+
+
+
+
+
+ + {/* Center icon container */} +
+
+ +
+ + {/* Sparkle effects */} +
+
+
+
+
+
+
+
+
+
+
+ + {/* Title */} +

+ {props.title || "AI is working"} +

+ + {/* Subtitle */} + {props.subtitle && ( +

+ {props.subtitle} +

+ )} + + {/* Current stage indicator */} +
+
+ +
+ + {currentStage.label} + + . + . + . + + +
+ + {/* Progress stages dots */} +
+ {loadingStages.map((_stage: LoadingStage, index: number) => { + const isActive: boolean = index === currentStageIndex; + const isPast: boolean = index < currentStageIndex; + + return ( +
+ ); + })} +
+ + {/* Data Sources Section */} + {props.dataSourceItems && props.dataSourceItems.length > 0 && ( +
+ {/* Toggle button */} + + + {/* Animated data sources */} +
+
+ {props.dataSourceItems.map((item: string, index: number) => { + return ( +
+
+ + {item} + +
+ ); + })} +
+
+
+ )} +
+ + {/* CSS for custom animation */} + +
+ ); +}; + +export default AILoader; diff --git a/Common/UI/Components/AI/GenerateFromAIModal.tsx b/Common/UI/Components/AI/GenerateFromAIModal.tsx index 27685998c5..6342d89114 100644 --- a/Common/UI/Components/AI/GenerateFromAIModal.tsx +++ b/Common/UI/Components/AI/GenerateFromAIModal.tsx @@ -1,6 +1,6 @@ import React, { FunctionComponent, ReactElement, useState } from "react"; import Modal, { ModalWidth } from "../Modal/Modal"; -import ComponentLoader from "../ComponentLoader/ComponentLoader"; +import AILoader from "./AILoader"; import ErrorMessage from "../ErrorMessage/ErrorMessage"; import BasicForm from "../Forms/BasicForm"; import FormFieldSchemaType from "../Forms/Types/FormFieldSchemaType"; @@ -148,29 +148,11 @@ const GenerateFromAIModal: FunctionComponent = ( {error && } {isGenerating && ( -
- -
-

Generating content with AI...

-

- This may take a moment depending on the amount of data. -

- {props.dataSourceItems && props.dataSourceItems.length > 0 && ( -
-

- Data sources being used: -

-
    - {props.dataSourceItems.map( - (item: string, index: number): ReactElement => { - return
  • {item}
  • ; - }, - )} -
-
- )} -
-
+ )} {!isGenerating && formFields.length > 0 && ( From 0563970eb6f8f18a5e6a1ab639146a5a46bd6d93 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 10:50:09 +0000 Subject: [PATCH 27/46] refactor: update package dependencies and tsconfig settings - Changed dependency from "@oneuptime/common" to a local file reference "Common". - Re-enabled experimental decorators in tsconfig.json. - Cleaned up tsconfig.json formatting for better readability. - Ensured strict type-checking options are clearly defined in tsconfig.json. --- MCP/package-lock.json | 9723 +---------------------------------------- MCP/package.json | 2 +- MCP/tsconfig.json | 51 +- 3 files changed, 256 insertions(+), 9520 deletions(-) diff --git a/MCP/package-lock.json b/MCP/package-lock.json index 6c32a650bf..45fd95f095 100644 --- a/MCP/package-lock.json +++ b/MCP/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^0.6.0", - "@oneuptime/common": "*", + "Common": "file:../Common", "dotenv": "^16.4.5", "ts-node": "^10.9.1" }, @@ -26,6 +26,141 @@ "typescript": "^5.8.3" } }, + "../Common": { + "name": "@oneuptime/common", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@asteasolutions/zod-to-openapi": "^7.3.2", + "@bull-board/express": "^5.21.4", + "@clickhouse/client": "^1.10.1", + "@elastic/elasticsearch": "^8.12.1", + "@hcaptcha/react-hcaptcha": "^1.14.0", + "@monaco-editor/react": "^4.4.6", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.206.0", + "@opentelemetry/context-zone": "^1.25.1", + "@opentelemetry/exporter-logs-otlp-http": "^0.207.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.207.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.207.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.207.0", + "@opentelemetry/id-generator-aws-xray": "^1.2.2", + "@opentelemetry/instrumentation": "^0.207.0", + "@opentelemetry/instrumentation-fetch": "^0.207.0", + "@opentelemetry/instrumentation-xml-http-request": "^0.207.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-logs": "^0.207.0", + "@opentelemetry/sdk-metrics": "^1.25.1", + "@opentelemetry/sdk-node": "^0.207.0", + "@opentelemetry/sdk-trace-web": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.37.0", + "@remixicon/react": "^4.2.0", + "@simplewebauthn/server": "^13.2.2", + "@tippyjs/react": "^4.2.6", + "@types/archiver": "^6.0.3", + "@types/crypto-js": "^4.2.2", + "@types/qrcode": "^1.5.5", + "@types/react-highlight": "^0.12.8", + "@types/react-syntax-highlighter": "^15.5.13", + "@types/uuid": "^8.3.4", + "@types/web-push": "^3.6.4", + "acme-client": "^5.3.0", + "airtable": "^0.12.2", + "archiver": "^7.0.1", + "axios": "^1.12.0", + "botbuilder": "^4.23.3", + "bullmq": "^5.61.0", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "cron-parser": "^4.8.1", + "crypto-js": "^4.2.0", + "dotenv": "^16.4.4", + "ejs": "^3.1.10", + "elkjs": "^0.10.0", + "esbuild": "^0.25.5", + "express": "^4.21.1", + "formik": "^2.4.6", + "history": "^5.3.0", + "ioredis": "^5.3.2", + "json2csv": "^5.0.7", + "json5": "^2.2.3", + "jsonwebtoken": "^9.0.0", + "jwt-decode": "^4.0.0", + "marked": "^12.0.2", + "moment": "^2.30.1", + "moment-timezone": "^0.5.45", + "node-cron": "^3.0.3", + "nodemailer": "^7.0.7", + "otpauth": "^9.3.1", + "pg": "^8.16.3", + "playwright": "^1.56.0", + "posthog-js": "^1.275.3", + "prop-types": "^15.8.1", + "qrcode": "^1.5.3", + "react": "^18.3.1", + "react-beautiful-dnd": "^13.1.1", + "react-big-calendar": "^1.19.4", + "react-color": "^2.19.3", + "react-dom": "^18.3.1", + "react-dropzone": "^14.2.2", + "react-error-boundary": "^4.0.13", + "react-highlight": "^0.15.0", + "react-markdown": "^8.0.3", + "react-router-dom": "^6.30.1", + "react-select": "^5.4.0", + "react-spinners": "^0.14.1", + "react-syntax-highlighter": "^16.0.0", + "react-toggle": "^4.1.3", + "reactflow": "^11.11.4", + "recharts": "^2.12.7", + "redis-semaphore": "^5.5.1", + "reflect-metadata": "^0.2.2", + "remark-gfm": "^3.0.1", + "slackify-markdown": "^4.4.0", + "slugify": "^1.6.5", + "socket.io": "^4.7.4", + "socket.io-client": "^4.7.5", + "stripe": "^10.17.0", + "tailwind-merge": "^2.6.0", + "tippy.js": "^6.3.7", + "twilio": "^4.22.0", + "typeorm": "^0.3.26", + "typeorm-extension": "^2.2.13", + "universal-cookie": "^7.2.1", + "use-async-effect": "^2.2.6", + "uuid": "^8.3.2", + "web-push": "^3.6.7", + "zod": "^3.25.76" + }, + "devDependencies": { + "@faker-js/faker": "^8.0.2", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^14.4.3", + "@types/cookie-parser": "^1.4.4", + "@types/cors": "^2.8.12", + "@types/ejs": "^3.1.1", + "@types/express": "^4.17.13", + "@types/jest": "^28.1.4", + "@types/json2csv": "^5.0.3", + "@types/jsonwebtoken": "^8.5.9", + "@types/node": "^17.0.45", + "@types/node-cron": "^3.0.7", + "@types/nodemailer": "^6.4.7", + "@types/react": "^18.2.38", + "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-big-calendar": "^1.8.5", + "@types/react-color": "^3.0.6", + "@types/react-test-renderer": "^18.0.0", + "@types/react-toggle": "^4.0.3", + "jest": "^28.1.1", + "jest-environment-jsdom": "^29.7.0", + "jest-mock-extended": "^3.0.5", + "react-test-renderer": "^18.2.0", + "sass": "^1.89.2", + "ts-jest": "^28.0.5" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "dev": true, @@ -38,222 +173,9 @@ "node": ">=6.0.0" } }, - "node_modules/@asteasolutions/zod-to-openapi": { - "version": "7.3.4", - "license": "MIT", - "dependencies": { - "openapi3-ts": "^4.1.2" - }, - "peerDependencies": { - "zod": "^3.20.2" - } - }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-util": "^1.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-client": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", - "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-http-compat": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.1.tgz", - "integrity": "sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-client": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.1.tgz", - "integrity": "sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/identity": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", - "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^4.2.0", - "@azure/msal-node": "^3.5.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/identity/node_modules/@azure/msal-common": { - "version": "15.13.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.1.tgz", - "integrity": "sha512-vQYQcG4J43UWgo1lj7LcmdsGUKWYo28RfEvDQAEMmQIMjSFufvb+pS0FJ3KXmrPmnWlt1vHDl3oip6mIDUQ4uA==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/identity/node_modules/@azure/msal-node": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.1.tgz", - "integrity": "sha512-HszfqoC+i2C9+BRDQfuNUGp15Re7menIhCEbFCQ49D3KaqEDrgZIgQ8zSct4T59jWeUIL9N/Dwiv4o2VueTdqQ==", - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.13.1", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", - "license": "MIT", - "dependencies": { - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/msal-browser": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.26.0.tgz", - "integrity": "sha512-Ie3SZ4IMrf9lSwWVzzJrhTPE+g9+QDUfeor1LKMBQzcblp+3J/U1G8hMpNSfLL7eA5F/DjjPXkATJ5JRUdDJLA==", - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.13.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": { - "version": "15.13.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.1.tgz", - "integrity": "sha512-vQYQcG4J43UWgo1lj7LcmdsGUKWYo28RfEvDQAEMmQIMjSFufvb+pS0FJ3KXmrPmnWlt1vHDl3oip6mIDUQ4uA==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.1.tgz", - "integrity": "sha512-nyxsA6NA4SVKh5YyRpbSXiMr7oQbwark7JU9LMeg6tJYTSPyAGkdx61wPT4gyxZfxlSxMMEyAsWaubBlNyIa1w==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.3.tgz", - "integrity": "sha512-CO+SE4weOsfJf+C5LM8argzvotrXw252/ZU6SM2Tz63fEblhH1uuVaaO4ISYFuN4Q6BhTo7I3qIdi8ydUQCqhw==", - "license": "MIT", - "dependencies": { - "@azure/msal-common": "14.16.1", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -276,6 +198,7 @@ "version": "7.27.7", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -308,6 +231,7 @@ }, "node_modules/@babel/generator": { "version": "7.27.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.27.5", @@ -337,6 +261,7 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -372,6 +297,7 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -379,6 +305,7 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -406,6 +333,7 @@ }, "node_modules/@babel/parser": { "version": "7.27.7", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.7" @@ -608,17 +536,9 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.27.2", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -631,6 +551,7 @@ }, "node_modules/@babel/traverse": { "version": "7.27.7", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -647,6 +568,7 @@ }, "node_modules/@babel/types": { "version": "7.27.7", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -661,47 +583,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@bull-board/api": { - "version": "5.23.0", - "license": "MIT", - "dependencies": { - "redis-info": "^3.0.8" - }, - "peerDependencies": { - "@bull-board/ui": "5.23.0" - } - }, - "node_modules/@bull-board/express": { - "version": "5.23.0", - "license": "MIT", - "dependencies": { - "@bull-board/api": "5.23.0", - "@bull-board/ui": "5.23.0", - "ejs": "^3.1.10", - "express": "^4.19.2" - } - }, - "node_modules/@bull-board/ui": { - "version": "5.23.0", - "license": "MIT", - "dependencies": { - "@bull-board/api": "5.23.0" - } - }, - "node_modules/@clickhouse/client": { - "version": "1.12.0", - "license": "Apache-2.0", - "dependencies": { - "@clickhouse/client-common": "1.12.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@clickhouse/client-common": { - "version": "1.12.0", - "license": "Apache-2.0" - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "license": "MIT", @@ -720,343 +601,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@elastic/elasticsearch": { - "version": "8.18.2", - "license": "Apache-2.0", - "dependencies": { - "@elastic/transport": "^8.9.6", - "apache-arrow": "18.x - 19.x", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@elastic/transport": { - "version": "8.10.0", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "1.x", - "@opentelemetry/core": "2.x", - "debug": "^4.4.1", - "hpagent": "^1.2.0", - "ms": "^2.1.3", - "secure-json-parse": "^3.0.1", - "tslib": "^2.8.1", - "undici": "^6.21.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "license": "MIT" - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.14.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.2", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.2", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.2", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "license": "MIT" - }, - "node_modules/@grpc/grpc-js": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.1.tgz", - "integrity": "sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.8.0", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.5.3", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@hcaptcha/loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@hcaptcha/loader/-/loader-2.3.0.tgz", - "integrity": "sha512-i4lnNxKBe+COf3R1nFZEWaZoHIoJjvDgWqvcNrdZq8ehoSNMN6KVZ56dcQ02qKie2h3+BkbkwlJA9DOIuLlK/g==", - "license": "MIT" - }, - "node_modules/@hcaptcha/react-hcaptcha": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@hcaptcha/react-hcaptcha/-/react-hcaptcha-1.16.0.tgz", - "integrity": "sha512-ALRsAwQDCtGeR9QXrLjf7IQsWlaIg1dQWpPYdBR03KHkUrLgRjmqLKkOXaq8L+0qcicXRasHRuvXp2Vinun9aw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.9", - "@hcaptcha/loader": "^2.3.0" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, - "node_modules/@hexagon/base64": { - "version": "1.1.28", - "resolved": "https://registry.npmjs.org/@hexagon/base64/-/base64-1.1.28.tgz", - "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==", - "license": "MIT" - }, - "node_modules/@icons/material": { - "version": "0.2.4", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", - "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "dev": true, @@ -1377,6 +921,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -1396,6 +941,7 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1407,28 +953,13 @@ }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@levischuck/tiny-cbor": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@levischuck/tiny-cbor/-/tiny-cbor-0.2.11.tgz", - "integrity": "sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==", - "license": "MIT" - }, "node_modules/@modelcontextprotocol/sdk": { "version": "0.6.1", "license": "MIT", @@ -1438,1684 +969,6 @@ "zod": "^3.23.8" } }, - "node_modules/@monaco-editor/loader": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "state-local": "^1.0.6" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.7.0", - "license": "MIT", - "dependencies": { - "@monaco-editor/loader": "^1.5.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@noble/hashes": { - "version": "1.7.1", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oneuptime/common": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@oneuptime/common/-/common-9.1.1.tgz", - "integrity": "sha512-+HkW7m6xQ/T8yEpVl9XfEhlpR1WLkKiuYEE7yAxBhIWiINVBbIoHBE7CzLwaXilbyGkEb5EL/5AFCMmGXK2eLA==", - "license": "Apache-2.0", - "dependencies": { - "@asteasolutions/zod-to-openapi": "^7.3.2", - "@bull-board/express": "^5.21.4", - "@clickhouse/client": "^1.10.1", - "@elastic/elasticsearch": "^8.12.1", - "@hcaptcha/react-hcaptcha": "^1.14.0", - "@monaco-editor/react": "^4.4.6", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.206.0", - "@opentelemetry/context-zone": "^1.25.1", - "@opentelemetry/exporter-logs-otlp-http": "^0.207.0", - "@opentelemetry/exporter-metrics-otlp-proto": "^0.207.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.207.0", - "@opentelemetry/exporter-trace-otlp-proto": "^0.207.0", - "@opentelemetry/id-generator-aws-xray": "^1.2.2", - "@opentelemetry/instrumentation": "^0.207.0", - "@opentelemetry/instrumentation-fetch": "^0.207.0", - "@opentelemetry/instrumentation-xml-http-request": "^0.207.0", - "@opentelemetry/resources": "^1.25.1", - "@opentelemetry/sdk-logs": "^0.207.0", - "@opentelemetry/sdk-metrics": "^1.25.1", - "@opentelemetry/sdk-node": "^0.207.0", - "@opentelemetry/sdk-trace-web": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.37.0", - "@remixicon/react": "^4.2.0", - "@simplewebauthn/server": "^13.2.2", - "@tippyjs/react": "^4.2.6", - "@types/archiver": "^6.0.3", - "@types/crypto-js": "^4.2.2", - "@types/qrcode": "^1.5.5", - "@types/react-highlight": "^0.12.8", - "@types/react-syntax-highlighter": "^15.5.13", - "@types/uuid": "^8.3.4", - "@types/web-push": "^3.6.4", - "acme-client": "^5.3.0", - "airtable": "^0.12.2", - "archiver": "^7.0.1", - "axios": "^1.12.0", - "botbuilder": "^4.23.3", - "bullmq": "^5.61.0", - "cookie-parser": "^1.4.7", - "cors": "^2.8.5", - "cron-parser": "^4.8.1", - "crypto-js": "^4.2.0", - "dotenv": "^16.4.4", - "ejs": "^3.1.10", - "elkjs": "^0.10.0", - "esbuild": "^0.25.5", - "express": "^4.21.1", - "formik": "^2.4.6", - "history": "^5.3.0", - "ioredis": "^5.3.2", - "json2csv": "^5.0.7", - "json5": "^2.2.3", - "jsonwebtoken": "^9.0.0", - "jwt-decode": "^4.0.0", - "marked": "^12.0.2", - "moment": "^2.30.1", - "moment-timezone": "^0.5.45", - "node-cron": "^3.0.3", - "nodemailer": "^7.0.7", - "otpauth": "^9.3.1", - "pg": "^8.16.3", - "playwright": "^1.56.0", - "posthog-js": "^1.275.3", - "prop-types": "^15.8.1", - "qrcode": "^1.5.3", - "react": "^18.3.1", - "react-beautiful-dnd": "^13.1.1", - "react-big-calendar": "^1.19.4", - "react-color": "^2.19.3", - "react-dom": "^18.3.1", - "react-dropzone": "^14.2.2", - "react-error-boundary": "^4.0.13", - "react-highlight": "^0.15.0", - "react-markdown": "^8.0.3", - "react-router-dom": "^6.30.1", - "react-select": "^5.4.0", - "react-spinners": "^0.14.1", - "react-syntax-highlighter": "^16.0.0", - "react-toggle": "^4.1.3", - "reactflow": "^11.11.4", - "recharts": "^2.12.7", - "redis-semaphore": "^5.5.1", - "reflect-metadata": "^0.2.2", - "remark-gfm": "^3.0.1", - "slackify-markdown": "^4.4.0", - "slugify": "^1.6.5", - "socket.io": "^4.7.4", - "socket.io-client": "^4.7.5", - "stripe": "^10.17.0", - "tailwind-merge": "^2.6.0", - "tippy.js": "^6.3.7", - "twilio": "^4.22.0", - "typeorm": "^0.3.26", - "typeorm-extension": "^2.2.13", - "universal-cookie": "^7.2.1", - "use-async-effect": "^2.2.6", - "uuid": "^8.3.2", - "web-push": "^3.6.7", - "zod": "^3.25.76" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.206.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.206.0.tgz", - "integrity": "sha512-yIVDu9jX//nV5wSMLZLdHdb1SKHIMj9k+wQVFtln5Flcgdldz9BkHtavvExQiJqBZg2OpEEJEZmzQazYztdz2A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz", - "integrity": "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==", - "license": "Apache-2.0", - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/context-zone": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/context-zone-peer-dep": "1.30.1", - "zone.js": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/context-zone-peer-dep": { - "version": "1.30.1", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0", - "zone.js": "^0.10.2 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", - "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.207.0.tgz", - "integrity": "sha512-K92RN+kQGTMzFDsCzsYNGqOsXRUnko/Ckk+t/yPJao72MewOLgBUTWVHhebgkNfRCYqDz1v3K0aPT9OJkemvgg==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/sdk-logs": "0.207.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.207.0.tgz", - "integrity": "sha512-JpOh7MguEUls8eRfkVVW3yRhClo5b9LqwWTOg8+i4gjr/+8eiCtquJnC7whvpTIGyff06cLZ2NsEj+CVP3Mjeg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.207.0", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/sdk-logs": "0.207.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz", - "integrity": "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.207.0.tgz", - "integrity": "sha512-RQJEV/K6KPbQrIUbsrRkEe0ufks1o5OGLHy6jbDD8tRjeCsbFHWfg99lYBRqBV33PYZJXsigqMaAbjWGTFYzLw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.207.0", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-logs": "0.207.0", - "@opentelemetry/sdk-trace-base": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/api-logs": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz", - "integrity": "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.207.0.tgz", - "integrity": "sha512-6flX89W54gkwmqYShdcTBR1AEF5C1Ob0O8pDgmLPikTKyEv27lByr9yBmO5WrP0+5qJuNPHrLfgFQFYi6npDGA==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/exporter-metrics-otlp-http": "0.207.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-metrics": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", - "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.207.0.tgz", - "integrity": "sha512-fG8FAJmvXOrKXGIRN8+y41U41IfVXxPRVwyB05LoMqYSjugx/FSBkMZUZXUT/wclTdmBKtS5MKoi0bEKkmRhSw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-metrics": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", - "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.207.0.tgz", - "integrity": "sha512-kDBxiTeQjaRlUQzS1COT9ic+et174toZH6jxaVuVAvGqmxOkgjpLOjrI5ff8SMMQE69r03L3Ll3nPKekLopLwg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/exporter-metrics-otlp-http": "0.207.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-metrics": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", - "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.207.0.tgz", - "integrity": "sha512-Y5p1s39FvIRmU+F1++j7ly8/KSqhMmn6cMfpQqiDCqDjdDHwUtSq0XI0WwL3HYGnZeaR/VV4BNmsYQJ7GAPrhw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-metrics": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", - "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.207.0.tgz", - "integrity": "sha512-7u2ZmcIx6D4KG/+5np4X2qA0o+O0K8cnUDhR4WI/vr5ZZ0la9J9RG+tkSjC7Yz+2XgL6760gSIM7/nyd3yaBLA==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.207.0.tgz", - "integrity": "sha512-HSRBzXHIC7C8UfPQdu15zEEoBGv0yWkhEwxqgPCHVUKUQ9NLHVGXkVrf65Uaj7UwmAkC1gQfkuVYvLlD//AnUQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.207.0.tgz", - "integrity": "sha512-ruUQB4FkWtxHjNmSXjrhmJZFvyMm+tBzHyMm7YPQshApy4wvZUTcrpPyP/A/rCl/8M4BwoVIZdiwijMdbZaq4w==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.2.0.tgz", - "integrity": "sha512-VV4QzhGCT7cWrGasBWxelBjqbNBbyHicWWS/66KoZoe9BzYwFB72SH2/kkc4uAviQlO8iwv2okIJy+/jqqEHTg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/id-generator-aws-xray": { - "version": "1.2.3", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/id-generator-aws-xray/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/id-generator-aws-xray/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.207.0.tgz", - "integrity": "sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.207.0", - "import-in-the-middle": "^2.0.0", - "require-in-the-middle": "^8.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fetch": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.207.0.tgz", - "integrity": "sha512-Urqh7w/KIGNYeaRf5Ba9FdJYCUF/g8RpiyywsMRc8sTK6hyQsn2p2vh+MzUQacQ7vZPzBc2u1l2034sIMhvGzA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/instrumentation": "0.207.0", - "@opentelemetry/sdk-trace-web": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/sdk-trace-web": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-2.2.0.tgz", - "integrity": "sha512-x/LHsDBO3kfqaFx5qSzBljJ5QHsRXrvS4MybBDy1k7Svidb8ZyIPudWVzj3s5LpPkYZIgi9e+7tdsNCnptoelw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-xml-http-request": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-xml-http-request/-/instrumentation-xml-http-request-0.207.0.tgz", - "integrity": "sha512-XfAY+JVe4ncrANIkweKZfUWpseKJC1UhPME0POSC7pULQQlpUGsT9vJGsULYtXdTQOS8sXKu8p8Q5KTzWG+cuQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/instrumentation": "0.207.0", - "@opentelemetry/sdk-trace-web": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/sdk-trace-web": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-2.2.0.tgz", - "integrity": "sha512-x/LHsDBO3kfqaFx5qSzBljJ5QHsRXrvS4MybBDy1k7Svidb8ZyIPudWVzj3s5LpPkYZIgi9e+7tdsNCnptoelw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-logs": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz", - "integrity": "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.207.0.tgz", - "integrity": "sha512-4RQluMVVGMrHok/3SVeSJ6EnRNkA2MINcX88sh+d/7DjGUrewW/WT88IsMEci0wUM+5ykTpPPNbEOoW+jwHnbw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-transformer": "0.207.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.207.0.tgz", - "integrity": "sha512-eKFjKNdsPed4q9yYqeI5gBTLjXxDM/8jwhiC0icw3zKxHVGBySoDsed5J5q/PGY/3quzenTr3FiTxA3NiNT+nw==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/otlp-exporter-base": "0.207.0", - "@opentelemetry/otlp-transformer": "0.207.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.207.0.tgz", - "integrity": "sha512-+6DRZLqM02uTIY5GASMZWUwr52sLfNiEe20+OEaZKhztCs3+2LxoTjb6JxFRd9q1qNqckXKYlUKjbH/AhG8/ZA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.207.0", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-logs": "0.207.0", - "@opentelemetry/sdk-metrics": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0", - "protobufjs": "^7.3.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/api-logs": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz", - "integrity": "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", - "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.2.0.tgz", - "integrity": "sha512-9CrbTLFi5Ee4uepxg2qlpQIozoJuoAZU5sKMx0Mn7Oh+p7UrgCiEV6C02FOxxdYVRRFQVCinYR8Kf6eMSQsIsw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.2.0.tgz", - "integrity": "sha512-FfeOHOrdhiNzecoB1jZKp2fybqmqMPJUXe2ZOydP7QzmTPYcfPeuaclTLYVhK3HyJf71kt8sTl92nV4YIaLaKA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.207.0.tgz", - "integrity": "sha512-4MEQmn04y+WFe6cyzdrXf58hZxilvY59lzZj2AccuHW/+BxLn/rGVN/Irsi/F0qfBOpMOrrCLKTExoSL2zoQmg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.207.0", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/api-logs": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz", - "integrity": "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-node": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.207.0.tgz", - "integrity": "sha512-hnRsX/M8uj0WaXOBvFenQ8XsE8FLVh2uSnn1rkWu4mx+qu7EKGUZvZng6y/95cyzsqOfiaDDr08Ek4jppkIDNg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.207.0", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/exporter-logs-otlp-grpc": "0.207.0", - "@opentelemetry/exporter-logs-otlp-http": "0.207.0", - "@opentelemetry/exporter-logs-otlp-proto": "0.207.0", - "@opentelemetry/exporter-metrics-otlp-grpc": "0.207.0", - "@opentelemetry/exporter-metrics-otlp-http": "0.207.0", - "@opentelemetry/exporter-metrics-otlp-proto": "0.207.0", - "@opentelemetry/exporter-prometheus": "0.207.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.207.0", - "@opentelemetry/exporter-trace-otlp-http": "0.207.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.207.0", - "@opentelemetry/exporter-zipkin": "2.2.0", - "@opentelemetry/instrumentation": "0.207.0", - "@opentelemetry/propagator-b3": "2.2.0", - "@opentelemetry/propagator-jaeger": "2.2.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/sdk-logs": "0.207.0", - "@opentelemetry/sdk-metrics": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0", - "@opentelemetry/sdk-trace-node": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz", - "integrity": "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", - "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", - "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/resources": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.2.0.tgz", - "integrity": "sha512-+OaRja3f0IqGG2kptVeYsrZQK9nKRSpfFrKtRBq4uh6nIB8bTBgaGvYQrQoRrQWQMA5dK5yLhDMDc0dvYvCOIQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/context-async-hooks": "2.2.0", - "@opentelemetry/core": "2.2.0", - "@opentelemetry/sdk-trace-base": "2.2.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-web": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-web/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-web/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.30.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-web/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", - "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@peculiar/asn1-android": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-android/-/asn1-android-2.5.0.tgz", - "integrity": "sha512-t8A83hgghWQkcneRsgGs2ebAlRe54ns88p7ouv8PW2tzF1nAW4yHcL4uZKrFpIU+uszIRzTkcCuie37gpkId0A==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.5.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "@peculiar/asn1-x509-attr": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.4.0", - "@peculiar/asn1-pkcs8": "^2.4.0", - "@peculiar/asn1-rsa": "^2.4.0", - "@peculiar/asn1-schema": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.4.0", - "@peculiar/asn1-pfx": "^2.4.0", - "@peculiar/asn1-pkcs8": "^2.4.0", - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "@peculiar/asn1-x509-attr": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.5.0.tgz", - "integrity": "sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==", - "license": "MIT", - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.4.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/x509": { - "version": "1.13.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.3.15", - "@peculiar/asn1-csr": "^2.3.15", - "@peculiar/asn1-ecc": "^2.3.15", - "@peculiar/asn1-pkcs9": "^2.3.15", - "@peculiar/asn1-rsa": "^2.3.15", - "@peculiar/asn1-schema": "^2.3.15", - "@peculiar/asn1-x509": "^2.3.15", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@posthog/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.5.2.tgz", - "integrity": "sha512-iedUP3EnOPPxTA2VaIrsrd29lSZnUV+ZrMnvY56timRVeZAXoYCkmjfIs3KBAsF8OUT5h1GXLSkoQdrV0r31OQ==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@reactflow/background": { - "version": "11.3.14", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/controls": { - "version": "11.2.14", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/core": { - "version": "11.11.4", - "license": "MIT", - "dependencies": { - "@types/d3": "^7.4.0", - "@types/d3-drag": "^3.0.1", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/minimap": { - "version": "11.7.14", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-resizer": { - "version": "2.2.14", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.4", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-toolbar": { - "version": "1.3.14", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@remix-run/router": { - "version": "1.23.0", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@remixicon/react": { - "version": "4.6.0", - "license": "Apache-2.0", - "peerDependencies": { - "react": ">=18.2.0" - } - }, - "node_modules/@restart/hooks": { - "version": "0.4.16", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@simplewebauthn/server": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@simplewebauthn/server/-/server-13.2.2.tgz", - "integrity": "sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==", - "license": "MIT", - "dependencies": { - "@hexagon/base64": "^1.1.27", - "@levischuck/tiny-cbor": "^0.2.2", - "@peculiar/asn1-android": "^2.3.10", - "@peculiar/asn1-ecc": "^2.3.8", - "@peculiar/asn1-rsa": "^2.3.8", - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/asn1-x509": "^2.3.8", - "@peculiar/x509": "^1.13.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@sinclair/typebox": { "version": "0.24.51", "dev": true, @@ -3137,32 +990,6 @@ "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/@sqltools/formatter": { - "version": "1.2.5", - "license": "MIT" - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tippyjs/react": { - "version": "4.2.6", - "license": "MIT", - "dependencies": { - "tippy.js": "^6.3.1" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "license": "MIT" @@ -3179,15 +1006,6 @@ "version": "1.0.4", "license": "MIT" }, - "node_modules/@types/archiver": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.4.tgz", - "integrity": "sha512-ULdQpARQ3sz9WH4nb98mJDYA0ft2A8C4f4fovvUcFwINa1cgGjY36JCAYuP5YypRq4mco1lJp1/7jEMS2oR0Hg==", - "license": "MIT", - "dependencies": { - "@types/readdir-glob": "*" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "dev": true, @@ -3225,231 +1043,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/command-line-args": { - "version": "5.2.3", - "license": "MIT" - }, - "node_modules/@types/command-line-usage": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/crypto-js": { - "version": "4.2.2", - "license": "MIT" - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "license": "MIT" - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "dev": true, @@ -3458,23 +1051,6 @@ "@types/node": "*" } }, - "node_modules/@types/hast": { - "version": "2.3.10", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.7", - "license": "MIT", - "dependencies": { - "hoist-non-react-statics": "^3.3.0" - }, - "peerDependencies": { - "@types/react": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "dev": true, @@ -3505,136 +1081,21 @@ "pretty-format": "^27.0.0" } }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "license": "MIT" - }, "node_modules/@types/node": { "version": "17.0.45", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/prettier": { "version": "2.7.3", "dev": true, "license": "MIT" }, - "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==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "license": "MIT" - }, - "node_modules/@types/qrcode": { - "version": "1.5.5", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/react": { - "version": "19.1.8", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-highlight": { - "version": "0.12.8", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-redux": { - "version": "7.1.34", - "license": "MIT", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "node_modules/@types/react-syntax-highlighter": { - "version": "15.5.13", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/readdir-glob": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", - "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "dev": true, "license": "MIT" }, - "node_modules/@types/unist": { - "version": "2.0.11", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "license": "MIT" - }, - "node_modules/@types/warning": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/@types/web-push": { - "version": "3.6.4", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { "version": "17.0.33", "dev": true, @@ -3648,84 +1109,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.1.tgz", - "integrity": "sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==", - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@typespec/ts-http-runtime/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@typespec/ts-http-runtime/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.8", - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acme-client": { - "version": "5.4.0", - "license": "MIT", - "dependencies": { - "@peculiar/x509": "^1.11.0", - "asn1js": "^3.0.5", - "axios": "^1.7.2", - "debug": "^4.3.5", - "node-forge": "^1.3.1" - }, - "engines": { - "node": ">= 16" - } - }, "node_modules/acorn": { "version": "8.15.0", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3733,15 +1120,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-walk": { "version": "8.3.4", "license": "MIT", @@ -3752,40 +1130,6 @@ "node": ">=0.4.0" } }, - "node_modules/adaptivecards": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.2.3.tgz", - "integrity": "sha512-amQ5OSW3OpIkrxVKLjxVBPk/T49yuOtnqs1z5ZPfZr0+OpTovzmiHbyoAGDIsu5SNYHwOZFp/3LGOnRaALFa/g==", - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/airtable": { - "version": "0.12.2", - "license": "MIT", - "dependencies": { - "@types/node": ">=8.0.0 <15", - "abort-controller": "^3.0.0", - "abortcontroller-polyfill": "^1.4.0", - "lodash": "^4.17.21", - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/airtable/node_modules/@types/node": { - "version": "14.18.63", - "license": "MIT" - }, "node_modules/ansi-escapes": { "version": "4.3.2", "dev": true, @@ -3802,6 +1146,7 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3809,6 +1154,7 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3820,13 +1166,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansis": { - "version": "3.17.0", - "license": "ISC", - "engines": { - "node": ">=14" - } - }, "node_modules/anymatch": { "version": "3.1.3", "dev": true, @@ -3839,118 +1178,6 @@ "node": ">= 8" } }, - "node_modules/apache-arrow": { - "version": "19.0.1", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.11", - "@types/command-line-args": "^5.2.3", - "@types/command-line-usage": "^5.0.4", - "@types/node": "^20.13.0", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.1", - "flatbuffers": "^24.3.25", - "json-bignum": "^0.0.3", - "tslib": "^2.6.2" - }, - "bin": { - "arrow2csv": "bin/arrow2csv.js" - } - }, - "node_modules/apache-arrow/node_modules/@types/node": { - "version": "20.19.9", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/app-root-path": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils/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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/arg": { "version": "4.1.3", "license": "MIT" @@ -3963,78 +1190,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/array-back": { - "version": "6.2.2", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1js": { - "version": "3.0.6", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/async": { - "version": "3.2.6", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/attr-accept": { - "version": "2.2.5", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/babel-jest": { "version": "28.1.3", "dev": true, @@ -4084,19 +1239,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", "dev": true, @@ -4137,66 +1279,11 @@ "@babel/core": "^7.0.0" } }, - "node_modules/bail": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/balanced-match": { "version": "1.0.2", + "dev": true, "license": "MIT" }, - "node_modules/bare-events": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.1.tgz", - "integrity": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "dev": true, @@ -4208,268 +1295,9 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/body-parser/node_modules/raw-body": { - "version": "2.5.2", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/botbuilder": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/botbuilder/-/botbuilder-4.23.3.tgz", - "integrity": "sha512-1gDIQHHYosYBHGXMjvZEJDrcp3NGy3lzHBml5wn9PFqVuIk/cbsCDZs3KJ3g+aH/GGh4CH/ij9iQ2KbQYHAYKA==", - "license": "MIT", - "dependencies": { - "@azure/core-rest-pipeline": "^1.18.1", - "@azure/msal-node": "^2.13.1", - "axios": "^1.8.2", - "botbuilder-core": "4.23.3", - "botbuilder-stdlib": "4.23.3-internal", - "botframework-connector": "4.23.3", - "botframework-schema": "4.23.3", - "botframework-streaming": "4.23.3", - "dayjs": "^1.11.13", - "filenamify": "^6.0.0", - "fs-extra": "^11.2.0", - "htmlparser2": "^9.0.1", - "uuid": "^10.0.0", - "zod": "^3.23.8" - } - }, - "node_modules/botbuilder-core": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/botbuilder-core/-/botbuilder-core-4.23.3.tgz", - "integrity": "sha512-48iW739I24piBH683b/Unvlu1fSzjB69ViOwZ0PbTkN2yW5cTvHJWlW7bXntO8GSqJfssgPaVthKfyaCW457ig==", - "license": "MIT", - "dependencies": { - "botbuilder-dialogs-adaptive-runtime-core": "4.23.3-preview", - "botbuilder-stdlib": "4.23.3-internal", - "botframework-connector": "4.23.3", - "botframework-schema": "4.23.3", - "uuid": "^10.0.0", - "zod": "^3.23.8" - } - }, - "node_modules/botbuilder-core/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/botbuilder-dialogs-adaptive-runtime-core": { - "version": "4.23.3-preview", - "resolved": "https://registry.npmjs.org/botbuilder-dialogs-adaptive-runtime-core/-/botbuilder-dialogs-adaptive-runtime-core-4.23.3-preview.tgz", - "integrity": "sha512-EssyvqK9MobX3gbnUe/jjhLuxpCEeyQeQsyUFMJ236U6vzSQdrAxNH7Jc5DyZw2KKelBdK1xPBdwTYQNM5S0Qw==", - "license": "MIT", - "dependencies": { - "dependency-graph": "^1.0.0" - } - }, - "node_modules/botbuilder-stdlib": { - "version": "4.23.3-internal", - "resolved": "https://registry.npmjs.org/botbuilder-stdlib/-/botbuilder-stdlib-4.23.3-internal.tgz", - "integrity": "sha512-fwvIHnKU8sXo1gTww+m/k8wnuM5ktVBAV/3vWJ+ou40zapy1HYjWQuu6sVCRFgMUngpKwhdmoOQsTXsp58SNtA==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-http-compat": "^2.1.2", - "@azure/core-rest-pipeline": "^1.18.1", - "@azure/core-tracing": "^1.2.0" - } - }, - "node_modules/botbuilder/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/botframework-connector": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/botframework-connector/-/botframework-connector-4.23.3.tgz", - "integrity": "sha512-sChwCFJr3xhcMCYChaOxJoE8/YgdjOPWzGwz5JAxZDwhbQonwYX5O/6Z9EA+wB3TCFNEh642SGeC/rOitaTnGQ==", - "license": "MIT", - "dependencies": { - "@azure/core-rest-pipeline": "^1.18.1", - "@azure/identity": "^4.4.1", - "@azure/msal-node": "^2.13.1", - "@types/jsonwebtoken": "9.0.6", - "axios": "^1.8.2", - "base64url": "^3.0.0", - "botbuilder-stdlib": "4.23.3-internal", - "botframework-schema": "4.23.3", - "buffer": "^6.0.3", - "cross-fetch": "^4.0.0", - "https-proxy-agent": "^7.0.5", - "jsonwebtoken": "^9.0.2", - "node-fetch": "^2.7.0", - "openssl-wrapper": "^0.3.4", - "rsa-pem-from-mod-exp": "^0.8.6", - "zod": "^3.23.8" - } - }, - "node_modules/botframework-connector/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/botframework-connector/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/botframework-schema": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/botframework-schema/-/botframework-schema-4.23.3.tgz", - "integrity": "sha512-/W0uWxZ3fuPLAImZRLnPTbs49Z2xMpJSIzIBxSfvwO0aqv9GsM3bTk3zlNdJ1xr40SshQ7WiH2H1hgjBALwYJw==", - "license": "MIT", - "dependencies": { - "adaptivecards": "1.2.3", - "uuid": "^10.0.0", - "zod": "^3.23.8" - } - }, - "node_modules/botframework-schema/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/botframework-streaming": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/botframework-streaming/-/botframework-streaming-4.23.3.tgz", - "integrity": "sha512-GMtciQGfZXtAW6syUqFpFJQ2vDyVbpxL3T1DqFzq/GmmkAu7KTZ1zvo7PTww6+IT1kMW0lmL/XZJVq3Rhg4PQA==", - "license": "MIT", - "dependencies": { - "@types/ws": "^6.0.3", - "uuid": "^10.0.0", - "ws": "^7.5.10" - } - }, - "node_modules/botframework-streaming/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/botframework-streaming/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/brace-expansion": { "version": "1.1.12", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -4478,6 +1306,7 @@ }, "node_modules/braces": { "version": "3.0.3", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -4504,6 +1333,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -4536,101 +1366,11 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "license": "BSD-3-Clause" - }, "node_modules/buffer-from": { "version": "1.1.2", "dev": true, "license": "MIT" }, - "node_modules/bullmq": { - "version": "5.63.2", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.63.2.tgz", - "integrity": "sha512-c1K5gcAh0a+C9lcRXaA1GePDYtmUywCH1pNXkUlZ8lFlqQnrtKyZpcr5aZJcjyZVx6y7t5259ru+ttJFNUQ5kw==", - "license": "MIT", - "dependencies": { - "cron-parser": "^4.9.0", - "ioredis": "^5.8.2", - "msgpackr": "^1.11.2", - "node-abort-controller": "^3.1.1", - "semver": "^7.5.4", - "tslib": "^2.0.0", - "uuid": "^11.1.0" - } - }, - "node_modules/bullmq/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/bullmq/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bytes": { "version": "3.1.2", "license": "MIT", @@ -4638,49 +1378,9 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4688,6 +1388,7 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4712,16 +1413,9 @@ ], "license": "CC-BY-4.0" }, - "node_modules/ccount": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chalk": { "version": "4.1.2", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4734,19 +1428,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk-template": { - "version": "0.4.0", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, "node_modules/char-regex": { "version": "1.0.2", "dev": true, @@ -4755,30 +1436,6 @@ "node": ">=10" } }, - "node_modules/character-entities": { - "version": "1.2.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chokidar": { "version": "3.6.0", "dev": true, @@ -4818,18 +1475,12 @@ }, "node_modules/cjs-module-lexer": { "version": "1.4.3", - "license": "MIT" - }, - "node_modules/classcat": { - "version": "5.0.5", - "license": "MIT" - }, - "node_modules/classnames": { - "version": "2.5.1", + "dev": true, "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -4840,20 +1491,6 @@ "node": ">=12" } }, - "node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/co": { "version": "4.6.0", "dev": true, @@ -4870,6 +1507,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4880,97 +1518,18 @@ }, "node_modules/color-name": { "version": "1.1.4", + "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/command-line-args": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "find-replace": "^5.0.2", - "lodash.camelcase": "^4.3.0", - "typical": "^7.2.0" - }, - "engines": { - "node": ">=12.20" - }, - "peerDependencies": { - "@75lb/nature": "latest" - }, - "peerDependenciesMeta": { - "@75lb/nature": { - "optional": true - } - } - }, - "node_modules/command-line-usage": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^4.1.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } + "node_modules/Common": { + "resolved": "../Common", + "link": true }, "node_modules/concat-map": { "version": "0.0.1", + "dev": true, "license": "MIT" }, - "node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/content-type": { "version": "1.0.5", "license": "MIT", @@ -4980,131 +1539,16 @@ }, "node_modules/convert-source-map": { "version": "1.9.0", + "dev": true, "license": "MIT" }, - "node_modules/cookie": { - "version": "0.7.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.7", - "license": "MIT", - "dependencies": { - "cookie": "0.7.2", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/core-js": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", - "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/create-require": { "version": "1.1.1", "license": "MIT" }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "license": "MIT", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -5115,186 +1559,9 @@ "node": ">= 8" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/css-box-model": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "tiny-invariant": "^1.0.6" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "3.2.4", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/date-arithmetic": { - "version": "4.1.0", - "license": "MIT" - }, - "node_modules/dayjs": { - "version": "1.11.13", - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.1", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5308,36 +1575,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "license": "MIT" - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decode-named-character-reference/node_modules/character-entities": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/dedent": { "version": "0.7.0", "dev": true, @@ -5351,75 +1588,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "2.0.0", "license": "MIT", @@ -5427,44 +1595,6 @@ "node": ">= 0.8" } }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "dev": true, @@ -5488,73 +1618,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/dijkstrajs": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/dotenv": { "version": "16.6.0", "license": "BSD-2-Clause", @@ -5565,61 +1628,11 @@ "url": "https://dotenvx.com" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/ebec": { - "version": "2.3.0", - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.177", "dev": true, "license": "ISC" }, - "node_modules/elkjs": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.10.2.tgz", - "integrity": "sha512-Yx3ORtbAFrXelYkAy2g0eYyVY8QG0XEmGdQXmy0eithKKjbWRfl3Xe884lfkszfBF6UKyIy4LwfcZ3AZc8oxFw==", - "license": "EPL-2.0" - }, "node_modules/emittery": { "version": "0.10.2", "dev": true, @@ -5633,187 +1646,25 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { - "version": "6.6.4", - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.6.3", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/error-ex": { "version": "1.3.2", + "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.8", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" - } - }, "node_modules/escalade": { "version": "3.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "2.0.0", "dev": true, @@ -5834,42 +1685,6 @@ "node": ">=4" } }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, "node_modules/execa": { "version": "5.1.1", "dev": true, @@ -5980,134 +1795,11 @@ "dev": true, "license": "MIT" }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/fast-equals": { - "version": "5.2.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "dev": true, "license": "MIT" }, - "node_modules/fastq": { - "version": "1.19.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/fb-watchman": { "version": "2.0.2", "dev": true, @@ -6116,75 +1808,9 @@ "bser": "2.1.1" } }, - "node_modules/fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", - "license": "MIT" - }, - "node_modules/file-selector": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.7.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filename-reserved-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", - "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/filenamify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-6.0.0.tgz", - "integrity": "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==", - "license": "MIT", - "dependencies": { - "filename-reserved-regex": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/fill-range": { "version": "7.1.1", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -6193,54 +1819,9 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/find-replace": { - "version": "5.0.2", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@75lb/nature": "latest" - }, - "peerDependenciesMeta": { - "@75lb/nature": { - "optional": true - } - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, "node_modules/find-up": { "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -6250,152 +1831,6 @@ "node": ">=8" } }, - "node_modules/flat": { - "version": "5.0.2", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flatbuffers": { - "version": "24.12.23", - "license": "Apache-2.0" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/formik": { - "version": "2.4.6", - "funding": [ - { - "type": "individual", - "url": "https://opencollective.com/formik" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.1", - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/formik/node_modules/deepmerge": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -6403,6 +1838,7 @@ }, "node_modules/fsevents": { "version": "2.3.2", + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6414,6 +1850,7 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6429,33 +1866,12 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "dev": true, @@ -6464,17 +1880,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "dev": true, @@ -6507,6 +1912,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6515,72 +1921,30 @@ "node": ">= 6" } }, - "node_modules/globalize": { - "version": "0.1.1" - }, "node_modules/globals": { "version": "11.12.0", + "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", + "dev": true, "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6589,141 +1953,11 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector/node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-whitespace": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript/node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hastscript/node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/highlightjs-vue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", - "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", - "license": "CC0-1.0" - }, - "node_modules/history": { - "version": "5.3.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.6" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/hpagent": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, - "node_modules/http_ece": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, "node_modules/http-errors": { "version": "2.0.0", "license": "MIT", @@ -6738,39 +1972,6 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "dev": true, @@ -6789,62 +1990,11 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore-by-default": { "version": "1.0.1", "dev": true, "license": "ISC" }, - "node_modules/import-fresh": { - "version": "3.3.1", - "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/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-in-the-middle": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.0.tgz", - "integrity": "sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, "node_modules/import-local": { "version": "3.2.0", "dev": true, @@ -6884,77 +2034,9 @@ "version": "2.0.4", "license": "ISC" }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/internmap": { - "version": "2.0.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ioredis": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", - "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "1.4.0", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", + "dev": true, "license": "MIT" }, "node_modules/is-binary-path": { @@ -6968,39 +2050,9 @@ "node": ">=8" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.16.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -7012,31 +2064,9 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "1.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7044,6 +2074,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7059,6 +2090,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -7067,51 +2099,17 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-stream": { "version": "2.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7120,40 +2118,9 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", + "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -7217,39 +2184,11 @@ "node": ">=8" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest": { "version": "28.1.3", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^28.1.3", "@jest/types": "^28.1.3", @@ -8082,15 +3021,9 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jiti": { - "version": "1.21.7", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/js-tokens": { "version": "4.0.0", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -8109,6 +3042,7 @@ }, "node_modules/jsesc": { "version": "3.1.0", + "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -8117,34 +3051,14 @@ "node": ">=6" } }, - "node_modules/json-bignum": { - "version": "0.0.3", - "engines": { - "node": ">=0.8" - } - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "dev": true, "license": "MIT" }, - "node_modules/json2csv": { - "version": "5.0.7", - "license": "MIT", - "dependencies": { - "commander": "^6.1.0", - "jsonparse": "^1.3.1", - "lodash.get": "^4.4.2" - }, - "bin": { - "json2csv": "bin/json2csv.js" - }, - "engines": { - "node": ">= 10", - "npm": ">= 6.13.0" - } - }, "node_modules/json5": { "version": "2.2.3", + "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -8153,81 +3067,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jwa": { - "version": "1.4.2", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", - "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.2", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/kleur": { "version": "3.0.3", "dev": true, @@ -8236,54 +3075,6 @@ "node": ">=6" } }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/leven": { "version": "3.1.0", "dev": true, @@ -8294,10 +3085,12 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", + "dev": true, "license": "MIT" }, "node_modules/locate-path": { "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -8306,120 +3099,11 @@ "node": ">=8" } }, - "node_modules/locter": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "destr": "^2.0.2", - "ebec": "^2.3.0", - "fast-glob": "^3.3.2", - "flat": "^5.0.2", - "jiti": "^1.21.0", - "yaml": "^2.3.4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "license": "MIT" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "dev": true, "license": "MIT" }, - "node_modules/lodash.once": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "license": "MIT", - "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "dev": true, @@ -8428,13 +3112,6 @@ "yallist": "^3.0.2" } }, - "node_modules/luxon": { - "version": "3.7.1", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/make-dir": { "version": "4.0.0", "dev": true, @@ -8472,781 +3149,14 @@ "tmpl": "1.0.5" } }, - "node_modules/markdown-table": { - "version": "3.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "12.0.2", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/material-colors": { - "version": "1.2.6", - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "license": "MIT" - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "3.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromatch": { "version": "4.0.8", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -9256,33 +3166,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "2.1.0", "dev": true, @@ -9291,12 +3174,9 @@ "node": ">=6" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, "node_modules/minimatch": { "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -9305,168 +3185,16 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", - "license": "MIT" - }, - "node_modules/moment": { - "version": "2.30.1", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.48", - "license": "MIT", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/monaco-editor": { - "version": "0.52.2", - "license": "MIT", - "peer": true - }, - "node_modules/mri": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { "version": "2.1.3", + "dev": true, "license": "MIT" }, - "node_modules/msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", - "license": "MIT", - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, "license": "MIT" }, - "node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" - }, - "node_modules/node-cron": { - "version": "3.0.3", - "license": "ISC", - "dependencies": { - "uuid": "8.3.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", - "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, "node_modules/node-int64": { "version": "0.4.0", "dev": true, @@ -9477,15 +3205,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nodemailer": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.11.tgz", - "integrity": "sha512-gnXhNRE0FNhD7wPSCGhdNh46Hs6nm+uTyg+Kq0cZukNQiYdnCsoQjodNP9BQVG9XrcK/v6/MgpAPBUFyzh9pvw==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/nodemon": { "version": "2.0.22", "dev": true, @@ -9550,6 +3269,7 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9566,33 +3286,6 @@ "node": ">=8" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "dev": true, @@ -9615,47 +3308,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openapi3-ts": { - "version": "4.5.0", - "license": "MIT", - "dependencies": { - "yaml": "^2.8.0" - } - }, - "node_modules/openssl-wrapper": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/openssl-wrapper/-/openssl-wrapper-0.3.4.tgz", - "integrity": "sha512-iITsrx6Ho8V3/2OVtmZzzX8wQaKAaFXEJQdzoPUZDtyf5jWFlqo+h+OhGT4TATQ47f9ACKHua8nw7Qoy85aeKQ==", - "license": "MIT" - }, - "node_modules/otpauth": { - "version": "9.4.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "funding": { - "url": "https://github.com/hectorm/otpauth?sponsor=1" - } - }, "node_modules/p-limit": { "version": "3.1.0", "dev": true, @@ -9672,6 +3324,7 @@ }, "node_modules/p-locate": { "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -9682,6 +3335,7 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", + "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -9695,43 +3349,15 @@ }, "node_modules/p-try": { "version": "2.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-json": { "version": "5.2.0", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -9746,23 +3372,9 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9778,6 +3390,7 @@ }, "node_modules/path-key": { "version": "3.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9785,116 +3398,17 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pg": { - "version": "8.16.3", - "license": "MIT", - "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.2.7" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.2.7", - "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.9.1", - "license": "MIT" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.10.1", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, "node_modules/picocolors": { "version": "1.1.1", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -9922,104 +3436,6 @@ "node": ">=8" } }, - "node_modules/playwright": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", - "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.56.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", - "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/posthog-js": { - "version": "1.295.0", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.295.0.tgz", - "integrity": "sha512-cOCO451t/5MB8Mq3QMrz/TV6Ct3COU9QEHcVaHAEdq5lYcCCq7bSfPUtwgwDQdNfxQB5LJdvfIfhz7HoOvOT1w==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@posthog/core": "1.5.2", - "core-js": "^3.38.1", - "fflate": "^0.4.8", - "preact": "^10.19.3", - "web-vitals": "^4.2.4" - } - }, - "node_modules/preact": { - "version": "10.27.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", - "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "dev": true, @@ -10044,30 +3460,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/prompts": { "version": "2.4.2", "dev": true, @@ -10080,209 +3472,11 @@ "node": ">= 6" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/property-information": { - "version": "6.5.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, "node_modules/pstree.remy": { "version": "1.1.8", "dev": true, "license": "MIT" }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.3", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/qrcode": { - "version": "1.5.4", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/qrcode/node_modules/cliui": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/qrcode/node_modules/wrap-ansi": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qrcode/node_modules/y18n": { - "version": "4.0.3", - "license": "ISC" - }, - "node_modules/qrcode/node_modules/yargs": { - "version": "15.4.1", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qrcode/node_modules/yargs-parser": { - "version": "18.1.3", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/raf-schd": { - "version": "4.0.3", - "license": "MIT" - }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rapiq": { - "version": "0.8.1", - "license": "MIT", - "dependencies": { - "smob": "^1.4.0" - } - }, "node_modules/raw-body": { "version": "3.0.0", "license": "MIT", @@ -10296,395 +3490,11 @@ "node": ">= 0.8" } }, - "node_modules/react": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-beautiful-dnd": { - "version": "13.1.1", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.9.2", - "css-box-model": "^1.2.0", - "memoize-one": "^5.1.1", - "raf-schd": "^4.0.2", - "react-redux": "^7.2.0", - "redux": "^4.0.4", - "use-memo-one": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-big-calendar": { - "version": "1.19.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.7", - "clsx": "^1.2.1", - "date-arithmetic": "^4.1.0", - "dayjs": "^1.11.7", - "dom-helpers": "^5.2.1", - "globalize": "^0.1.1", - "invariant": "^2.2.4", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "luxon": "^3.2.1", - "memoize-one": "^6.0.0", - "moment": "^2.29.4", - "moment-timezone": "^0.5.40", - "prop-types": "^15.8.1", - "react-overlays": "^5.2.1", - "uncontrollable": "^7.2.1" - }, - "peerDependencies": { - "react": "^16.14.0 || ^17 || ^18 || ^19", - "react-dom": "^16.14.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-big-calendar/node_modules/memoize-one": { - "version": "6.0.0", - "license": "MIT" - }, - "node_modules/react-color": { - "version": "2.19.3", - "license": "MIT", - "dependencies": { - "@icons/material": "^0.2.4", - "lodash": "^4.17.15", - "lodash-es": "^4.17.15", - "material-colors": "^1.2.1", - "prop-types": "^15.5.10", - "reactcss": "^1.2.0", - "tinycolor2": "^1.4.1" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dropzone": { - "version": "14.3.8", - "license": "MIT", - "dependencies": { - "attr-accept": "^2.2.4", - "file-selector": "^2.1.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, - "node_modules/react-error-boundary": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-fast-compare": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/react-highlight": { - "version": "0.15.0", - "license": "MIT", - "dependencies": { - "highlight.js": "^10.5.0" - } - }, "node_modules/react-is": { "version": "17.0.2", + "dev": true, "license": "MIT" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "8.0.7", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/react-markdown/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, - "node_modules/react-overlays": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.11.6", - "@restart/hooks": "^0.4.7", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, - "node_modules/react-redux": { - "version": "7.2.9", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "6.30.1", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.30.1", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.0", - "react-router": "6.30.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-select": { - "version": "5.10.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-select/node_modules/memoize-one": { - "version": "6.0.0", - "license": "MIT" - }, - "node_modules/react-smooth": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "fast-equals": "^5.0.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-spinners": { - "version": "0.14.1", - "license": "MIT", - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-syntax-highlighter": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.0.tgz", - "integrity": "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.28.4", - "highlight.js": "^10.4.1", - "highlightjs-vue": "^1.0.0", - "lowlight": "^1.17.0", - "prismjs": "^1.30.0", - "refractor": "^5.0.0" - }, - "engines": { - "node": ">= 16.20.2" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, - "node_modules/react-toggle": { - "version": "4.1.3", - "license": "MIT", - "dependencies": { - "classnames": "^2.2.5" - }, - "peerDependencies": { - "prop-types": ">= 15.3.0 < 19", - "react": ">= 15.3.0 < 19", - "react-dom": ">= 15.3.0 < 19" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/reactcss": { - "version": "1.2.3", - "license": "MIT", - "dependencies": { - "lodash": "^4.0.1" - } - }, - "node_modules/reactflow": { - "version": "11.11.4", - "license": "MIT", - "dependencies": { - "@reactflow/background": "11.3.14", - "@reactflow/controls": "11.2.14", - "@reactflow/core": "11.11.4", - "@reactflow/minimap": "11.7.14", - "@reactflow/node-resizer": "2.2.14", - "@reactflow/node-toolbar": "1.3.14" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/readdirp": { "version": "3.6.0", "dev": true, @@ -10696,335 +3506,17 @@ "node": ">=8.10.0" } }, - "node_modules/recharts": { - "version": "2.15.4", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.21", - "react-is": "^18.3.1", - "react-smooth": "^4.0.4", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "license": "MIT", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/recharts/node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/recharts/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-info": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.11" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-semaphore": { - "version": "5.6.2", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0" - }, - "engines": { - "node": ">= 14.17.0" - }, - "peerDependencies": { - "ioredis": "^4.1.0 || ^5" - }, - "peerDependenciesMeta": { - "ioredis": { - "optional": true - } - } - }, - "node_modules/redux": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "license": "Apache-2.0" - }, - "node_modules/refractor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", - "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/prismjs": "^1.0.0", - "hastscript": "^9.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/refractor/node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/remark-gfm": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "10.0.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/longest-streak": { - "version": "2.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/remark-stringify/node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/mdast-util-to-string": { - "version": "2.0.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/zwitch": { - "version": "1.0.5", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/require-in-the-middle": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", - "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3" - }, - "engines": { - "node": ">=9.3.0 || >=8.10.0 <9.0.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.10", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -11068,14 +3560,6 @@ "node": ">=10" } }, - "node_modules/reusify": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "3.0.2", "dev": true, @@ -11090,102 +3574,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rsa-pem-from-mod-exp": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.6.tgz", - "integrity": "sha512-c5ouQkOvGHF1qomUUDJGFcXsomeSO2gbEs6hVhMAtlkE1CuaZase/WzoaKFG/EZQuNmq6pw/EMCeEnDvOgCJYQ==", - "license": "MIT" - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safer-buffer": { "version": "2.1.2", "license": "MIT" }, - "node_modules/scheduler": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/scmp": { - "version": "2.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/secure-json-parse": { - "version": "3.0.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/semver": { "version": "6.3.1", "dev": true, @@ -11194,102 +3586,13 @@ "semver": "bin/semver.js" } }, - "node_modules/send": { - "version": "0.19.0", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "license": "ISC" }, - "node_modules/sha.js": { - "version": "2.4.12", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shebang-command": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -11300,75 +3603,12 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "3.0.7", "dev": true, @@ -11398,396 +3638,6 @@ "dev": true, "license": "MIT" }, - "node_modules/slackify-markdown": { - "version": "4.5.0", - "license": "MIT", - "dependencies": { - "mdast-util-to-markdown": "^0.6.2", - "remark-gfm": "^1.0.0", - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.1", - "unified": "^9.0.0", - "unist-util-remove": "^2.0.1", - "unist-util-visit": "^2.0.3" - } - }, - "node_modules/slackify-markdown/node_modules/bail": { - "version": "1.0.5", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/slackify-markdown/node_modules/ccount": { - "version": "1.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/slackify-markdown/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slackify-markdown/node_modules/is-plain-obj": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slackify-markdown/node_modules/longest-streak": { - "version": "2.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/slackify-markdown/node_modules/markdown-table": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-find-and-replace": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^4.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-gfm": { - "version": "0.1.2", - "license": "MIT", - "dependencies": { - "mdast-util-gfm-autolink-literal": "^0.1.0", - "mdast-util-gfm-strikethrough": "^0.2.0", - "mdast-util-gfm-table": "^0.1.0", - "mdast-util-gfm-task-list-item": "^0.1.0", - "mdast-util-to-markdown": "^0.6.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-gfm-autolink-literal": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "ccount": "^1.0.0", - "mdast-util-find-and-replace": "^1.1.0", - "micromark": "^2.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-gfm-strikethrough": { - "version": "0.2.3", - "license": "MIT", - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-gfm-table": { - "version": "0.1.6", - "license": "MIT", - "dependencies": { - "markdown-table": "^2.0.0", - "mdast-util-to-markdown": "~0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-gfm-task-list-item": { - "version": "0.1.6", - "license": "MIT", - "dependencies": { - "mdast-util-to-markdown": "~0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/mdast-util-to-string": { - "version": "2.0.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/micromark": { - "version": "2.11.4", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "node_modules/slackify-markdown/node_modules/micromark-extension-gfm": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "micromark": "~2.11.0", - "micromark-extension-gfm-autolink-literal": "~0.5.0", - "micromark-extension-gfm-strikethrough": "~0.6.5", - "micromark-extension-gfm-table": "~0.4.0", - "micromark-extension-gfm-tagfilter": "~0.3.0", - "micromark-extension-gfm-task-list-item": "~0.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/micromark-extension-gfm-autolink-literal": { - "version": "0.5.7", - "license": "MIT", - "dependencies": { - "micromark": "~2.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/micromark-extension-gfm-strikethrough": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/micromark-extension-gfm-table": { - "version": "0.4.3", - "license": "MIT", - "dependencies": { - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/micromark-extension-gfm-tagfilter": { - "version": "0.3.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/micromark-extension-gfm-task-list-item": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/remark-gfm": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "mdast-util-gfm": "^0.1.0", - "micromark-extension-gfm": "^0.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/remark-parse": { - "version": "9.0.0", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/trough": { - "version": "1.0.5", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/slackify-markdown/node_modules/unified": { - "version": "9.2.2", - "license": "MIT", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/unist-util-is": { - "version": "4.1.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/unist-util-visit": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/vfile": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/vfile-message": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/slackify-markdown/node_modules/zwitch": { - "version": "1.0.5", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/slash": { "version": "3.0.0", "dev": true, @@ -11796,125 +3646,6 @@ "node": ">=8" } }, - "node_modules/slugify": { - "version": "1.6.6", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "license": "MIT" - }, - "node_modules/socket.io": { - "version": "4.8.1", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-client": { - "version": "4.8.1", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/source-map": { "version": "0.6.1", "dev": true, @@ -11932,40 +3663,11 @@ "source-map": "^0.6.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, "license": "BSD-3-Clause" }, - "node_modules/sql-highlight": { - "version": "6.1.0", - "funding": [ - "https://github.com/scriptcoded/sql-highlight?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/scriptcoded" - } - ], - "license": "MIT", - "engines": { - "node": ">=14" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "dev": true, @@ -11977,14 +3679,6 @@ "node": ">=10" } }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/state-local": { - "version": "1.0.7", - "license": "MIT" - }, "node_modules/statuses": { "version": "2.0.1", "license": "MIT", @@ -11992,26 +3686,6 @@ "node": ">= 0.8" } }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-length": { "version": "4.0.2", "dev": true, @@ -12026,19 +3700,7 @@ }, "node_modules/string-width": { "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -12051,17 +3713,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -12097,30 +3749,9 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stripe": { - "version": "10.17.0", - "license": "MIT", - "dependencies": { - "@types/node": ">=8.1.0", - "qs": "^6.11.0" - }, - "engines": { - "node": "^8.1 || >=10.*" - } - }, - "node_modules/style-to-object": { - "version": "0.4.4", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "license": "MIT" - }, "node_modules/supports-color": { "version": "7.2.0", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -12143,6 +3774,7 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12151,50 +3783,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/table-layout": { - "version": "4.1.1", - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "wordwrapjs": "^5.1.0" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/tailwind-merge": { - "version": "2.6.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar-stream/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/terminal-link": { "version": "2.1.1", "dev": true, @@ -12223,67 +3811,14 @@ "node": ">=8" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "license": "MIT" - }, - "node_modules/tippy.js": { - "version": "6.3.7", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.0" - } - }, "node_modules/tmpl": { "version": "1.0.5", "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -12307,26 +3842,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/ts-jest": { "version": "28.0.8", "dev": true, @@ -12383,6 +3898,7 @@ "node_modules/ts-node": { "version": "10.9.2", "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -12421,41 +3937,6 @@ } } }, - "node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/tsyringe": { - "version": "4.10.0", - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/twilio": { - "version": "4.23.0", - "license": "MIT", - "dependencies": { - "axios": "^1.6.0", - "dayjs": "^1.11.9", - "https-proxy-agent": "^5.0.0", - "jsonwebtoken": "^9.0.0", - "qs": "^6.9.4", - "scmp": "^2.1.0", - "url-parse": "^1.5.9", - "xmlbuilder": "^13.0.2" - }, - "engines": { - "node": ">=14.0" - } - }, "node_modules/type-detect": { "version": "4.0.8", "dev": true, @@ -12475,223 +3956,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typeorm": { - "version": "0.3.27", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.27.tgz", - "integrity": "sha512-pNV1bn+1n8qEe8tUNsNdD8ejuPcMAg47u2lUGnbsajiNUr3p2Js1XLKQjBMH0yMRMDfdX8T+fIRejFmIwy9x4A==", - "license": "MIT", - "dependencies": { - "@sqltools/formatter": "^1.2.5", - "ansis": "^3.17.0", - "app-root-path": "^3.1.0", - "buffer": "^6.0.3", - "dayjs": "^1.11.13", - "debug": "^4.4.0", - "dedent": "^1.6.0", - "dotenv": "^16.4.7", - "glob": "^10.4.5", - "sha.js": "^2.4.12", - "sql-highlight": "^6.0.0", - "tslib": "^2.8.1", - "uuid": "^11.1.0", - "yargs": "^17.7.2" - }, - "bin": { - "typeorm": "cli.js", - "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", - "typeorm-ts-node-esm": "cli-ts-node-esm.js" - }, - "engines": { - "node": ">=16.13.0" - }, - "funding": { - "url": "https://opencollective.com/typeorm" - }, - "peerDependencies": { - "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0", - "@sap/hana-client": "^2.14.22", - "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", - "ioredis": "^5.0.4", - "mongodb": "^5.8.0 || ^6.0.0", - "mssql": "^9.1.1 || ^10.0.1 || ^11.0.1", - "mysql2": "^2.2.5 || ^3.0.1", - "oracledb": "^6.3.0", - "pg": "^8.5.1", - "pg-native": "^3.0.0", - "pg-query-stream": "^4.0.0", - "redis": "^3.1.1 || ^4.0.0 || ^5.0.14", - "reflect-metadata": "^0.1.14 || ^0.2.0", - "sql.js": "^1.4.0", - "sqlite3": "^5.0.3", - "ts-node": "^10.7.0", - "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@google-cloud/spanner": { - "optional": true - }, - "@sap/hana-client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "pg-query-stream": { - "optional": true - }, - "redis": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "ts-node": { - "optional": true - }, - "typeorm-aurora-data-api-driver": { - "optional": true - } - } - }, - "node_modules/typeorm-extension": { - "version": "2.8.1", - "license": "MIT", - "dependencies": { - "@faker-js/faker": "^8.0.2", - "locter": "^1.1.0", - "pascal-case": "^3.1.2", - "rapiq": "^0.8.1", - "reflect-metadata": "^0.1.13", - "smob": "^1.4.0", - "yargs": "^17.7.2" - }, - "bin": { - "typeorm-extension": "dist/cli/index.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "typeorm": "~0.3.0" - } - }, - "node_modules/typeorm-extension/node_modules/reflect-metadata": { - "version": "0.1.14", - "license": "Apache-2.0" - }, - "node_modules/typeorm/node_modules/brace-expansion": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typeorm/node_modules/dedent": { - "version": "1.6.0", - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/typeorm/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/minimatch": { - "version": "9.0.5", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/uuid": { - "version": "11.1.0", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, "node_modules/typescript": { "version": "5.8.3", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12700,161 +3968,11 @@ "node": ">=14.17" } }, - "node_modules/typical": { - "version": "7.3.0", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, "node_modules/undefsafe": { "version": "2.0.5", "dev": true, "license": "MIT" }, - "node_modules/undici": { - "version": "6.21.3", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "license": "MIT" - }, - "node_modules/unified": { - "version": "10.1.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove/node_modules/unist-util-is": { - "version": "4.1.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-cookie": { - "version": "7.2.2", - "license": "MIT", - "dependencies": { - "@types/cookie": "^0.6.0", - "cookie": "^0.7.2" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "license": "MIT", @@ -12891,97 +4009,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-async-effect": { - "version": "2.2.7", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uvu": { - "version": "0.5.6", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uvu/node_modules/diff": { - "version": "5.2.0", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/uvu/node_modules/kleur": { - "version": "4.1.5", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "license": "MIT" @@ -13004,59 +4031,6 @@ "dev": true, "license": "MIT" }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "5.3.7", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "3.1.4", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/victory-vendor": { - "version": "36.9.2", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, "node_modules/walker": { "version": "1.0.8", "dev": true, @@ -13065,87 +4039,9 @@ "makeerror": "1.0.12" } }, - "node_modules/warning": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/web-push": { - "version": "3.6.7", - "license": "MPL-2.0", - "dependencies": { - "asn1.js": "^5.3.0", - "http_ece": "1.2.0", - "https-proxy-agent": "^7.0.0", - "jws": "^4.0.0", - "minimist": "^1.2.5" - }, - "bin": { - "web-push": "src/cli.js" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/web-push/node_modules/agent-base": { - "version": "7.1.4", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/web-push/node_modules/https-proxy-agent": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/web-push/node_modules/jwa": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/web-push/node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/web-vitals": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", - "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -13157,54 +4053,9 @@ "node": ">= 8" } }, - "node_modules/which-module": { - "version": "2.0.1", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wordwrapjs": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -13235,62 +4086,9 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/ws": { - "version": "8.17.1", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xmlbuilder": { - "version": "13.0.2", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", + "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -13301,18 +4099,9 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.8.0", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, "node_modules/yargs": { "version": "17.7.2", + "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -13329,6 +4118,7 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -13352,66 +4142,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/zone.js": { - "version": "0.15.1", - "license": "MIT" - }, - "node_modules/zustand": { - "version": "4.5.7", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/MCP/package.json b/MCP/package.json index 7930750e98..f40e6cd490 100644 --- a/MCP/package.json +++ b/MCP/package.json @@ -25,7 +25,7 @@ "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^0.6.0", - "@oneuptime/common": "*", + "Common": "file:../Common", "dotenv": "^16.4.5", "ts-node": "^10.9.1" }, diff --git a/MCP/tsconfig.json b/MCP/tsconfig.json index 291db06a03..547cf100a3 100644 --- a/MCP/tsconfig.json +++ b/MCP/tsconfig.json @@ -8,7 +8,6 @@ } }, "compilerOptions": { - "experimentalDecorators": true, /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Projects */ @@ -20,9 +19,10 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2017", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "es2017" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - "jsx": "react", /* Specify what JSX code is generated. */ /* Enable experimental support for TC39 stage 2 draft decorators. */ + "jsx": "react" /* Specify what JSX code is generated. */, + "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ @@ -32,19 +32,16 @@ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ /* Modules */ - "module": "es2022" /* Specify what module code is generated. */, - // "rootDir": "./" /* Specify the root folder within your source files. */, + // "module": "es2022" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ "typeRoots": [ "./node_modules/@types" - ] /* Specify multiple folders that act like `./node_modules/@types`. */, - "types": [ - "node", - "jest" - ] /* Specify type package names to be included without being referenced in a source file. */, + ], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": ["node", "jest"], /* Specify type package names to be included without being referenced in a source file. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ // "resolveJsonModule": true, /* Enable importing .json files */ // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ @@ -60,7 +57,7 @@ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./build/dist" /* Specify an output folder for all emitted files. */, + "outDir": "./build/dist", /* Specify an output folder for all emitted files. */ // "removeComments": true, /* Disable emitting comments. */ // "noEmit": true, /* Disable emitting files from a compilation. */ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ @@ -88,22 +85,22 @@ /* Type Checking */ "strict": true /* Enable all strict type-checking options. */, - "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied `any` type.. */, - "strictNullChecks": true /* When type checking, take into account `null` and `undefined`. */, - "strictFunctionTypes": true /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */, - "strictBindCallApply": true /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */, - "strictPropertyInitialization": true /* Check for class properties that are declared but not set in the constructor. */, - "noImplicitThis": true /* Enable error reporting when `this` is given the type `any`. */, - "useUnknownInCatchVariables": true /* Type catch clause variables as 'unknown' instead of 'any'. */, - "alwaysStrict": true /* Ensure 'use strict' is always emitted. */, - "noUnusedLocals": true /* Enable error reporting when a local variables aren't read. */, - "noUnusedParameters": true /* Raise an error when a function parameter isn't read */, - "exactOptionalPropertyTypes": true /* Interpret optional property types as written, rather than adding 'undefined'. */, - "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, - "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, - "noUncheckedIndexedAccess": true /* Include 'undefined' in index signature results */, - "noImplicitOverride": true /* Ensure overriding members in derived classes are marked with an override modifier. */, - "noPropertyAccessFromIndexSignature": true /* Enforces using indexed accessors for keys declared using an indexed type */, + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ From 73d2cab46e690f55d0e0352c8a8cc93542cdb9cb Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 10:50:16 +0000 Subject: [PATCH 28/46] refactor: update import paths to use relative imports for consistency --- MCP/Services/OneUptimeApiService.ts | 30 ++++++++++++++--------------- MCP/Utils/DynamicToolGenerator.ts | 12 ++++++------ MCP/Utils/MCPLogger.ts | 8 ++++---- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/MCP/Services/OneUptimeApiService.ts b/MCP/Services/OneUptimeApiService.ts index d4ae985453..d84e403d0c 100644 --- a/MCP/Services/OneUptimeApiService.ts +++ b/MCP/Services/OneUptimeApiService.ts @@ -2,21 +2,21 @@ import OneUptimeOperation from "../Types/OneUptimeOperation"; import ModelType from "../Types/ModelType"; import { OneUptimeToolCallArgs } from "../Types/McpTypes"; import MCPLogger from "../Utils/MCPLogger"; -import API from "@oneuptime/common/Utils/API"; -import URL from "@oneuptime/common/Types/API/URL"; -import Route from "@oneuptime/common/Types/API/Route"; -import Headers from "@oneuptime/common/Types/API/Headers"; -import HTTPResponse from "@oneuptime/common/Types/API/HTTPResponse"; -import HTTPErrorResponse from "@oneuptime/common/Types/API/HTTPErrorResponse"; -import { JSONObject } from "@oneuptime/common/Types/JSON"; -import DatabaseModels from "@oneuptime/common/Models/DatabaseModels/Index"; -import AnalyticsModels from "@oneuptime/common/Models/AnalyticsModels/Index"; -import { ModelSchema } from "@oneuptime/common/Utils/Schema/ModelSchema"; -import { AnalyticsModelSchema } from "@oneuptime/common/Utils/Schema/AnalyticsModelSchema"; -import { getTableColumns } from "@oneuptime/common/Types/Database/TableColumn"; -import Permission from "@oneuptime/common/Types/Permission"; -import Protocol from "@oneuptime/common/Types/API/Protocol"; -import Hostname from "@oneuptime/common/Types/API/Hostname"; +import API from "Common/Utils/API"; +import URL from "Common/Types/API/URL"; +import Route from "Common/Types/API/Route"; +import Headers from "Common/Types/API/Headers"; +import HTTPResponse from "Common/Types/API/HTTPResponse"; +import HTTPErrorResponse from "Common/Types/API/HTTPErrorResponse"; +import { JSONObject } from "Common/Types/JSON"; +import DatabaseModels from "Common/Models/DatabaseModels/Index"; +import AnalyticsModels from "Common/Models/AnalyticsModels/Index"; +import { ModelSchema } from "Common/Utils/Schema/ModelSchema"; +import { AnalyticsModelSchema } from "Common/Utils/Schema/AnalyticsModelSchema"; +import { getTableColumns } from "Common/Types/Database/TableColumn"; +import Permission from "Common/Types/Permission"; +import Protocol from "Common/Types/API/Protocol"; +import Hostname from "Common/Types/API/Hostname"; export interface OneUptimeApiConfig { url: string; diff --git a/MCP/Utils/DynamicToolGenerator.ts b/MCP/Utils/DynamicToolGenerator.ts index 7cd7344985..980d73f87e 100644 --- a/MCP/Utils/DynamicToolGenerator.ts +++ b/MCP/Utils/DynamicToolGenerator.ts @@ -1,18 +1,18 @@ -import DatabaseModels from "@oneuptime/common/Models/DatabaseModels/Index"; -import AnalyticsModels from "@oneuptime/common/Models/AnalyticsModels/Index"; -import DatabaseBaseModel from "@oneuptime/common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel"; -import AnalyticsBaseModel from "@oneuptime/common/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel"; +import DatabaseModels from "Common/Models/DatabaseModels/Index"; +import AnalyticsModels from "Common/Models/AnalyticsModels/Index"; +import DatabaseBaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel"; +import AnalyticsBaseModel from "Common/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel"; import OneUptimeOperation from "../Types/OneUptimeOperation"; import ModelType from "../Types/ModelType"; import { McpToolInfo, ModelToolsResult } from "../Types/McpTypes"; import { ModelSchema, ModelSchemaType, -} from "@oneuptime/common/Utils/Schema/ModelSchema"; +} from "Common/Utils/Schema/ModelSchema"; import { AnalyticsModelSchema, AnalyticsModelSchemaType, -} from "@oneuptime/common/Utils/Schema/AnalyticsModelSchema"; +} from "Common/Utils/Schema/AnalyticsModelSchema"; import MCPLogger from "./MCPLogger"; export default class DynamicToolGenerator { diff --git a/MCP/Utils/MCPLogger.ts b/MCP/Utils/MCPLogger.ts index c6b7a53de1..60ee2bcb16 100644 --- a/MCP/Utils/MCPLogger.ts +++ b/MCP/Utils/MCPLogger.ts @@ -3,10 +3,10 @@ * All logs are directed to stderr to avoid interfering with the JSON-RPC protocol on stdout */ -import { LogLevel } from "@oneuptime/common/Server/EnvironmentConfig"; -import ConfigLogLevel from "@oneuptime/common/Server/Types/ConfigLogLevel"; -import { JSONObject } from "@oneuptime/common/Types/JSON"; -import Exception from "@oneuptime/common/Types/Exception/Exception"; +import { LogLevel } from "Common/Server/EnvironmentConfig"; +import ConfigLogLevel from "Common/Server/Types/ConfigLogLevel"; +import { JSONObject } from "Common/Types/JSON"; +import Exception from "Common/Types/Exception/Exception"; export type LogBody = string | JSONObject | Exception | Error | unknown; From 83107857bd0db3199556accb980da541c6f5bb03 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:04:56 +0000 Subject: [PATCH 29/46] feat: Add MCP service configuration and related environment variables --- .../Public/oneuptime/templates/_helpers.tpl | 4 + HelmChart/Public/oneuptime/templates/mcp.yaml | 19 +++ HelmChart/Public/oneuptime/values.schema.json | 39 ++++++ HelmChart/Public/oneuptime/values.yaml | 12 ++ MCP/Index.ts | 125 +++++++++++++++++- Nginx/default.conf.template | 35 ++++- config.example.env | 3 + docker-compose.base.yml | 17 ++- docker-compose.yml | 6 + 9 files changed, 256 insertions(+), 4 deletions(-) create mode 100644 HelmChart/Public/oneuptime/templates/mcp.yaml diff --git a/HelmChart/Public/oneuptime/templates/_helpers.tpl b/HelmChart/Public/oneuptime/templates/_helpers.tpl index b95293ad2a..7f6f7db2d6 100644 --- a/HelmChart/Public/oneuptime/templates/_helpers.tpl +++ b/HelmChart/Public/oneuptime/templates/_helpers.tpl @@ -131,6 +131,8 @@ Usage: value: {{ $.Release.Name }}-admin-dashboard.{{ $.Release.Namespace }}.svc.{{ $.Values.global.clusterDomain }} - name: SERVER_DOCS_HOSTNAME value: {{ $.Release.Name }}-docs.{{ $.Release.Namespace }}.svc.{{ $.Values.global.clusterDomain }} +- name: SERVER_MCP_HOSTNAME + value: {{ $.Release.Name }}-mcp.{{ $.Release.Namespace }}.svc.{{ $.Values.global.clusterDomain }} - name: APP_PORT value: {{ $.Values.app.ports.http | squote }} @@ -164,6 +166,8 @@ Usage: value: {{ $.Values.apiReference.ports.http | squote }} - name: DOCS_PORT value: {{ $.Values.docs.ports.http | squote }} +- name: MCP_PORT + value: {{ $.Values.mcp.ports.http | squote }} {{- end }} diff --git a/HelmChart/Public/oneuptime/templates/mcp.yaml b/HelmChart/Public/oneuptime/templates/mcp.yaml new file mode 100644 index 0000000000..cb9db51554 --- /dev/null +++ b/HelmChart/Public/oneuptime/templates/mcp.yaml @@ -0,0 +1,19 @@ +{{- if $.Values.mcp.enabled }} +# OneUptime MCP Deployment +{{- $mcpEnv := dict "PORT" $.Values.mcp.ports.http "DISABLE_TELEMETRY" $.Values.mcp.disableTelemetryCollection -}} +{{- $mcpPorts := $.Values.mcp.ports -}} +{{- $mcpDeploymentArgs := dict "ServiceName" "mcp" "Ports" $mcpPorts "Release" $.Release "Values" $.Values "Env" $mcpEnv "Resources" $.Values.mcp.resources "NodeSelector" $.Values.mcp.nodeSelector "PodSecurityContext" $.Values.mcp.podSecurityContext "ContainerSecurityContext" $.Values.mcp.containerSecurityContext "DisableAutoscaler" $.Values.mcp.disableAutoscaler "ReplicaCount" $.Values.mcp.replicaCount -}} +{{- include "oneuptime.deployment" $mcpDeploymentArgs }} +--- + +# OneUptime MCP Service +{{- $mcpPorts := $.Values.mcp.ports -}} +{{- $mcpServiceArgs := dict "ServiceName" "mcp" "Ports" $mcpPorts "Release" $.Release "Values" $.Values -}} +{{- include "oneuptime.service" $mcpServiceArgs }} +--- + +# OneUptime MCP autoscaler +{{- $mcpAutoScalerArgs := dict "ServiceName" "mcp" "Release" $.Release "Values" $.Values "DisableAutoscaler" $.Values.mcp.disableAutoscaler -}} +{{- include "oneuptime.autoscaler" $mcpAutoScalerArgs }} +--- +{{- end }} diff --git a/HelmChart/Public/oneuptime/values.schema.json b/HelmChart/Public/oneuptime/values.schema.json index 41646469bc..cd7b8d6df4 100644 --- a/HelmChart/Public/oneuptime/values.schema.json +++ b/HelmChart/Public/oneuptime/values.schema.json @@ -1921,6 +1921,45 @@ }, "additionalProperties": false }, + "mcp": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "replicaCount": { + "type": "integer" + }, + "disableTelemetryCollection": { + "type": "boolean" + }, + "disableAutoscaler": { + "type": "boolean" + }, + "ports": { + "type": "object", + "properties": { + "http": { + "type": "integer" + } + }, + "additionalProperties": false + }, + "resources": { + "type": ["object", "null"] + }, + "nodeSelector": { + "type": "object" + }, + "podSecurityContext": { + "type": "object" + }, + "containerSecurityContext": { + "type": "object" + } + }, + "additionalProperties": false + }, "serverMonitorIngest": { "type": "object", "properties": { diff --git a/HelmChart/Public/oneuptime/values.yaml b/HelmChart/Public/oneuptime/values.yaml index c17141e3cf..7212471ee9 100644 --- a/HelmChart/Public/oneuptime/values.yaml +++ b/HelmChart/Public/oneuptime/values.yaml @@ -765,6 +765,18 @@ isolatedVM: podSecurityContext: {} containerSecurityContext: {} +mcp: + enabled: true + replicaCount: 1 + disableTelemetryCollection: false + disableAutoscaler: false + ports: + http: 3405 + resources: + nodeSelector: {} + podSecurityContext: {} + containerSecurityContext: {} + serverMonitorIngest: enabled: true replicaCount: 1 diff --git a/MCP/Index.ts b/MCP/Index.ts index 604b23e9b0..b9f1cec875 100755 --- a/MCP/Index.ts +++ b/MCP/Index.ts @@ -2,6 +2,7 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; import { CallToolRequestSchema, ErrorCode, @@ -9,6 +10,13 @@ import { McpError, } from "@modelcontextprotocol/sdk/types.js"; import dotenv from "dotenv"; +import Express, { + ExpressApplication, + ExpressRequest, + ExpressResponse, + NextFunction, + ExpressJson, +} from "Common/Server/Utils/Express"; import DynamicToolGenerator from "./Utils/DynamicToolGenerator"; import OneUptimeApiService, { OneUptimeApiConfig, @@ -16,6 +24,7 @@ import OneUptimeApiService, { import { McpToolInfo, OneUptimeToolCallArgs } from "./Types/McpTypes"; import OneUptimeOperation from "./Types/OneUptimeOperation"; import MCPLogger from "./Utils/MCPLogger"; +import http from "http"; // Load environment variables dotenv.config(); @@ -214,10 +223,22 @@ class OneUptimeMCPServer { } public async run(): Promise { + const port: string | undefined = process.env["PORT"]; + + if (port) { + // HTTP mode - run as web server with SSE transport + await this.runHttpServer(parseInt(port, 10)); + } else { + // Stdio mode - for CLI usage + await this.runStdioServer(); + } + } + + private async runStdioServer(): Promise { const transport: StdioServerTransport = new StdioServerTransport(); await this.server.connect(transport); - MCPLogger.info("OneUptime MCP Server is running!"); + MCPLogger.info("OneUptime MCP Server is running in stdio mode!"); MCPLogger.info(`Available tools: ${this.tools.length} total`); // Log some example tools @@ -228,6 +249,108 @@ class OneUptimeMCPServer { }); MCPLogger.info(`Example tools: ${exampleTools.join(", ")}`); } + + private async runHttpServer(port: number): Promise { + Express.setupExpress(); + const app: ExpressApplication = Express.getExpressApp(); + + // Store active SSE transports + const transports: Map = new Map(); + + // Health check endpoint + app.get("/health", (_req: ExpressRequest, res: ExpressResponse) => { + res.json({ + status: "healthy", + service: "oneuptime-mcp", + tools: this.tools.length, + }); + }); + + // SSE endpoint for MCP connections + app.get("/sse", async (req: ExpressRequest, res: ExpressResponse) => { + MCPLogger.info("New SSE connection established"); + + // Set SSE headers + res.setHeader("Content-Type", "text/event-stream"); + res.setHeader("Cache-Control", "no-cache"); + res.setHeader("Connection", "keep-alive"); + res.setHeader("Access-Control-Allow-Origin", "*"); + + // Create SSE transport + const transport: SSEServerTransport = new SSEServerTransport( + "/message", + res, + ); + + // Store transport with session ID + const sessionId: string = `session-${Date.now()}-${Math.random().toString(36).substring(7)}`; + transports.set(sessionId, transport); + + // Handle connection close + req.on("close", () => { + MCPLogger.info(`SSE connection closed: ${sessionId}`); + transports.delete(sessionId); + }); + + // Connect server to transport + await this.server.connect(transport); + }); + + // Message endpoint for client-to-server messages + app.post( + "/message", + ExpressJson(), + async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { + try { + // Find the transport for this session + // In a real implementation, you'd use session management + const transport: SSEServerTransport | undefined = Array.from( + transports.values(), + )[0]; + if (transport) { + await transport.handlePostMessage(req, res); + } else { + res.status(400).json({ error: "No active SSE connection" }); + } + } catch (error) { + next(error); + } + }, + ); + + // List tools endpoint (REST API) + app.get("/tools", (_req: ExpressRequest, res: ExpressResponse) => { + const toolsList: Array<{ + name: string; + description: string; + }> = this.tools.map((tool: McpToolInfo) => { + return { + name: tool.name, + description: tool.description, + }; + }); + res.json({ tools: toolsList, count: toolsList.length }); + }); + + // Create HTTP server + const httpServer: http.Server = http.createServer(app); + + httpServer.listen(port, () => { + MCPLogger.info(`OneUptime MCP Server is running in HTTP mode on port ${port}`); + MCPLogger.info(`Available tools: ${this.tools.length} total`); + MCPLogger.info(`Health check: http://localhost:${port}/health`); + MCPLogger.info(`Tools list: http://localhost:${port}/tools`); + MCPLogger.info(`SSE endpoint: http://localhost:${port}/sse`); + + // Log some example tools + const exampleTools: string[] = this.tools + .slice(0, 5) + .map((t: McpToolInfo) => { + return t.name; + }); + MCPLogger.info(`Example tools: ${exampleTools.join(", ")}`); + }); + } } // Start the server diff --git a/Nginx/default.conf.template b/Nginx/default.conf.template index c7ea36827f..b013d30318 100644 --- a/Nginx/default.conf.template +++ b/Nginx/default.conf.template @@ -72,6 +72,10 @@ upstream opentelemetry-collector-grpc { server ${SERVER_OTEL_COLLECTOR_HOSTNAME}:4317; } +upstream mcp { + server ${SERVER_MCP_HOSTNAME}:${MCP_PORT} weight=10 max_fails=3 fail_timeout=30s; +} + # Status Pages server { @@ -915,12 +919,12 @@ ${PROVISION_SSL_CERTIFICATE_KEY_DIRECTIVE} } location /workers { - # This is for nginx not to crash when service is not available. + # This is for nginx not to crash when service is not available. resolver 127.0.0.1 valid=30s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $scheme; # enable WebSockets (for ws://sockjs not connected error in the accounts source: https://stackoverflow.com/questions/41381444/websocket-connection-failed-error-during-websocket-handshake-unexpected-respon) proxy_http_version 1.1; @@ -928,4 +932,31 @@ ${PROVISION_SSL_CERTIFICATE_KEY_DIRECTIVE} proxy_set_header Connection "upgrade"; proxy_pass http://app/api/workers; } + + location /mcp/ { + # This is for nginx not to crash when service is not available. + resolver 127.0.0.1 valid=30s; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # enable WebSockets and SSE (for MCP Server-Sent Events) + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # SSE specific settings for long-lived connections + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; + chunked_transfer_encoding on; + + proxy_pass http://mcp/; + } + + location = /mcp { + return 301 /mcp/; + } } diff --git a/config.example.env b/config.example.env index 573057a88a..7d79576fa3 100644 --- a/config.example.env +++ b/config.example.env @@ -109,6 +109,7 @@ SERVER_OTEL_COLLECTOR_HOSTNAME=otel-collector SERVER_API_REFERENCE_HOSTNAME=reference SERVER_WORKER_HOSTNAME=worker SERVER_DOCS_HOSTNAME=docs +SERVER_MCP_HOSTNAME=mcp #Ports. Usually they don't need to change. @@ -129,6 +130,7 @@ WORKER_PORT=1445 WORKFLOW_PORT=3099 API_REFERENCE_PORT=1446 DOCS_PORT=1447 +MCP_PORT=3405 # Plans # This is in the format of PlanName,PlanIdFromBillingProvider,MonthlySubscriptionPlanAmountInUSD,YearlySubscriptionPlanAmountInUSD,Order,TrialPeriodInDays @@ -314,6 +316,7 @@ DISABLE_TELEMETRY_FOR_ISOLATED_VM=true DISABLE_TELEMETRY_FOR_INGRESS=true DISABLE_TELEMETRY_FOR_WORKER=true DISABLE_TELEMETRY_FOR_SERVER_MONITOR_INGEST=true +DISABLE_TELEMETRY_FOR_MCP=true # OPENTELEMETRY_COLLECTOR env vars diff --git a/docker-compose.base.yml b/docker-compose.base.yml index 2d4d22b409..f327492544 100644 --- a/docker-compose.base.yml +++ b/docker-compose.base.yml @@ -46,6 +46,7 @@ x-common-variables: &common-variables SERVER_API_REFERENCE_HOSTNAME: api-reference SERVER_DOCS_HOSTNAME: docs SERVER_SERVER_MONITOR_INGEST_HOSTNAME: server-monitor-ingest + SERVER_MCP_HOSTNAME: mcp #Ports. Usually they don't need to change. APP_PORT: ${APP_PORT} @@ -64,6 +65,7 @@ x-common-variables: &common-variables API_REFERENCE_PORT: ${API_REFERENCE_PORT} DOCS_PORT: ${DOCS_PORT} SERVER_MONITOR_INGEST_PORT: ${SERVER_MONITOR_INGEST_PORT} + MCP_PORT: ${MCP_PORT} OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT: ${OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT} OPENTELEMETRY_EXPORTER_OTLP_HEADERS: ${OPENTELEMETRY_EXPORTER_OTLP_HEADERS} @@ -508,9 +510,22 @@ services: options: max-size: "1000m" + mcp: + networks: + - oneuptime + restart: always + environment: + <<: *common-runtime-variables + PORT: ${MCP_PORT} + DISABLE_TELEMETRY: ${DISABLE_TELEMETRY_FOR_MCP} + logging: + driver: "local" + options: + max-size: "1000m" + e2e: restart: "no" - network_mode: host # This is needed to access the host network, + network_mode: host # This is needed to access the host network, environment: <<: *common-variables E2E_TEST_IS_USER_REGISTERED: ${E2E_TEST_IS_USER_REGISTERED} diff --git a/docker-compose.yml b/docker-compose.yml index 94bad087b8..c657319712 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -132,6 +132,12 @@ services: file: ./docker-compose.base.yml service: isolated-vm + mcp: + image: oneuptime/mcp:${APP_TAG} + extends: + file: ./docker-compose.base.yml + service: mcp + ingress: image: oneuptime/nginx:${APP_TAG} extends: From f2906f59a25bc71cd5f653a60a8e68f6b4fa212e Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:06:02 +0000 Subject: [PATCH 30/46] refactor: Simplify server run logic and remove unused stdio mode --- MCP/Index.ts | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/MCP/Index.ts b/MCP/Index.ts index b9f1cec875..f6f29ef9f4 100755 --- a/MCP/Index.ts +++ b/MCP/Index.ts @@ -1,7 +1,6 @@ #!/usr/bin/env npx ts-node import { Server } from "@modelcontextprotocol/sdk/server/index.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; import { CallToolRequestSchema, @@ -223,34 +222,9 @@ class OneUptimeMCPServer { } public async run(): Promise { - const port: string | undefined = process.env["PORT"]; + const portString: string | undefined = process.env["PORT"]; + const port: number = portString ? parseInt(portString, 10) : 3405; - if (port) { - // HTTP mode - run as web server with SSE transport - await this.runHttpServer(parseInt(port, 10)); - } else { - // Stdio mode - for CLI usage - await this.runStdioServer(); - } - } - - private async runStdioServer(): Promise { - const transport: StdioServerTransport = new StdioServerTransport(); - await this.server.connect(transport); - - MCPLogger.info("OneUptime MCP Server is running in stdio mode!"); - MCPLogger.info(`Available tools: ${this.tools.length} total`); - - // Log some example tools - const exampleTools: string[] = this.tools - .slice(0, 5) - .map((t: McpToolInfo) => { - return t.name; - }); - MCPLogger.info(`Example tools: ${exampleTools.join(", ")}`); - } - - private async runHttpServer(port: number): Promise { Express.setupExpress(); const app: ExpressApplication = Express.getExpressApp(); @@ -336,7 +310,7 @@ class OneUptimeMCPServer { const httpServer: http.Server = http.createServer(app); httpServer.listen(port, () => { - MCPLogger.info(`OneUptime MCP Server is running in HTTP mode on port ${port}`); + MCPLogger.info(`OneUptime MCP Server is running on port ${port}`); MCPLogger.info(`Available tools: ${this.tools.length} total`); MCPLogger.info(`Health check: http://localhost:${port}/health`); MCPLogger.info(`Tools list: http://localhost:${port}/tools`); From 091a766c29377e44e4210e51be11c172de486b07 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:19:44 +0000 Subject: [PATCH 31/46] docs: Update MCP documentation for improved clarity and configuration details --- Docs/Content/mcp/configuration.md | 132 +++++++++++++++--------------- Docs/Content/mcp/index.md | 8 +- Docs/Content/mcp/installation.md | 68 +++++++-------- Docs/Content/mcp/quick-start.md | 56 +++++-------- 4 files changed, 129 insertions(+), 135 deletions(-) diff --git a/Docs/Content/mcp/configuration.md b/Docs/Content/mcp/configuration.md index 817cee1c3c..35990b02c6 100644 --- a/Docs/Content/mcp/configuration.md +++ b/Docs/Content/mcp/configuration.md @@ -2,61 +2,83 @@ Learn how to configure the OneUptime MCP Server for your specific needs. -## Environment Variables +## Claude Desktop Configuration -The MCP server uses environment variables for configuration: +The MCP server is hosted alongside your OneUptime instance. Configure your Claude Desktop to connect via SSE transport. -| Variable | Description | Required | Default | Example | -|----------|-------------|----------|---------|---------| -| `ONEUPTIME_API_KEY` | Your OneUptime API key | **Yes** | - | `xxxxxxxx-xxxx-xxxx-xxxx` | -| `ONEUPTIME_URL` | Your OneUptime instance URL | No | `https://oneuptime.com` | `https://my-company.oneuptime.com` | +### Find Your Configuration File -## Setting Environment Variables +**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` +**Windows**: `%APPDATA%\Claude\claude_desktop_config.json` +**Linux**: `~/.config/Claude/claude_desktop_config.json` -### In Claude Desktop Configuration +### OneUptime Cloud Configuration -The recommended way is to set environment variables in your Claude Desktop configuration: +Add the following to your Claude Desktop configuration file: ```json { "mcpServers": { "oneuptime": { - "command": "oneuptime-mcp", - "env": { - "ONEUPTIME_API_KEY": "your-api-key-here", - "ONEUPTIME_URL": "https://oneuptime.com" // Replace with your instance URL if you are self-hosting + "transport": "sse", + "url": "https://oneuptime.com/mcp/sse", + "headers": { + "x-api-key": "your-api-key-here" } } } } ``` -### System Environment Variables +### Self-Hosted OneUptime Configuration -Alternatively, you can set system environment variables: +If you're running a self-hosted OneUptime instance: + +```json +{ + "mcpServers": { + "oneuptime": { + "transport": "sse", + "url": "https://your-oneuptime-domain.com/mcp/sse", + "headers": { + "x-api-key": "your-api-key-here" + } + } + } +} +``` + +## Available Endpoints + +The MCP server provides the following endpoints: + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/mcp/sse` | GET | SSE endpoint for establishing MCP connections | +| `/mcp/message` | POST | Endpoint for sending messages to the server | +| `/mcp/health` | GET | Health check endpoint returning server status | +| `/mcp/tools` | GET | REST API listing all available tools | + +## Testing the Connection + +You can verify the server is working by checking the health endpoint: -**macOS/Linux**: ```bash -export ONEUPTIME_API_KEY="your-api-key-here" -# Optional: Set custom OneUptime URL. Replace with your instance if self-hosted -export ONEUPTIME_URL="https://oneuptime.com" +# For OneUptime Cloud +curl https://oneuptime.com/mcp/health + +# For Self-Hosted +curl https://your-oneuptime-domain.com/mcp/health ``` -**Windows**: -```cmd -set ONEUPTIME_API_KEY=your-api-key-here -# Optional: Set custom OneUptime URL. Replace with your instance if self-hosted -set ONEUPTIME_URL=https://oneuptime.com -``` +Or list available tools: -### Using .env File +```bash +# For OneUptime Cloud +curl https://oneuptime.com/mcp/tools -For development, you can create a `.env` file in your working directory: - -```env -ONEUPTIME_API_KEY=your-api-key-here -# Optional: Set custom OneUptime URL. Replace with your instance if self-hosted -ONEUPTIME_URL=https://oneuptime.com +# For Self-Hosted +curl https://your-oneuptime-domain.com/mcp/tools ``` ## API Key Permissions @@ -65,7 +87,7 @@ Your API key needs appropriate permissions based on what operations you want to ### Read-Only Access -For viewing data only, Please add read permissions for this API Key, +For viewing data only, add read permissions for this API Key. ### Full Access @@ -74,11 +96,9 @@ For full access to create, update, and delete resources, ensure your API key has ### Minimal Permissions -It is recommended to have minimum set of permissions assigned to your API key for your use-case. +It is recommended to have minimum set of permissions assigned to your API key for your use-case. -## Advanced Configuration - -### Multiple Instances +## Multiple Instances You can configure multiple OneUptime instances by creating separate MCP server configurations: @@ -86,34 +106,17 @@ You can configure multiple OneUptime instances by creating separate MCP server c { "mcpServers": { "oneuptime-prod": { - "command": "oneuptime-mcp", - "env": { - "ONEUPTIME_API_KEY": "prod-api-key", - "ONEUPTIME_URL": "https://prod.oneuptime.com" + "transport": "sse", + "url": "https://prod.oneuptime.com/mcp/sse", + "headers": { + "x-api-key": "prod-api-key" } }, "oneuptime-staging": { - "command": "oneuptime-mcp", - "env": { - "ONEUPTIME_API_KEY": "staging-api-key", - "ONEUPTIME_URL": "https://staging.oneuptime.com" - } - } - } -} -``` - -### Custom Command Path - -If you installed from source or want to use a specific version: - -```json -{ - "mcpServers": { - "oneuptime": { - "command": "/path/to/your/oneuptime-mcp", - "env": { - "ONEUPTIME_API_KEY": "your-api-key-here" + "transport": "sse", + "url": "https://staging.oneuptime.com/mcp/sse", + "headers": { + "x-api-key": "staging-api-key" } } } @@ -135,10 +138,11 @@ To verify your configuration is working: - Check for extra spaces or characters - Ensure the key hasn't expired -### Wrong URL +### Connection Failed - Verify your OneUptime instance URL - Ensure it includes the protocol (https://) - Check for typos in the domain +- Verify the MCP server is running (check `/mcp/health`) ### Permission Denied - Review your API key permissions @@ -151,10 +155,8 @@ To verify your configuration is working: 2. **Rotate API Keys**: Regularly rotate your API keys 3. **Monitor Usage**: Keep track of API key usage in OneUptime 4. **Separate Keys**: Use different API keys for different environments -5. **Store Securely**: Never commit API keys to version control ## Next Steps - [Explore usage examples](/docs/mcp/examples) - [View available resources](/docs/mcp/resources) -- [Learn about troubleshooting](/docs/mcp/troubleshooting) diff --git a/Docs/Content/mcp/index.md b/Docs/Content/mcp/index.md index 827fc2b9a8..54367fd472 100644 --- a/Docs/Content/mcp/index.md +++ b/Docs/Content/mcp/index.md @@ -6,6 +6,13 @@ The OneUptime Model Context Protocol (MCP) Server provides LLMs with direct acce The OneUptime MCP Server is a bridge between Large Language Models (LLMs) and your OneUptime instance. It implements the Model Context Protocol (MCP), allowing AI assistants like Claude to interact directly with your monitoring infrastructure. +## How It Works + +The MCP server is hosted alongside your OneUptime instance and accessible via Server-Sent Events (SSE). No local installation is required. + +**Cloud Users**: `https://oneuptime.com/mcp` +**Self-Hosted Users**: `https://your-oneuptime-domain.com/mcp` + ## Key Features - **Complete API Coverage**: Access to 711 OneUptime API endpoints @@ -38,7 +45,6 @@ With the OneUptime MCP Server, AI assistants can help you: - OneUptime instance (cloud or self-hosted) - Valid OneUptime API key -- Node.js 18+ (for development) - MCP-compatible client (Claude Desktop, etc.) ## Architecture diff --git a/Docs/Content/mcp/installation.md b/Docs/Content/mcp/installation.md index 9084c1ad49..7f3696a58d 100644 --- a/Docs/Content/mcp/installation.md +++ b/Docs/Content/mcp/installation.md @@ -1,46 +1,32 @@ # Installation -This guide will walk you through installing and setting up the OneUptime MCP Server. +This guide will walk you through setting up the OneUptime MCP Server. ## Prerequisites -Before installing the MCP server, ensure you have: +Before setting up the MCP server, ensure you have: - A OneUptime instance (cloud or self-hosted) - A valid OneUptime API key -- Node.js 18 or later (for npm installation) +- An MCP-compatible client (Claude Desktop, etc.) -## Installation Methods +## MCP Server URL -### Method 1: NPM Installation (Recommended) +The MCP server is hosted alongside your OneUptime instance. No local installation is required. -Install the MCP server globally using npm: +**OneUptime Cloud**: `https://oneuptime.com/mcp` +**Self-Hosted**: `https://your-oneuptime-domain.com/mcp` -```bash -npm install -g @oneuptime/mcp-server -``` +## Available Endpoints -This will install the `oneuptime-mcp` command globally on your system. +The MCP server exposes the following endpoints: -### Method 2: From Source - -If you want to build from source or contribute to the project: - -```bash -# Clone the OneUptime repository -git clone https://github.com/OneUptime/oneuptime.git -cd oneuptime - -# Generate the MCP server -cd MCP - - -# Install dependencies -npm install && npm link - -# This should now execute -oneuptime-mcp --version -``` +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/mcp/sse` | GET | SSE endpoint for MCP connections | +| `/mcp/message` | POST | Message endpoint for client-to-server communication | +| `/mcp/health` | GET | Health check endpoint | +| `/mcp/tools` | GET | REST API to list available tools | ## Getting Your API Key @@ -64,14 +50,28 @@ oneuptime-mcp --version ## Verification -Verify your installation by checking the version: +You can verify the MCP server is running by checking the health endpoint: ```bash -oneuptime-mcp --version +# For OneUptime Cloud +curl https://oneuptime.com/mcp/health + +# For Self-Hosted +curl https://your-oneuptime-domain.com/mcp/health +``` + +You can also list available tools: + +```bash +# For OneUptime Cloud +curl https://oneuptime.com/mcp/tools + +# For Self-Hosted +curl https://your-oneuptime-domain.com/mcp/tools ``` ## Next Steps -- [Configure the MCP Server](/docs/mcp/configuration) -- [Set up with Claude Desktop](/docs/mcp/quick-start) -- [Explore configuration options](/docs/mcp/configuration) +- [Configure with Claude Desktop](/docs/mcp/configuration) +- [Quick Start Guide](/docs/mcp/quick-start) +- [View Usage Examples](/docs/mcp/examples) diff --git a/Docs/Content/mcp/quick-start.md b/Docs/Content/mcp/quick-start.md index c6edc0478a..a797ada85e 100644 --- a/Docs/Content/mcp/quick-start.md +++ b/Docs/Content/mcp/quick-start.md @@ -2,72 +2,64 @@ Get up and running with the OneUptime MCP Server in just a few minutes. -## Step 1: Install the MCP Server - -If you haven't already, install the MCP server: - -```bash -npm install -g @oneuptime/mcp-server -``` - -## Step 2: Get Your API Key +## Step 1: Get Your API Key 1. Log in to your OneUptime instance 2. Go to **Settings** → **API Keys** 3. Create a new API key with appropriate permissions 4. Copy the API key for use in configuration -## Step 3: Configure Claude Desktop +## Step 2: Configure Claude Desktop -Add the OneUptime MCP server to your Claude Desktop configuration. - -### Find Your Configuration File +Find your Claude Desktop configuration file: **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` **Linux**: `~/.config/Claude/claude_desktop_config.json` -### Update Configuration +### For OneUptime Cloud -Add the following to your Claude Desktop configuration file: +Add the following configuration: ```json { "mcpServers": { "oneuptime": { - "command": "oneuptime-mcp", - "env": { - "ONEUPTIME_API_KEY": "your-api-key-here", - "ONEUPTIME_URL": "https://oneuptime.com" + "transport": "sse", + "url": "https://oneuptime.com/mcp/sse", + "headers": { + "x-api-key": "your-api-key-here" } } } } ``` -**For self-hosted OneUptime**, replace `https://oneuptime.com` with your instance URL. +### For Self-Hosted OneUptime -### Example Complete Configuration +Replace `oneuptime.com` with your OneUptime domain: ```json { "mcpServers": { "oneuptime": { - "command": "oneuptime-mcp", - "env": { - "ONEUPTIME_API_KEY": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "ONEUPTIME_URL": "https://my-company.oneuptime.com" + "transport": "sse", + "url": "https://your-oneuptime-domain.com/mcp/sse", + "headers": { + "x-api-key": "your-api-key-here" } } } } ``` -## Step 4: Restart Claude Desktop +## Step 3: Restart Claude Desktop Close and restart Claude Desktop for the configuration changes to take effect. -## Step 5: Test the Connection +That's it! You're ready to use the OneUptime MCP Server. + +## Step 4: Test the Connection Once Claude Desktop restarts, you can test the MCP server by asking Claude to: @@ -104,16 +96,10 @@ If you see permission errors, ensure your API key has the necessary permissions: ### Connection Issues If Claude can't connect to your OneUptime instance: -1. Verify your `ONEUPTIME_URL` is correct +1. Verify your OneUptime URL is correct 2. Check that your API key is valid 3. Ensure your OneUptime instance is accessible - -### MCP Server Not Found - -If you get "command not found" errors: -1. Verify the installation: `npm list -g @oneuptime/mcp-server` -2. Check your PATH includes npm global binaries -3. Try reinstalling: `npm install -g @oneuptime/mcp-server` +4. Test the health endpoint: `curl https://your-oneuptime-domain.com/mcp/health` ## Next Steps From 5eca1a5d043e90e69dde6f8ffb19a67cb4c57eca Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:21:47 +0000 Subject: [PATCH 32/46] refactor: Remove maxTokens from LLMCompletionRequest and related usages --- Common/Server/Utils/LLM/LLMService.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Common/Server/Utils/LLM/LLMService.ts b/Common/Server/Utils/LLM/LLMService.ts index 23dbbb4a9e..e59bbfec60 100644 --- a/Common/Server/Utils/LLM/LLMService.ts +++ b/Common/Server/Utils/LLM/LLMService.ts @@ -15,7 +15,6 @@ export interface LLMMessage { export interface LLMCompletionRequest { messages: Array; - maxTokens?: number; temperature?: number; llmProviderConfig: LLMProviderConfig; } @@ -80,7 +79,6 @@ export default class LLMService { content: msg.content, }; }), - max_tokens: request.maxTokens || 4096, temperature: request.temperature ?? 0.7, }, headers: { @@ -154,7 +152,6 @@ export default class LLMService { const requestData: JSONObject = { model: modelName, messages: userMessages, - max_tokens: request.maxTokens || 4096, temperature: request.temperature ?? 0.7, }; @@ -244,7 +241,6 @@ export default class LLMService { stream: false, options: { temperature: request.temperature ?? 0.7, - num_predict: request.maxTokens || 4096, }, }, headers: { From f92a109f3d73cae250bc8590ada5da19d0fde478 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:24:29 +0000 Subject: [PATCH 33/46] feat: Add MCP service configuration with volumes and debugging port --- docker-compose.dev.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 82b875a7ea..c12fda69f2 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -394,7 +394,23 @@ services: context: . dockerfile: ./IncomingRequestIngest/Dockerfile - + mcp: + volumes: + - ./MCP:/usr/src/app:cached + # Use node modules of the container and not host system. + # https://stackoverflow.com/questions/29181032/add-a-volume-to-docker-but-exclude-a-sub-folder + - /usr/src/app/node_modules/ + - ./Common:/usr/src/Common:cached + - /usr/src/Common/node_modules/ + ports: + - '9945:9229' # Debugging port. + extends: + file: ./docker-compose.base.yml + service: mcp + build: + network: host + context: . + dockerfile: ./MCP/Dockerfile # Fluentd. Required only for development. In production its the responsibility of the customer to run fluentd and pipe logs to OneUptime. # We run this container just for development, to see if logs are piped. From f15f797d4339d947ad5a128748a3484c4cf8ac25 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:27:02 +0000 Subject: [PATCH 34/46] refactor: Replace MCP server implementation with a streamlined structure and improved logging --- MCP/Index.ts | 583 ++++++++++++++++++++++++++------------------------- 1 file changed, 298 insertions(+), 285 deletions(-) diff --git a/MCP/Index.ts b/MCP/Index.ts index f6f29ef9f4..86fe6c2a17 100755 --- a/MCP/Index.ts +++ b/MCP/Index.ts @@ -8,7 +8,6 @@ import { ListToolsRequestSchema, McpError, } from "@modelcontextprotocol/sdk/types.js"; -import dotenv from "dotenv"; import Express, { ExpressApplication, ExpressRequest, @@ -22,259 +21,253 @@ import OneUptimeApiService, { } from "./Services/OneUptimeApiService"; import { McpToolInfo, OneUptimeToolCallArgs } from "./Types/McpTypes"; import OneUptimeOperation from "./Types/OneUptimeOperation"; -import MCPLogger from "./Utils/MCPLogger"; -import http from "http"; +import logger from "Common/Server/Utils/Logger"; +import App from "Common/Server/Utils/StartServer"; +import Telemetry from "Common/Server/Utils/Telemetry"; +import { PromiseVoidFunction } from "Common/Types/FunctionTypes"; +import "ejs"; -// Load environment variables -dotenv.config(); +const APP_NAME: string = "mcp"; -MCPLogger.info("OneUptime MCP Server is starting..."); +const app: ExpressApplication = Express.getExpressApp(); -class OneUptimeMCPServer { - private server: Server; - private tools: McpToolInfo[] = []; +// Store active SSE transports +const transports: Map = new Map(); - public constructor() { - this.server = new Server( - { - name: "oneuptime-mcp", - version: "1.0.0", - }, - { - capabilities: { - tools: {}, - }, +// MCP Server instance +let mcpServer: Server; +let tools: McpToolInfo[] = []; + +function initializeMCPServer(): void { + mcpServer = new Server( + { + name: "oneuptime-mcp", + version: "1.0.0", + }, + { + capabilities: { + tools: {}, }, + }, + ); + + initializeServices(); + generateTools(); + setupHandlers(); +} + +function initializeServices(): void { + // Initialize OneUptime API Service + const apiKey: string | undefined = process.env["ONEUPTIME_API_KEY"]; + if (!apiKey) { + throw new Error( + "OneUptime API key is required. Please set ONEUPTIME_API_KEY environment variable.", ); - - this.initializeServices(); - this.generateTools(); - this.setupHandlers(); } - private initializeServices(): void { - // Initialize OneUptime API Service - const apiKey: string | undefined = process.env["ONEUPTIME_API_KEY"]; - if (!apiKey) { - throw new Error( - "OneUptime API key is required. Please set ONEUPTIME_API_KEY environment variable.", - ); - } + const config: OneUptimeApiConfig = { + url: process.env["ONEUPTIME_URL"] || "https://oneuptime.com", + apiKey: apiKey, + }; - const config: OneUptimeApiConfig = { - url: process.env["ONEUPTIME_URL"] || "https://oneuptime.com", - apiKey: apiKey, - }; + OneUptimeApiService.initialize(config); + logger.info("OneUptime API Service initialized"); +} - OneUptimeApiService.initialize(config); - MCPLogger.info("OneUptime API Service initialized"); +function generateTools(): void { + try { + tools = DynamicToolGenerator.generateAllTools(); + logger.info(`Generated ${tools.length} OneUptime MCP tools`); + } catch (error) { + logger.error(`Failed to generate tools: ${error}`); + throw error; } +} - private generateTools(): void { - try { - this.tools = DynamicToolGenerator.generateAllTools(); - MCPLogger.info(`Generated ${this.tools.length} OneUptime MCP tools`); - } catch (error) { - MCPLogger.error(`Failed to generate tools: ${error}`); - throw error; - } - } +function setupHandlers(): void { + // List available tools + mcpServer.setRequestHandler(ListToolsRequestSchema, async () => { + const mcpTools: Array<{ + name: string; + description: string; + inputSchema: object; + }> = tools.map((tool: McpToolInfo) => { + return { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + }); + + logger.info(`Listing ${mcpTools.length} available tools`); + return { tools: mcpTools }; + }); + + // Handle tool calls + mcpServer.setRequestHandler( + CallToolRequestSchema, + async (request: { params: { name: string; arguments: unknown } }) => { + const { name, arguments: args } = request.params; + + try { + // Find the tool by name + const tool: McpToolInfo | undefined = tools.find((t: McpToolInfo) => { + return t.name === name; + }); + if (!tool) { + throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`); + } + + logger.info(`Executing tool: ${name} for model: ${tool.modelName}`); + + // Execute the OneUptime operation + const result: unknown = await OneUptimeApiService.executeOperation( + tool.tableName, + tool.operation, + tool.modelType, + tool.apiPath || "", + args as OneUptimeToolCallArgs, + ); + + // Format the response + const responseText: string = formatToolResponse( + tool, + result, + args as OneUptimeToolCallArgs, + ); - private setupHandlers(): void { - // List available tools - this.server.setRequestHandler(ListToolsRequestSchema, async () => { - const mcpTools: Array<{ - name: string; - description: string; - inputSchema: any; - }> = this.tools.map((tool: McpToolInfo) => { return { - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - }; - }); - - MCPLogger.info(`Listing ${mcpTools.length} available tools`); - return { tools: mcpTools }; - }); - - // Handle tool calls - this.server.setRequestHandler( - CallToolRequestSchema, - async (request: any) => { - const { name, arguments: args } = request.params; - - try { - // Find the tool by name - const tool: McpToolInfo | undefined = this.tools.find( - (t: McpToolInfo) => { - return t.name === name; + content: [ + { + type: "text", + text: responseText, }, - ); - if (!tool) { - throw new McpError( - ErrorCode.MethodNotFound, - `Unknown tool: ${name}`, - ); - } + ], + }; + } catch (error) { + logger.error(`Error executing tool ${name}: ${error}`); - MCPLogger.info( - `Executing tool: ${name} for model: ${tool.modelName}`, - ); - - // Execute the OneUptime operation - const result: any = await OneUptimeApiService.executeOperation( - tool.tableName, - tool.operation, - tool.modelType, - tool.apiPath || "", - args as OneUptimeToolCallArgs, - ); - - // Format the response - const responseText: string = this.formatToolResponse( - tool, - result, - args as OneUptimeToolCallArgs, - ); - - return { - content: [ - { - type: "text", - text: responseText, - }, - ], - }; - } catch (error) { - MCPLogger.error(`Error executing tool ${name}: ${error}`); - - if (error instanceof McpError) { - throw error; - } - - throw new McpError( - ErrorCode.InternalError, - `Failed to execute ${name}: ${error}`, - ); + if (error instanceof McpError) { + throw error; } + + throw new McpError( + ErrorCode.InternalError, + `Failed to execute ${name}: ${error}`, + ); + } + }, + ); +} + +function formatToolResponse( + tool: McpToolInfo, + result: unknown, + args: OneUptimeToolCallArgs, +): string { + const operation: OneUptimeOperation = tool.operation; + const modelName: string = tool.singularName; + const pluralName: string = tool.pluralName; + + switch (operation) { + case OneUptimeOperation.Create: + return `Successfully created ${modelName}: ${JSON.stringify(result, null, 2)}`; + + case OneUptimeOperation.Read: + if (result) { + return `Retrieved ${modelName} (ID: ${args.id}): ${JSON.stringify(result, null, 2)}`; + } + return `${modelName} not found with ID: ${args.id}`; + + case OneUptimeOperation.List: { + const items: Array = Array.isArray(result) + ? result + : (result as { data?: Array })?.data || []; + const count: number = items.length; + const summary: string = `Found ${count} ${count === 1 ? modelName : pluralName}`; + + if (count === 0) { + return `${summary}. No items match the criteria.`; + } + + const limitedItems: Array = items.slice(0, 5); // Show first 5 items + const itemsText: string = limitedItems + .map((item: unknown, index: number) => { + return `${index + 1}. ${JSON.stringify(item, null, 2)}`; + }) + .join("\n"); + + const hasMore: string = + count > 5 ? `\n... and ${count - 5} more items` : ""; + return `${summary}:\n${itemsText}${hasMore}`; + } + + case OneUptimeOperation.Update: + return `Successfully updated ${modelName} (ID: ${args.id}): ${JSON.stringify(result, null, 2)}`; + + case OneUptimeOperation.Delete: + return `Successfully deleted ${modelName} (ID: ${args.id})`; + + case OneUptimeOperation.Count: { + const totalCount: number = + (result as { count?: number })?.count || (result as number) || 0; + return `Total count of ${pluralName}: ${totalCount}`; + } + + default: + return `Operation ${operation} completed successfully: ${JSON.stringify(result, null, 2)}`; + } +} + +// Setup MCP-specific routes +function setupMCPRoutes(): void { + const ROUTE_PREFIXES: Array = [`/${APP_NAME}`, "/"]; + + // SSE endpoint for MCP connections + for (const prefix of ROUTE_PREFIXES) { + app.get( + `${prefix === "/" ? "" : prefix}/sse`, + async (req: ExpressRequest, res: ExpressResponse) => { + logger.info("New SSE connection established"); + + // Set SSE headers + res.setHeader("Content-Type", "text/event-stream"); + res.setHeader("Cache-Control", "no-cache"); + res.setHeader("Connection", "keep-alive"); + res.setHeader("Access-Control-Allow-Origin", "*"); + + // Create SSE transport + const messageEndpoint: string = + prefix === "/" ? "/message" : `${prefix}/message`; + const transport: SSEServerTransport = new SSEServerTransport( + messageEndpoint, + res, + ); + + // Store transport with session ID + const sessionId: string = `session-${Date.now()}-${Math.random().toString(36).substring(7)}`; + transports.set(sessionId, transport); + + // Handle connection close + req.on("close", () => { + logger.info(`SSE connection closed: ${sessionId}`); + transports.delete(sessionId); + }); + + // Connect server to transport + await mcpServer.connect(transport); }, ); - } - - private formatToolResponse( - tool: McpToolInfo, - result: any, - args: OneUptimeToolCallArgs, - ): string { - const operation: OneUptimeOperation = tool.operation; - const modelName: string = tool.singularName; - const pluralName: string = tool.pluralName; - - switch (operation) { - case OneUptimeOperation.Create: - return `✅ Successfully created ${modelName}: ${JSON.stringify(result, null, 2)}`; - - case OneUptimeOperation.Read: - if (result) { - return `📋 Retrieved ${modelName} (ID: ${args.id}): ${JSON.stringify(result, null, 2)}`; - } - return `❌ ${modelName} not found with ID: ${args.id}`; - - case OneUptimeOperation.List: { - const items: any[] = Array.isArray(result) - ? result - : result?.data || []; - const count: number = items.length; - const summary: string = `📊 Found ${count} ${count === 1 ? modelName : pluralName}`; - - if (count === 0) { - return `${summary}. No items match the criteria.`; - } - - const limitedItems: any[] = items.slice(0, 5); // Show first 5 items - const itemsText: string = limitedItems - .map((item: any, index: number) => { - return `${index + 1}. ${JSON.stringify(item, null, 2)}`; - }) - .join("\n"); - - const hasMore: string = - count > 5 ? `\n... and ${count - 5} more items` : ""; - return `${summary}:\n${itemsText}${hasMore}`; - } - - case OneUptimeOperation.Update: - return `✅ Successfully updated ${modelName} (ID: ${args.id}): ${JSON.stringify(result, null, 2)}`; - - case OneUptimeOperation.Delete: - return `🗑️ Successfully deleted ${modelName} (ID: ${args.id})`; - - case OneUptimeOperation.Count: { - const totalCount: number = result?.count || result || 0; - return `📊 Total count of ${pluralName}: ${totalCount}`; - } - - default: - return `✅ Operation ${operation} completed successfully: ${JSON.stringify(result, null, 2)}`; - } - } - - public async run(): Promise { - const portString: string | undefined = process.env["PORT"]; - const port: number = portString ? parseInt(portString, 10) : 3405; - - Express.setupExpress(); - const app: ExpressApplication = Express.getExpressApp(); - - // Store active SSE transports - const transports: Map = new Map(); - - // Health check endpoint - app.get("/health", (_req: ExpressRequest, res: ExpressResponse) => { - res.json({ - status: "healthy", - service: "oneuptime-mcp", - tools: this.tools.length, - }); - }); - - // SSE endpoint for MCP connections - app.get("/sse", async (req: ExpressRequest, res: ExpressResponse) => { - MCPLogger.info("New SSE connection established"); - - // Set SSE headers - res.setHeader("Content-Type", "text/event-stream"); - res.setHeader("Cache-Control", "no-cache"); - res.setHeader("Connection", "keep-alive"); - res.setHeader("Access-Control-Allow-Origin", "*"); - - // Create SSE transport - const transport: SSEServerTransport = new SSEServerTransport( - "/message", - res, - ); - - // Store transport with session ID - const sessionId: string = `session-${Date.now()}-${Math.random().toString(36).substring(7)}`; - transports.set(sessionId, transport); - - // Handle connection close - req.on("close", () => { - MCPLogger.info(`SSE connection closed: ${sessionId}`); - transports.delete(sessionId); - }); - - // Connect server to transport - await this.server.connect(transport); - }); // Message endpoint for client-to-server messages app.post( - "/message", + `${prefix === "/" ? "" : prefix}/message`, ExpressJson(), - async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { + async ( + req: ExpressRequest, + res: ExpressResponse, + next: NextFunction, + ) => { try { // Find the transport for this session // In a real implementation, you'd use session management @@ -293,66 +286,86 @@ class OneUptimeMCPServer { ); // List tools endpoint (REST API) - app.get("/tools", (_req: ExpressRequest, res: ExpressResponse) => { - const toolsList: Array<{ - name: string; - description: string; - }> = this.tools.map((tool: McpToolInfo) => { - return { - name: tool.name, - description: tool.description, - }; - }); - res.json({ tools: toolsList, count: toolsList.length }); - }); - - // Create HTTP server - const httpServer: http.Server = http.createServer(app); - - httpServer.listen(port, () => { - MCPLogger.info(`OneUptime MCP Server is running on port ${port}`); - MCPLogger.info(`Available tools: ${this.tools.length} total`); - MCPLogger.info(`Health check: http://localhost:${port}/health`); - MCPLogger.info(`Tools list: http://localhost:${port}/tools`); - MCPLogger.info(`SSE endpoint: http://localhost:${port}/sse`); - - // Log some example tools - const exampleTools: string[] = this.tools - .slice(0, 5) - .map((t: McpToolInfo) => { - return t.name; + app.get( + `${prefix === "/" ? "" : prefix}/tools`, + (_req: ExpressRequest, res: ExpressResponse) => { + const toolsList: Array<{ + name: string; + description: string; + }> = tools.map((tool: McpToolInfo) => { + return { + name: tool.name, + description: tool.description, + }; }); - MCPLogger.info(`Example tools: ${exampleTools.join(", ")}`); - }); + res.json({ tools: toolsList, count: toolsList.length }); + }, + ); + + // Health check endpoint (in addition to standard status endpoints) + app.get( + `${prefix === "/" ? "" : prefix}/health`, + (_req: ExpressRequest, res: ExpressResponse) => { + res.json({ + status: "healthy", + service: "oneuptime-mcp", + tools: tools.length, + }); + }, + ); } } -// Start the server -async function main(): Promise { +const init: PromiseVoidFunction = async (): Promise => { try { - const mcpServer: OneUptimeMCPServer = new OneUptimeMCPServer(); - await mcpServer.run(); - } catch (error) { - MCPLogger.error(`Failed to start MCP server: ${error}`); - process.exit(1); + // Initialize telemetry + Telemetry.init({ + serviceName: APP_NAME, + }); + + // Simple status check for MCP (no database connections) + const statusCheck: PromiseVoidFunction = async (): Promise => { + // MCP server doesn't connect to databases directly + // Just verify the server is running + return Promise.resolve(); + }; + + // Initialize the app with service name and status checks + await App.init({ + appName: APP_NAME, + statusOptions: { + liveCheck: statusCheck, + readyCheck: statusCheck, + }, + }); + + // Initialize MCP server + initializeMCPServer(); + + // Setup MCP-specific routes + setupMCPRoutes(); + + // Add default routes to the app + await App.addDefaultRoutes(); + + logger.info(`OneUptime MCP Server started successfully`); + logger.info(`Available tools: ${tools.length} total`); + + // Log some example tools + const exampleTools: string[] = tools.slice(0, 5).map((t: McpToolInfo) => { + return t.name; + }); + logger.info(`Example tools: ${exampleTools.join(", ")}`); + } catch (err) { + logger.error("MCP Server Init Failed:"); + logger.error(err); + throw err; } -} +}; -// Handle graceful shutdown -process.on("SIGINT", () => { - MCPLogger.info("Received SIGINT, shutting down gracefully..."); - process.exit(0); -}); - -process.on("SIGTERM", () => { - MCPLogger.info("Received SIGTERM, shutting down gracefully..."); - process.exit(0); -}); - -// Start the server -main().catch((error: unknown) => { - const errorMessage: string = - error instanceof Error ? error.message : String(error); - MCPLogger.error(`Unhandled error: ${errorMessage}`); +// Call the initialization function and handle errors +init().catch((err: Error) => { + logger.error(err); + logger.error("Exiting node process"); process.exit(1); }); From 4c577c7dfa4317397c1f9457635516f50bc3375d Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:30:50 +0000 Subject: [PATCH 35/46] fix: Allow any type for request parameters in tool call handler --- MCP/Index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MCP/Index.ts b/MCP/Index.ts index 86fe6c2a17..2327659c66 100755 --- a/MCP/Index.ts +++ b/MCP/Index.ts @@ -106,7 +106,8 @@ function setupHandlers(): void { // Handle tool calls mcpServer.setRequestHandler( CallToolRequestSchema, - async (request: { params: { name: string; arguments: unknown } }) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async (request: any) => { const { name, arguments: args } = request.params; try { From fbdedaacc32703e98e5def97c9547c59ebbfff9e Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:33:05 +0000 Subject: [PATCH 36/46] chore: update dependencies in package.json - Upgraded @modelcontextprotocol/sdk from ^0.6.0 to ^1.25.0 - Updated ts-node from ^10.9.1 to ^10.9.2 - Upgraded devDependencies: - @types/jest from ^27.5.0 to ^29.5.14 - @types/node from ^17.0.31 to ^22.15.21 - jest from ^28.1.0 to ^29.7.0 - nodemon from ^2.0.20 to ^3.1.11 - ts-jest from ^28.0.2 to ^29.4.6 - typescript from ^5.8.3 to ^5.9.3 --- MCP/package-lock.json | 2847 ++++++++++++++++++++++++++++------------- MCP/package.json | 17 +- 2 files changed, 1956 insertions(+), 908 deletions(-) diff --git a/MCP/package-lock.json b/MCP/package-lock.json index 45fd95f095..f5ceff3479 100644 --- a/MCP/package-lock.json +++ b/MCP/package-lock.json @@ -9,21 +9,20 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/sdk": "^0.6.0", + "@modelcontextprotocol/sdk": "^1.25.0", "Common": "file:../Common", - "dotenv": "^16.4.5", - "ts-node": "^10.9.1" + "ts-node": "^10.9.2" }, "bin": { "oneuptime-mcp": "Index.ts" }, "devDependencies": { - "@types/jest": "^27.5.0", - "@types/node": "^17.0.31", - "jest": "^28.1.0", - "nodemon": "^2.0.20", - "ts-jest": "^28.0.2", - "typescript": "^5.8.3" + "@types/jest": "^29.5.14", + "@types/node": "^22.15.21", + "jest": "^29.7.0", + "nodemon": "^3.1.11", + "ts-jest": "^29.4.6", + "typescript": "^5.9.3" } }, "../Common": { @@ -161,20 +160,10 @@ "ts-jest": "^28.0.5" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { @@ -187,7 +176,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.7", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -195,21 +186,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.7", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -224,20 +216,17 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/generator": { - "version": "7.27.5", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -246,6 +235,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -259,8 +250,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -272,13 +275,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -289,6 +294,8 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -297,6 +304,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -304,7 +313,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -313,6 +324,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -320,23 +333,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.6", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.7", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.7" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -347,6 +364,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { @@ -358,6 +377,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", "dependencies": { @@ -369,6 +390,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { @@ -380,6 +403,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { @@ -394,6 +419,8 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { @@ -408,6 +435,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { @@ -419,6 +448,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { @@ -428,8 +459,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { @@ -441,6 +490,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -452,6 +503,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { @@ -463,6 +516,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { @@ -474,6 +529,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -485,6 +542,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { @@ -496,6 +555,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { @@ -510,6 +571,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { @@ -524,6 +587,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -538,6 +603,8 @@ }, "node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -550,29 +617,33 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.7", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.7", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -580,6 +651,8 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, @@ -601,8 +674,22 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@hono/node-server": { + "version": "1.19.7", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz", + "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -618,6 +705,8 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -625,58 +714,61 @@ } }, "node_modules/@jest/console": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -687,113 +779,96 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/environment": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3" + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^28.0.2" + "jest-get-type": "^29.6.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -801,21 +876,20 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -827,88 +901,100 @@ } }, "node_modules/@jest/schemas": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "28.1.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^28.1.3", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -916,20 +1002,29 @@ "chalk": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -939,20 +1034,14 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -961,21 +1050,55 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "0.6.1", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.0.tgz", + "integrity": "sha512-z0Zhn/LmQ3yz91dEfd5QgS7DpSjA4pk+3z2++zKgn5L6iDFM9QapsVoAQSbKLvlrFsZk9+ru6yHHWNq2lCYJKQ==", "license": "MIT", "dependencies": { + "@hono/node-server": "^1.19.7", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", - "zod": "^3.23.8" + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } } }, "node_modules/@sinclair/typebox": { - "version": "0.24.51", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, "license": "MIT" }, "node_modules/@sinonjs/commons": { - "version": "1.8.6", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -983,11 +1106,13 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@tsconfig/node10": { @@ -1008,6 +1133,8 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -1020,6 +1147,8 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -1028,6 +1157,8 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -1036,15 +1167,19 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.7", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/graceful-fs": { "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1053,11 +1188,15 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -1066,6 +1205,8 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1073,31 +1214,37 @@ } }, "node_modules/@types/jest": { - "version": "27.5.2", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/node": { - "version": "17.0.45", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "license": "MIT", - "peer": true - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "dev": true, - "license": "MIT" + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } }, "node_modules/@types/stack-utils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -1106,13 +1253,27 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.15.0", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1130,8 +1291,43 @@ "node": ">=0.4.0" } }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1146,6 +1342,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -1154,6 +1352,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -1184,6 +1384,8 @@ }, "node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -1191,20 +1393,22 @@ } }, "node_modules/babel-jest": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "^28.1.3", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" @@ -1212,6 +1416,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1225,8 +1431,27 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { @@ -1236,11 +1461,13 @@ "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -1261,19 +1488,21 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -1284,6 +1513,16 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.7.tgz", + "integrity": "sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "dev": true, @@ -1295,6 +1534,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "dev": true, @@ -1316,7 +1579,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -1335,10 +1600,11 @@ "license": "MIT", "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1360,6 +1626,8 @@ }, "node_modules/bser": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1368,6 +1636,8 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, @@ -1378,8 +1648,39 @@ "node": ">= 0.8" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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": { @@ -1388,6 +1689,8 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -1395,7 +1698,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001726", + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", "dev": true, "funding": [ { @@ -1415,6 +1720,8 @@ }, "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": { @@ -1430,6 +1737,8 @@ }, "node_modules/char-regex": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -1461,6 +1770,8 @@ }, "node_modules/ci-info": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -1475,11 +1786,15 @@ }, "node_modules/cjs-module-lexer": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1493,6 +1808,8 @@ }, "node_modules/co": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { @@ -1501,12 +1818,16 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, "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": { @@ -1518,6 +1839,8 @@ }, "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" }, @@ -1530,6 +1853,19 @@ "dev": true, "license": "MIT" }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/content-type": { "version": "1.0.5", "license": "MIT", @@ -1538,17 +1874,71 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -1560,8 +1950,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "dev": true, + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1576,12 +1967,24 @@ } }, "node_modules/dedent": { - "version": "0.7.0", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -1597,6 +2000,8 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -1611,30 +2016,46 @@ } }, "node_modules/diff-sequences": { - "version": "27.5.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dotenv": { - "version": "16.6.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, - "funding": { - "url": "https://dotenvx.com" + "engines": { + "node": ">= 0.4" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, "node_modules/electron-to-chromium": { - "version": "1.5.177", + "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==", "dev": true, "license": "ISC" }, "node_modules/emittery": { - "version": "0.10.2", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -1646,27 +2067,80 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/error-ex": { - "version": "1.3.2", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { @@ -1675,6 +2149,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -1685,8 +2161,40 @@ "node": ">=4" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { @@ -1709,90 +2217,93 @@ }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, "engines": { - "node": ">=10" + "node": ">= 18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/expect/node_modules/diff-sequences": { - "version": "28.1.1", - "dev": true, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/expect/node_modules/jest-diff": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "node": ">= 16" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/expect/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "peerDependencies": { + "express": ">= 4.11" } }, - "node_modules/expect/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/expect/node_modules/react-is": { - "version": "18.3.1", - "dev": true, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { @@ -1800,8 +2311,26 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fb-watchman": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1819,8 +2348,31 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -1831,8 +2383,28 @@ "node": ">=8" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, @@ -1850,7 +2422,8 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "dev": true, + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1858,6 +2431,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -1866,22 +2441,65 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { @@ -1893,6 +2511,9 @@ }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -1921,30 +2542,73 @@ "node": ">= 6" } }, - "node_modules/globals": { - "version": "11.12.0", - "dev": true, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "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/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", - "dev": true, + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1953,27 +2617,47 @@ "node": ">= 0.4" } }, + "node_modules/hono": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.1.tgz", + "integrity": "sha512-KsFcH0xxHes0J4zaQgWbYwmz3UPOOskdqZmItstUG93+Wk1ePBLkLGwbP9zlmh1BFUiL8Qp+Xfu9P7feJWpGNg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1981,13 +2665,19 @@ } }, "node_modules/iconv-lite": { - "version": "0.6.3", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ignore-by-default": { @@ -1997,6 +2687,8 @@ }, "node_modules/import-local": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -2015,6 +2707,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -2023,6 +2717,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -2034,8 +2731,19 @@ "version": "2.0.4", "license": "ISC" }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, @@ -2052,6 +2760,8 @@ }, "node_modules/is-core-module": { "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -2074,6 +2784,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -2082,6 +2794,8 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -2107,8 +2821,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -2120,11 +2842,12 @@ }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -2132,22 +2855,39 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2161,6 +2901,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2173,7 +2915,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2185,21 +2929,23 @@ } }, "node_modules/jest": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^28.1.3" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -2211,135 +2957,76 @@ } }, "node_modules/jest-changed-files": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "28.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/jest-cli": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -2351,35 +3038,37 @@ } }, "node_modules/jest-config": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", @@ -2394,289 +3083,176 @@ } } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-config/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/jest-diff": { - "version": "27.5.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/jest-get-type": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "28.1.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/jest-environment-node": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "28.0.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-leak-detector": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/jest-matcher-utils": { - "version": "27.5.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/jest-mock": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -2692,208 +3268,153 @@ } }, "node_modules/jest-regex-util": { - "version": "28.0.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.3", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "28.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -2904,11 +3425,13 @@ } }, "node_modules/jest-util": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -2916,38 +3439,31 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -2957,58 +3473,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/jest-watcher": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3021,8 +3525,19 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, @@ -3042,6 +3557,8 @@ }, "node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -3053,11 +3570,27 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -3069,6 +3602,8 @@ }, "node_modules/kleur": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { @@ -3077,6 +3612,8 @@ }, "node_modules/leven": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { @@ -3085,11 +3622,15 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -3106,6 +3647,8 @@ }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -3114,6 +3657,8 @@ }, "node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -3127,7 +3672,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3143,19 +3690,55 @@ }, "node_modules/makeerror": { "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -3166,8 +3749,35 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { @@ -3185,38 +3795,71 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.3", - "dev": true, "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, "node_modules/node-int64": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, "node_modules/nodemon": { - "version": "2.0.22", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -3225,21 +3868,13 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "dev": true, @@ -3249,11 +3884,16 @@ } }, "node_modules/nodemon/node_modules/semver": { - "version": "5.7.2", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/nodemon/node_modules/supports-color": { @@ -3277,6 +3917,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { @@ -3286,9 +3928,43 @@ "node": ">=8" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", - "dev": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -3296,6 +3972,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { @@ -3310,6 +3988,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3324,6 +4004,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -3335,6 +4017,8 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -3349,6 +4033,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -3357,6 +4043,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -3372,8 +4060,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -3382,6 +4081,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -3390,7 +4091,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3398,11 +4098,25 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, @@ -3419,14 +4133,27 @@ }, "node_modules/pirates": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3437,20 +4164,24 @@ } }, "node_modules/pretty-format": { - "version": "27.5.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "react-is": "^18.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -3462,6 +4193,8 @@ }, "node_modules/prompts": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3472,26 +4205,84 @@ "node": ">= 6" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/pstree.remy": { "version": "1.1.8", "dev": true, "license": "MIT" }, - "node_modules/raw-body": { - "version": "3.0.0", - "license": "MIT", + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" + "side-channel": "^1.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/react-is": { - "version": "17.0.2", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, @@ -3508,18 +4299,31 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { - "version": "1.22.10", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3535,6 +4339,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -3546,6 +4352,8 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -3553,25 +4361,29 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 18" } }, "node_modules/safer-buffer": { @@ -3580,19 +4392,65 @@ }, "node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3603,43 +4461,127 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/simple-update-notifier": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" } }, "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/sisteransi": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -3648,6 +4590,8 @@ }, "node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3656,6 +4600,8 @@ }, "node_modules/source-map-support": { "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { @@ -3665,11 +4611,15 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3680,7 +4630,9 @@ } }, "node_modules/statuses": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3688,6 +4640,8 @@ }, "node_modules/string-length": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3700,6 +4654,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -3713,6 +4669,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -3724,6 +4682,8 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -3732,6 +4692,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { @@ -3740,6 +4702,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -3751,6 +4715,8 @@ }, "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": { @@ -3760,20 +4726,10 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -3783,23 +4739,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -3813,6 +4756,8 @@ }, "node_modules/tmpl": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, "license": "BSD-3-Clause" }, @@ -3843,36 +4788,44 @@ } }, "node_modules/ts-jest": { - "version": "28.0.8", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^28.0.0", - "babel-jest": "^28.0.0", - "jest": "^28.0.0", - "typescript": ">=4.3" + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -3881,11 +4834,16 @@ }, "esbuild": { "optional": true + }, + "jest-util": { + "optional": true } } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3895,6 +4853,19 @@ "node": ">=10" } }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-node": { "version": "10.9.2", "license": "MIT", @@ -3939,6 +4910,8 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { @@ -3947,6 +4920,8 @@ }, "node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -3956,8 +4931,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { - "version": "5.8.3", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", "peer": true, "bin": { @@ -3968,11 +4959,31 @@ "node": ">=14.17" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "dev": true, "license": "MIT" }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/unpipe": { "version": "1.0.0", "license": "MIT", @@ -3981,7 +4992,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", "dev": true, "funding": [ { @@ -4015,6 +5028,8 @@ }, "node_modules/v8-to-istanbul": { "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { @@ -4026,13 +5041,19 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/walker": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4041,7 +5062,6 @@ }, "node_modules/which": { "version": "2.0.2", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4053,8 +5073,17 @@ "node": ">= 8" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4071,11 +5100,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", "dependencies": { @@ -4088,6 +5120,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -4096,11 +5130,15 @@ }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -4133,6 +5171,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -4151,6 +5191,15 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } } } } diff --git a/MCP/package.json b/MCP/package.json index f40e6cd490..342b54e686 100644 --- a/MCP/package.json +++ b/MCP/package.json @@ -24,17 +24,16 @@ "author": "OneUptime (https://oneuptime.com/)", "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/sdk": "^0.6.0", + "@modelcontextprotocol/sdk": "^1.25.0", "Common": "file:../Common", - "dotenv": "^16.4.5", - "ts-node": "^10.9.1" + "ts-node": "^10.9.2" }, "devDependencies": { - "@types/jest": "^27.5.0", - "@types/node": "^17.0.31", - "jest": "^28.1.0", - "nodemon": "^2.0.20", - "ts-jest": "^28.0.2", - "typescript": "^5.8.3" + "@types/jest": "^29.5.14", + "@types/node": "^22.15.21", + "jest": "^29.7.0", + "nodemon": "^3.1.11", + "ts-jest": "^29.4.6", + "typescript": "^5.9.3" } } From 2fb8239fe92ad84d98052d0f1c76266de97652fd Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:34:02 +0000 Subject: [PATCH 37/46] refactor: Simplify tsconfig structure in jest.config.json --- MCP/jest.config.json | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/MCP/jest.config.json b/MCP/jest.config.json index e5a3c37d53..2d0d5905ae 100644 --- a/MCP/jest.config.json +++ b/MCP/jest.config.json @@ -21,13 +21,11 @@ "transform": { "^.+\\.ts$": ["ts-jest", { "tsconfig": { - "compilerOptions": { - "noUnusedLocals": false, - "noUnusedParameters": false, - "strict": false, - "noPropertyAccessFromIndexSignature": false, - "module": "commonjs" - } + "noUnusedLocals": false, + "noUnusedParameters": false, + "strict": false, + "noPropertyAccessFromIndexSignature": false, + "module": "commonjs" } }] } From 9b714bbe2991b6c546b9c4ac61b894709a0dcb7a Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:42:56 +0000 Subject: [PATCH 38/46] refactor: Improve type definitions and enhance JSON schema handling in MCP services --- MCP/Index.ts | 4 +- MCP/Services/OneUptimeApiService.ts | 177 ++++++++++++++++++---------- MCP/Types/McpTypes.ts | 42 ++++++- MCP/Utils/DynamicToolGenerator.ts | 87 +++++++++++--- 4 files changed, 226 insertions(+), 84 deletions(-) diff --git a/MCP/Index.ts b/MCP/Index.ts index 2327659c66..870b72e3c1 100755 --- a/MCP/Index.ts +++ b/MCP/Index.ts @@ -4,6 +4,7 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; import { CallToolRequestSchema, + CallToolRequest, ErrorCode, ListToolsRequestSchema, McpError, @@ -106,8 +107,7 @@ function setupHandlers(): void { // Handle tool calls mcpServer.setRequestHandler( CallToolRequestSchema, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async (request: any) => { + async (request: CallToolRequest) => { const { name, arguments: args } = request.params; try { diff --git a/MCP/Services/OneUptimeApiService.ts b/MCP/Services/OneUptimeApiService.ts index d84e403d0c..0c15b0e76e 100644 --- a/MCP/Services/OneUptimeApiService.ts +++ b/MCP/Services/OneUptimeApiService.ts @@ -8,7 +8,7 @@ import Route from "Common/Types/API/Route"; import Headers from "Common/Types/API/Headers"; import HTTPResponse from "Common/Types/API/HTTPResponse"; import HTTPErrorResponse from "Common/Types/API/HTTPErrorResponse"; -import { JSONObject } from "Common/Types/JSON"; +import { JSONObject, JSONValue } from "Common/Types/JSON"; import DatabaseModels from "Common/Models/DatabaseModels/Index"; import AnalyticsModels from "Common/Models/AnalyticsModels/Index"; import { ModelSchema } from "Common/Utils/Schema/ModelSchema"; @@ -17,12 +17,43 @@ import { getTableColumns } from "Common/Types/Database/TableColumn"; import Permission from "Common/Types/Permission"; import Protocol from "Common/Types/API/Protocol"; import Hostname from "Common/Types/API/Hostname"; +import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel"; +import AnalyticsBaseModel from "Common/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel"; export interface OneUptimeApiConfig { url: string; apiKey: string; } +// Type for model constructor +type ModelConstructor = new () => T; + +// Type for model class with table name +interface ModelWithTableName { + tableName: string; + getColumnAccessControlForAllColumns?: () => Record< + string, + ColumnAccessControl + >; +} + +// Type for column access control +interface ColumnAccessControl { + read?: Permission[]; + create?: Permission[]; + update?: Permission[]; +} + +// Type for table columns +type TableColumns = Record; + +// Type for Zod schema shape (shape can be an object or a function returning an object) +interface ZodSchemaWithShape { + _def?: { + shape?: Record | (() => Record); + }; +} + export default class OneUptimeApiService { private static api: API; private static config: OneUptimeApiConfig; @@ -60,7 +91,7 @@ export default class OneUptimeApiService { modelType: ModelType, apiPath: string, args: OneUptimeToolCallArgs, - ): Promise { + ): Promise { if (!this.api) { throw new Error( "OneUptime API Service not initialized. Please call initialize() first.", @@ -69,9 +100,9 @@ export default class OneUptimeApiService { this.validateOperationArgs(operation, args); - const route: any = this.buildApiRoute(apiPath, operation, args.id); - const headers: any = this.getHeaders(); - const data: any = this.getRequestData( + const route: Route = this.buildApiRoute(apiPath, operation, args.id); + const headers: Headers = this.getHeaders(); + const data: JSONObject | undefined = this.getRequestData( operation, args, tableName, @@ -83,35 +114,35 @@ export default class OneUptimeApiService { ); try { - let response: HTTPResponse | HTTPErrorResponse; + let response: HTTPResponse | HTTPErrorResponse; // Create a direct URL to avoid base route accumulation const url: URL = new URL(this.api.protocol, this.api.hostname, route); + // Build request options, only including data if it's defined + const baseOptions: { url: URL; headers: Headers } = { + url: url, + headers: headers, + }; + switch (operation) { case OneUptimeOperation.Create: case OneUptimeOperation.Count: case OneUptimeOperation.List: case OneUptimeOperation.Read: - response = await API.post({ - url: url, - data: data, - headers: headers, - }); + response = await API.post( + data ? { ...baseOptions, data: data } : baseOptions, + ); break; case OneUptimeOperation.Update: - response = await API.put({ - url: url, - data: data, - headers: headers, - }); + response = await API.put( + data ? { ...baseOptions, data: data } : baseOptions, + ); break; case OneUptimeOperation.Delete: - response = await API.delete({ - url: url, - data: data, - headers: headers, - }); + response = await API.delete( + data ? { ...baseOptions, data: data } : baseOptions, + ); break; default: throw new Error(`Unsupported operation: ${operation}`); @@ -190,7 +221,7 @@ export default class OneUptimeApiService { if ( !["id", "query", "select", "skip", "limit", "sort"].includes(key) ) { - createData[key] = value; + createData[key] = value as JSONValue; } } return { data: createData } as JSONObject; @@ -202,14 +233,14 @@ export default class OneUptimeApiService { if ( !["id", "query", "select", "skip", "limit", "sort"].includes(key) ) { - updateData[key] = value; + updateData[key] = value as JSONValue; } } return { data: updateData } as JSONObject; } case OneUptimeOperation.List: case OneUptimeOperation.Count: { - const generatedSelect: any = + const generatedSelect: JSONObject = args.select || this.generateAllFieldsSelect(tableName, modelType); const requestData: JSONObject = { query: args.query || {}, @@ -225,7 +256,7 @@ export default class OneUptimeApiService { return requestData; } case OneUptimeOperation.Read: { - const readSelect: any = + const readSelect: JSONObject = args.select || this.generateAllFieldsSelect(tableName, modelType); const readRequestData: JSONObject = { select: readSelect, @@ -254,37 +285,50 @@ export default class OneUptimeApiService { ); try { - let ModelClass: any = null; + let ModelClass: + | ModelConstructor + | ModelConstructor + | null = null; // Find the model class by table name if (modelType === ModelType.Database) { MCPLogger.info(`Searching DatabaseModels for tableName: ${tableName}`); - ModelClass = DatabaseModels.find((Model: any) => { - try { - const instance: any = new Model(); - const instanceTableName: string = instance.tableName; - MCPLogger.info( - `Checking model ${Model.name} with tableName: ${instanceTableName}`, - ); - return instanceTableName === tableName; - } catch (error) { - MCPLogger.warn(`Error instantiating model ${Model.name}: ${error}`); - return false; - } - }); + ModelClass = + (DatabaseModels.find( + (Model: ModelConstructor): boolean => { + try { + const instance: ModelWithTableName = + new Model() as unknown as ModelWithTableName; + const instanceTableName: string = instance.tableName; + MCPLogger.info( + `Checking model ${Model.name} with tableName: ${instanceTableName}`, + ); + return instanceTableName === tableName; + } catch (error) { + MCPLogger.warn( + `Error instantiating model ${Model.name}: ${error}`, + ); + return false; + } + }, + ) as ModelConstructor | undefined) || null; } else if (modelType === ModelType.Analytics) { MCPLogger.info(`Searching AnalyticsModels for tableName: ${tableName}`); - ModelClass = AnalyticsModels.find((Model: any) => { - try { - const instance: any = new Model(); - return instance.tableName === tableName; - } catch (error) { - MCPLogger.warn( - `Error instantiating analytics model ${Model.name}: ${error}`, - ); - return false; - } - }); + ModelClass = + (AnalyticsModels.find( + (Model: ModelConstructor): boolean => { + try { + const instance: ModelWithTableName = + new Model() as unknown as ModelWithTableName; + return instance.tableName === tableName; + } catch (error) { + MCPLogger.warn( + `Error instantiating analytics model ${Model.name}: ${error}`, + ); + return false; + } + }, + ) as ModelConstructor | undefined) || null; } if (!ModelClass) { @@ -300,8 +344,11 @@ export default class OneUptimeApiService { // Try to get raw table columns first (most reliable approach) try { - const modelInstance: any = new ModelClass(); - const tableColumns: any = getTableColumns(modelInstance); + const modelInstance: ModelWithTableName = + new ModelClass() as unknown as ModelWithTableName; + const tableColumns: TableColumns = getTableColumns( + modelInstance as BaseModel, + ); const columnNames: string[] = Object.keys(tableColumns); MCPLogger.info( @@ -310,13 +357,16 @@ export default class OneUptimeApiService { if (columnNames.length > 0) { // Get access control information to filter out restricted fields - const accessControlForColumns: any = - modelInstance.getColumnAccessControlForAllColumns(); + const accessControlForColumns: Record = + modelInstance.getColumnAccessControlForAllColumns + ? modelInstance.getColumnAccessControlForAllColumns() + : {}; const selectObject: JSONObject = {}; let filteredCount: number = 0; for (const columnName of columnNames) { - const accessControl: any = accessControlForColumns[columnName]; + const accessControl: ColumnAccessControl | undefined = + accessControlForColumns[columnName]; /* * Include the field if: @@ -363,27 +413,32 @@ export default class OneUptimeApiService { } // Fallback to schema approach if table columns fail - let selectSchema: any; + let selectSchema: ZodSchemaWithShape; if (modelType === ModelType.Database) { MCPLogger.info( `Generating select schema for database model: ${ModelClass.name}`, ); selectSchema = ModelSchema.getSelectModelSchema({ - modelType: ModelClass, - }); + modelType: ModelClass as ModelConstructor, + }) as ZodSchemaWithShape; } else { MCPLogger.info( `Generating schema for analytics model: ${ModelClass.name}`, ); // For analytics models, use the general model schema selectSchema = AnalyticsModelSchema.getModelSchema({ - modelType: ModelClass, - }); + modelType: ModelClass as ModelConstructor, + }) as ZodSchemaWithShape; } // Extract field names from the schema const selectObject: JSONObject = {}; - const shape: any = selectSchema._def?.shape; + const rawShape: Record | (() => Record) | undefined = + selectSchema._def?.shape; + + // Handle both function and object shapes + const shape: Record | undefined = + typeof rawShape === 'function' ? rawShape() : rawShape; MCPLogger.info( `Schema shape keys: ${shape ? Object.keys(shape).length : 0}`, diff --git a/MCP/Types/McpTypes.ts b/MCP/Types/McpTypes.ts index 3088045bb2..4c689ae1c3 100644 --- a/MCP/Types/McpTypes.ts +++ b/MCP/Types/McpTypes.ts @@ -1,10 +1,36 @@ import OneUptimeOperation from "./OneUptimeOperation"; import ModelType from "./ModelType"; +import { JSONObject } from "Common/Types/JSON"; + +// JSON Schema type for MCP tool input schemas +export interface JSONSchemaProperty { + type: string; + description?: string; + enum?: Array; + items?: JSONSchemaProperty; + properties?: Record; + required?: string[]; + default?: unknown; + format?: string; + minimum?: number; + maximum?: number; + minLength?: number; + maxLength?: number; + pattern?: string; +} + +export interface JSONSchema { + type: string; + properties?: Record; + required?: string[]; + additionalProperties?: boolean; + description?: string; +} export interface McpToolInfo { name: string; description: string; - inputSchema: any; + inputSchema: JSONSchema; modelName: string; operation: OneUptimeOperation; modelType: ModelType; @@ -25,12 +51,18 @@ export interface ModelToolsResult { }; } +// Sort direction type +export type SortDirection = 1 | -1; + +// Sort object type +export type SortObject = Record; + export interface OneUptimeToolCallArgs { id?: string; - data?: any; - query?: any; - select?: any; + data?: JSONObject; + query?: JSONObject; + select?: JSONObject; skip?: number; limit?: number; - sort?: any; + sort?: SortObject; } diff --git a/MCP/Utils/DynamicToolGenerator.ts b/MCP/Utils/DynamicToolGenerator.ts index 980d73f87e..786c68b541 100644 --- a/MCP/Utils/DynamicToolGenerator.ts +++ b/MCP/Utils/DynamicToolGenerator.ts @@ -4,7 +4,11 @@ import DatabaseBaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/Da import AnalyticsBaseModel from "Common/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel"; import OneUptimeOperation from "../Types/OneUptimeOperation"; import ModelType from "../Types/ModelType"; -import { McpToolInfo, ModelToolsResult } from "../Types/McpTypes"; +import { + McpToolInfo, + ModelToolsResult, + JSONSchemaProperty, +} from "../Types/McpTypes"; import { ModelSchema, ModelSchemaType, @@ -15,6 +19,46 @@ import { } from "Common/Utils/Schema/AnalyticsModelSchema"; import MCPLogger from "./MCPLogger"; +// Type for Zod field definition +interface ZodFieldDef { + typeName?: string; + innerType?: ZodField; + description?: string; + openapi?: { + metadata?: OpenApiMetadata; + }; +} + +// Type for Zod field +interface ZodField { + _def?: ZodFieldDef; +} + +// Type for OpenAPI metadata +interface OpenApiMetadata { + type?: string; + description?: string; + example?: unknown; + format?: string; + default?: unknown; + items?: JSONSchemaProperty; +} + +// Type for Zod schema with shape +interface ZodSchemaWithShape { + _def?: { + shape?: () => Record; + }; +} + +// Type for zodToJsonSchema return value +interface ZodToJsonSchemaResult { + type: string; + properties: Record; + required?: string[]; + additionalProperties: boolean; +} + export default class DynamicToolGenerator { /** * Sanitize a name to be valid for MCP tool names @@ -41,15 +85,18 @@ export default class DynamicToolGenerator { */ private static zodToJsonSchema( zodSchema: ModelSchemaType | AnalyticsModelSchemaType, - ): any { + ): ZodToJsonSchemaResult { try { /* * The Zod schemas in this project are extended with OpenAPI metadata * We can extract the shape and create a basic JSON schema */ - const shape: any = (zodSchema as any)._def?.shape; + const schemaWithShape: ZodSchemaWithShape = + zodSchema as unknown as ZodSchemaWithShape; + const shapeFunction: (() => Record) | undefined = + schemaWithShape._def?.shape; - if (!shape) { + if (!shapeFunction) { return { type: "object", properties: {}, @@ -57,23 +104,24 @@ export default class DynamicToolGenerator { }; } - const properties: any = {}; + const shape: Record = shapeFunction(); + const properties: Record = {}; const required: string[] = []; - for (const [key, value] of Object.entries(shape())) { - const zodField: any = value as any; + for (const [key, value] of Object.entries(shape)) { + const zodField: ZodField = value; // Handle ZodOptional fields by looking at the inner type - let actualField: any = zodField; + let actualField: ZodField = zodField; let isOptional: boolean = false; if (zodField._def?.typeName === "ZodOptional") { - actualField = zodField._def.innerType; + actualField = zodField._def.innerType || zodField; isOptional = true; } // Extract OpenAPI metadata - it's stored in _def.openapi.metadata - const openApiMetadata: any = + const openApiMetadata: OpenApiMetadata | undefined = actualField._def?.openapi?.metadata || zodField._def?.openapi?.metadata; @@ -85,7 +133,7 @@ export default class DynamicToolGenerator { const cleanDescription: string = this.cleanDescription(rawDescription); if (openApiMetadata) { - const fieldSchema: any = { + const fieldSchema: JSONSchemaProperty = { type: openApiMetadata.type || "string", description: cleanDescription, ...(openApiMetadata.example !== undefined && { @@ -120,12 +168,17 @@ export default class DynamicToolGenerator { } } - return { + const result: ZodToJsonSchemaResult = { type: "object", properties, - required: required.length > 0 ? required : undefined, additionalProperties: false, }; + + if (required.length > 0) { + result.required = required; + } + + return result; } catch { return { type: "object", @@ -217,7 +270,8 @@ export default class DynamicToolGenerator { }); // CREATE Tool - const createSchemaProperties: any = this.zodToJsonSchema(createSchema); + const createSchemaProperties: ZodToJsonSchemaResult = + this.zodToJsonSchema(createSchema); tools.push({ name: `create_${this.sanitizeToolName(singularName)}`, description: `Create a new ${singularName} in OneUptime`, @@ -292,7 +346,8 @@ export default class DynamicToolGenerator { }); // UPDATE Tool - const updateSchemaProperties: any = this.zodToJsonSchema(updateSchema); + const updateSchemaProperties: ZodToJsonSchemaResult = + this.zodToJsonSchema(updateSchema); tools.push({ name: `update_${this.sanitizeToolName(singularName)}`, description: `Update an existing ${singularName} in OneUptime`, @@ -420,7 +475,7 @@ export default class DynamicToolGenerator { }); // CREATE Tool for Analytics - const analyticsCreateSchemaProperties: any = + const analyticsCreateSchemaProperties: ZodToJsonSchemaResult = this.zodToJsonSchema(createSchema); tools.push({ name: `create_${this.sanitizeToolName(singularName)}`, From 06f248717df05f9df09a5adba4a5db9363fc4df2 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:51:20 +0000 Subject: [PATCH 39/46] refactor: Remove outdated MCP documentation and update navigation for AI integration --- Docs/Content/ai/mcp-server.md | 250 +++++++++++++++++++++++++++++ Docs/Content/mcp/configuration.md | 162 ------------------- Docs/Content/mcp/examples.md | 254 ------------------------------ Docs/Content/mcp/index.md | 65 -------- Docs/Content/mcp/installation.md | 77 --------- Docs/Content/mcp/quick-start.md | 108 ------------- Docs/Content/mcp/resources.md | 233 --------------------------- Docs/Utils/Nav.ts | 16 +- 8 files changed, 254 insertions(+), 911 deletions(-) create mode 100644 Docs/Content/ai/mcp-server.md delete mode 100644 Docs/Content/mcp/configuration.md delete mode 100644 Docs/Content/mcp/examples.md delete mode 100644 Docs/Content/mcp/index.md delete mode 100644 Docs/Content/mcp/installation.md delete mode 100644 Docs/Content/mcp/quick-start.md delete mode 100644 Docs/Content/mcp/resources.md diff --git a/Docs/Content/ai/mcp-server.md b/Docs/Content/ai/mcp-server.md new file mode 100644 index 0000000000..2716a29142 --- /dev/null +++ b/Docs/Content/ai/mcp-server.md @@ -0,0 +1,250 @@ +# MCP Server + +The OneUptime Model Context Protocol (MCP) Server provides LLMs with direct access to your OneUptime instance, enabling AI-powered monitoring, incident management, and observability operations. + +## What is the OneUptime MCP Server? + +The OneUptime MCP Server is a bridge between Large Language Models (LLMs) and your OneUptime instance. It implements the Model Context Protocol (MCP), allowing AI assistants like Claude to interact directly with your monitoring infrastructure. + +## How It Works + +The MCP server is hosted alongside your OneUptime instance and accessible via Server-Sent Events (SSE). No local installation is required. + +**Cloud Users**: `https://oneuptime.com/mcp` +**Self-Hosted Users**: `https://your-oneuptime-domain.com/mcp` + +## Key Features + +- **Complete API Coverage**: Access to 711 OneUptime API endpoints +- **126 Resource Types**: Manage all OneUptime resources including monitors, incidents, teams, probes, and more +- **Real-time Operations**: Create, read, update, and delete resources in real-time +- **Type-safe Interface**: Fully typed with comprehensive input validation +- **Secure Authentication**: API key-based authentication with proper error handling +- **Easy Integration**: Works with Claude Desktop and other MCP-compatible clients + +## What You Can Do + +With the OneUptime MCP Server, AI assistants can help you: + +- **Monitor Management**: Create and configure monitors, check their status, and manage monitor groups +- **Incident Response**: Create incidents, add notes, assign team members, and track resolution +- **Team Operations**: Manage teams, permissions, and on-call schedules +- **Status Pages**: Update status pages, create announcements, and manage subscribers +- **Alerting**: Configure alert rules, manage escalation policies, and check notification logs +- **Probes**: Deploy and manage monitoring probes across different locations +- **Reports & Analytics**: Generate reports and analyze monitoring data + +## Requirements + +- OneUptime instance (cloud or self-hosted) +- Valid OneUptime API key +- MCP-compatible client (Claude Desktop, etc.) + +## Getting Your API Key + +1. Log in to your OneUptime instance +2. Navigate to **Settings** → **API Keys** +3. Click **Create API Key** +4. Provide a name (e.g., "MCP Server") +5. Select the appropriate permissions for your use case +6. Copy the generated API key + +## Configuration + +### Claude Desktop Configuration + +Find your Claude Desktop configuration file: + +**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` +**Windows**: `%APPDATA%\Claude\claude_desktop_config.json` +**Linux**: `~/.config/Claude/claude_desktop_config.json` + +### For OneUptime Cloud + +Add the following configuration: + +```json +{ + "mcpServers": { + "oneuptime": { + "transport": "sse", + "url": "https://oneuptime.com/mcp/sse", + "headers": { + "x-api-key": "your-api-key-here" + } + } + } +} +``` + +### For Self-Hosted OneUptime + +Replace `oneuptime.com` with your OneUptime domain: + +```json +{ + "mcpServers": { + "oneuptime": { + "transport": "sse", + "url": "https://your-oneuptime-domain.com/mcp/sse", + "headers": { + "x-api-key": "your-api-key-here" + } + } + } +} +``` + +### Multiple Instances + +You can configure multiple OneUptime instances: + +```json +{ + "mcpServers": { + "oneuptime-prod": { + "transport": "sse", + "url": "https://prod.oneuptime.com/mcp/sse", + "headers": { + "x-api-key": "prod-api-key" + } + }, + "oneuptime-staging": { + "transport": "sse", + "url": "https://staging.oneuptime.com/mcp/sse", + "headers": { + "x-api-key": "staging-api-key" + } + } + } +} +``` + +## Available Endpoints + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/mcp/sse` | GET | SSE endpoint for MCP connections | +| `/mcp/message` | POST | Message endpoint for client-to-server communication | +| `/mcp/health` | GET | Health check endpoint | +| `/mcp/tools` | GET | REST API to list available tools | + +## Verification + +Verify the MCP server is running: + +```bash +# For OneUptime Cloud +curl https://oneuptime.com/mcp/health + +# For Self-Hosted +curl https://your-oneuptime-domain.com/mcp/health +``` + +List available tools: + +```bash +# For OneUptime Cloud +curl https://oneuptime.com/mcp/tools + +# For Self-Hosted +curl https://your-oneuptime-domain.com/mcp/tools +``` + +## Usage Examples + +### Basic Information Queries + +``` +"What's the current status of all my monitors?" +"Show me incidents from the last 24 hours" +"List my OneUptime projects" +``` + +### Monitor Management + +``` +"Create a new website monitor for https://example.com that checks every 5 minutes" +"Set up an API monitor for https://api.example.com/health with a 30-second timeout" +"Change the monitoring interval for my website monitor to every 2 minutes" +"Disable the monitor for staging.example.com while we're doing maintenance" +``` + +### Incident Management + +``` +"Create a high-priority incident for the database outage affecting user authentication" +"Add a note to incident #123 saying 'Database connection restored, monitoring for stability'" +"Mark incident #456 as resolved" +"Assign the current payment gateway incident to the infrastructure team" +``` + +### Team and On-Call + +``` +"Who are the members of the infrastructure team?" +"Who's currently on call for the infrastructure team?" +"Show me the on-call schedule for this week" +``` + +### Status Page Management + +``` +"Update our status page to show 'Investigating Payment Issues' for the payment service" +"Create a status page announcement about scheduled maintenance this weekend" +``` + +### Advanced Operations + +``` +"Create a scheduled maintenance window for Saturday 2-4 AM, disable all monitors for api.example.com during that time, and update the status page" +"Show me all monitors that have been down in the last hour, create incidents for any that don't already have one" +``` + +## API Key Permissions + +### Read-Only Access +For viewing data only, add read permissions for your API key. + +### Full Access +For full access to create, update, and delete resources, ensure your API key has Project Admin permissions. + +### Best Practices +- Use Specific Permissions: Only grant the minimum permissions needed +- Rotate API Keys: Regularly rotate your API keys +- Monitor Usage: Keep track of API key usage in OneUptime +- Separate Keys: Use different API keys for different environments + +## Troubleshooting + +### Permission Errors +Ensure your API key has the necessary permissions: +- Read access for listing resources +- Write access for creating/updating resources +- Delete access if you want to remove resources + +### Connection Issues +1. Verify your OneUptime URL is correct +2. Check that your API key is valid +3. Ensure your OneUptime instance is accessible +4. Test the health endpoint + +### Invalid API Key +- Verify the API key in your OneUptime settings +- Check for extra spaces or characters +- Ensure the key hasn't expired + +## Available Resources + +The MCP server provides access to 126 resource types including: + +**Monitoring**: Monitor, MonitorStatus, MonitorGroup, Probe +**Incidents**: Incident, IncidentState, IncidentNote, IncidentTemplate +**Alerts**: Alert, AlertState, AlertSeverity +**Status Pages**: StatusPage, StatusPageAnnouncement, StatusPageSubscriber +**On-Call**: On-CallPolicy, EscalationRule, On-CallSchedule +**Teams**: Team, TeamMember, TeamPermission +**Telemetry**: TelemetryService, Log, Span, Metric +**Workflows**: Workflow, WorkflowVariable, WorkflowLog + +Each resource supports standard operations: List, Count, Get, Create, Update, and Delete. diff --git a/Docs/Content/mcp/configuration.md b/Docs/Content/mcp/configuration.md deleted file mode 100644 index 35990b02c6..0000000000 --- a/Docs/Content/mcp/configuration.md +++ /dev/null @@ -1,162 +0,0 @@ -# Configuration - -Learn how to configure the OneUptime MCP Server for your specific needs. - -## Claude Desktop Configuration - -The MCP server is hosted alongside your OneUptime instance. Configure your Claude Desktop to connect via SSE transport. - -### Find Your Configuration File - -**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` -**Windows**: `%APPDATA%\Claude\claude_desktop_config.json` -**Linux**: `~/.config/Claude/claude_desktop_config.json` - -### OneUptime Cloud Configuration - -Add the following to your Claude Desktop configuration file: - -```json -{ - "mcpServers": { - "oneuptime": { - "transport": "sse", - "url": "https://oneuptime.com/mcp/sse", - "headers": { - "x-api-key": "your-api-key-here" - } - } - } -} -``` - -### Self-Hosted OneUptime Configuration - -If you're running a self-hosted OneUptime instance: - -```json -{ - "mcpServers": { - "oneuptime": { - "transport": "sse", - "url": "https://your-oneuptime-domain.com/mcp/sse", - "headers": { - "x-api-key": "your-api-key-here" - } - } - } -} -``` - -## Available Endpoints - -The MCP server provides the following endpoints: - -| Endpoint | Method | Description | -|----------|--------|-------------| -| `/mcp/sse` | GET | SSE endpoint for establishing MCP connections | -| `/mcp/message` | POST | Endpoint for sending messages to the server | -| `/mcp/health` | GET | Health check endpoint returning server status | -| `/mcp/tools` | GET | REST API listing all available tools | - -## Testing the Connection - -You can verify the server is working by checking the health endpoint: - -```bash -# For OneUptime Cloud -curl https://oneuptime.com/mcp/health - -# For Self-Hosted -curl https://your-oneuptime-domain.com/mcp/health -``` - -Or list available tools: - -```bash -# For OneUptime Cloud -curl https://oneuptime.com/mcp/tools - -# For Self-Hosted -curl https://your-oneuptime-domain.com/mcp/tools -``` - -## API Key Permissions - -Your API key needs appropriate permissions based on what operations you want to perform: - -### Read-Only Access - -For viewing data only, add read permissions for this API Key. - -### Full Access - -For full access to create, update, and delete resources, ensure your API key has the following permissions: -- Project Admin - -### Minimal Permissions - -It is recommended to have minimum set of permissions assigned to your API key for your use-case. - -## Multiple Instances - -You can configure multiple OneUptime instances by creating separate MCP server configurations: - -```json -{ - "mcpServers": { - "oneuptime-prod": { - "transport": "sse", - "url": "https://prod.oneuptime.com/mcp/sse", - "headers": { - "x-api-key": "prod-api-key" - } - }, - "oneuptime-staging": { - "transport": "sse", - "url": "https://staging.oneuptime.com/mcp/sse", - "headers": { - "x-api-key": "staging-api-key" - } - } - } -} -``` - -## Configuration Validation - -To verify your configuration is working: - -1. **Check API Key**: Ensure your API key is valid and has proper permissions -2. **Test Connection**: Ask Claude to list your projects or monitors -3. **Verify Permissions**: Try creating a simple resource to test write access - -## Troubleshooting Configuration - -### Invalid API Key -- Verify the API key in your OneUptime settings -- Check for extra spaces or characters -- Ensure the key hasn't expired - -### Connection Failed -- Verify your OneUptime instance URL -- Ensure it includes the protocol (https://) -- Check for typos in the domain -- Verify the MCP server is running (check `/mcp/health`) - -### Permission Denied -- Review your API key permissions -- Contact your OneUptime administrator if needed -- Try with a more permissive API key for testing - -## Security Best Practices - -1. **Use Specific Permissions**: Only grant the minimum permissions needed -2. **Rotate API Keys**: Regularly rotate your API keys -3. **Monitor Usage**: Keep track of API key usage in OneUptime -4. **Separate Keys**: Use different API keys for different environments - -## Next Steps - -- [Explore usage examples](/docs/mcp/examples) -- [View available resources](/docs/mcp/resources) diff --git a/Docs/Content/mcp/examples.md b/Docs/Content/mcp/examples.md deleted file mode 100644 index 6f6f4f7474..0000000000 --- a/Docs/Content/mcp/examples.md +++ /dev/null @@ -1,254 +0,0 @@ -# Usage Examples - -Learn how to use the OneUptime MCP Server with practical examples and common use cases. - -## Getting Started Examples - -### Basic Information Queries - -**Check monitor status:** -``` -"What's the current status of all my monitors?" -``` - -**View recent incidents:** -``` -"Show me incidents from the last 24 hours" -``` - -## Monitor Management - -### Creating Monitors - -**Create a website monitor:** -``` -"Create a new website monitor for https://example.com that checks every 5 minutes" -``` - -**Create an API monitor:** -``` -"Set up an API monitor for https://api.example.com/health with a 30-second timeout" -``` - -**Create a ping monitor:** -``` -"Create a ping monitor for server 192.168.1.100" -``` - -### Managing Existing Monitors - -**Update monitor frequency:** -``` -"Change the monitoring interval for my website monitor to every 2 minutes" -``` - -**Disable a monitor temporarily:** -``` -"Disable the monitor for staging.example.com while we're doing maintenance" -``` - -**Add custom headers to HTTP monitor:** -``` -"Add an Authorization header to my API monitor with value 'Bearer token123'" -``` - -## Incident Management - -### Creating Incidents - -**Create a new incident:** -``` -"Create a high-priority incident for the database outage affecting user authentication" -``` - -**Create incident with details:** -``` -"Create an incident titled 'Payment Gateway Down' with description 'Users cannot process payments' and assign it to the backend team" -``` - -### Managing Incidents - -**Add notes to incident:** -``` -"Add a note to incident #123 saying 'Database connection restored, monitoring for stability'" -``` - -**Update incident status:** -``` -"Mark incident #456 as resolved" -``` - -**Assign incident to team:** -``` -"Assign the current payment gateway incident to the infrastructure team" -``` - -## Team and User Management - -### Team Operations - -**List team members:** -``` -"Who are the members of the infrastructure team?" -``` - -**Add user to team:** -``` -"Add john@example.com to the backend development team" -``` - -**Check team permissions:** -``` -"What permissions does the frontend team have?" -``` - -### On-Call Management - -**Check who's on call:** -``` -"Who's currently on call for the infrastructure team?" -``` - -**View on-call schedule:** -``` -"Show me the on-call schedule for this week" -``` - -## Status Page Management - -### Status Page Updates - -**Update status page:** -``` -"Update our status page to show 'Investigating Payment Issues' for the payment service" -``` - -**Create announcement:** -``` -"Create a status page announcement about scheduled maintenance this weekend" -``` - -**Check current status:** -``` -"What's the current status showing on our public status page?" -``` - -## Probe Management - -### Managing Probes - -**List all probes:** -``` -"Show me all monitoring probes and their locations" -``` - -**Create a new probe:** -``` -"Set up a new monitoring probe in the EU-West region" -``` - -**Check probe health:** -``` -"Are all our monitoring probes healthy and reporting data?" -``` - -## Analytics and Reporting - -### Performance Queries - -**Monitor uptime stats:** -``` -"What's the uptime percentage for all monitors this month?" -``` - -**Incident trends:** -``` -"How many incidents did we have last week compared to this week?" -``` - -**Response time analysis:** -``` -"What are the average response times for our API endpoints today?" -``` - -## Advanced Use Cases - -### Automated Incident Response - -**Create incident and assign team:** -``` -"Create a critical incident for API timeout issues, assign to DevOps team, and add initial troubleshooting steps to the description" -``` - -**Bulk monitor updates:** -``` -"Update all website monitors to use a 60-second timeout instead of 30 seconds" -``` - -### Maintenance Operations - -**Prepare for maintenance:** -``` -"Create a scheduled maintenance window for this Saturday 2-4 AM, disable all monitors for api.example.com during that time, and update the status page" -``` - -**Post-maintenance cleanup:** -``` -"Re-enable all monitors that were disabled for maintenance and update status page to show all systems operational" -``` - -### Integration Workflows - -**Monitor creation from incidents:** -``` -"Based on the recent database timeout incident, create a new monitor to check database response time every minute" -``` - -**Team notification setup:** -``` -"Set up escalation rules so that if any critical monitor fails, it immediately notifies the on-call engineer and escalates to the team lead after 15 minutes" -``` - -## Complex Queries - -### Multi-step Operations - -``` -"Show me all monitors that have been down in the last hour, create incidents for any that don't already have one, and assign them to the appropriate teams based on the monitor tags" -``` - -``` -"Find all incidents that have been open for more than 24 hours, add a note requesting status updates, and notify the assigned teams" -``` - -### Conditional Logic - -``` -"If any monitors in the 'production' group are currently failing, create a high-priority incident and immediately notify the on-call team" -``` - -``` -"Check if our main website monitor has been down for more than 5 minutes, and if so, update the status page to show 'investigating connectivity issues'" -``` - -## Best Practices - -### Effective Prompts - -1. **Be Specific**: Include exact names, IDs, or criteria -2. **Provide Context**: Mention urgency, affected systems, or business impact -3. **Use Natural Language**: The AI understands conversational requests -4. **Combine Operations**: Ask for multiple related actions in one request - -### Safety Considerations - -1. **Review Before Executing**: Check what the AI plans to do -2. **Start Small**: Test with non-critical resources first -3. **Have Rollback Plans**: Know how to reverse changes -4. **Monitor Results**: Verify operations completed successfully - -## Next Steps - -- [Learn about available resources](/docs/mcp/resources) -- [Explore configuration options](/docs/mcp/configuration) -- [View troubleshooting guide](/docs/mcp/troubleshooting) diff --git a/Docs/Content/mcp/index.md b/Docs/Content/mcp/index.md deleted file mode 100644 index 54367fd472..0000000000 --- a/Docs/Content/mcp/index.md +++ /dev/null @@ -1,65 +0,0 @@ -# OneUptime MCP Server - -The OneUptime Model Context Protocol (MCP) Server provides LLMs with direct access to your OneUptime instance, enabling AI-powered monitoring, incident management, and observability operations. - -## What is the OneUptime MCP Server? - -The OneUptime MCP Server is a bridge between Large Language Models (LLMs) and your OneUptime instance. It implements the Model Context Protocol (MCP), allowing AI assistants like Claude to interact directly with your monitoring infrastructure. - -## How It Works - -The MCP server is hosted alongside your OneUptime instance and accessible via Server-Sent Events (SSE). No local installation is required. - -**Cloud Users**: `https://oneuptime.com/mcp` -**Self-Hosted Users**: `https://your-oneuptime-domain.com/mcp` - -## Key Features - -- **Complete API Coverage**: Access to 711 OneUptime API endpoints -- **126 Resource Types**: Manage all OneUptime resources including monitors, incidents, teams, probes, and more -- **Real-time Operations**: Create, read, update, and delete resources in real-time -- **Type-safe Interface**: Fully typed with comprehensive input validation -- **Secure Authentication**: API key-based authentication with proper error handling -- **Easy Integration**: Works with Claude Desktop and other MCP-compatible clients - -## What You Can Do - -With the OneUptime MCP Server, AI assistants can help you: - -- **Monitor Management**: Create and configure monitors, check their status, and manage monitor groups -- **Incident Response**: Create incidents, add notes, assign team members, and track resolution -- **Team Operations**: Manage teams, permissions, and on-call schedules -- **Status Pages**: Update status pages, create announcements, and manage subscribers -- **Alerting**: Configure alert rules, manage escalation policies, and check notification logs -- **Probes**: Deploy and manage monitoring probes across different locations -- **Reports & Analytics**: Generate reports and analyze monitoring data - -## Getting Started - -1. [Installation Guide](/docs/mcp/installation) - Install and configure the MCP server -2. [Quick Start](/docs/mcp/quick-start) - Get up and running in minutes -3. [Configuration](/docs/mcp/configuration) - Detailed configuration options -4. [Usage Examples](/docs/mcp/examples) - Common use cases and examples - -## Requirements - -- OneUptime instance (cloud or self-hosted) -- Valid OneUptime API key -- MCP-compatible client (Claude Desktop, etc.) - -## Architecture - -The MCP server acts as a translation layer between the Model Context Protocol and OneUptime's REST API: - -``` -LLM Client (Claude) ↔ MCP Server ↔ OneUptime API -``` - -This architecture ensures secure, efficient access to your OneUptime data while maintaining proper authentication and authorization. - -## Next Steps - -- [Install the MCP Server](/docs/mcp/installation) -- [Learn about Configuration Options](/docs/mcp/configuration) -- [Explore Usage Examples](/docs/mcp/examples) -- [View Available Resources](/docs/mcp/resources) diff --git a/Docs/Content/mcp/installation.md b/Docs/Content/mcp/installation.md deleted file mode 100644 index 7f3696a58d..0000000000 --- a/Docs/Content/mcp/installation.md +++ /dev/null @@ -1,77 +0,0 @@ -# Installation - -This guide will walk you through setting up the OneUptime MCP Server. - -## Prerequisites - -Before setting up the MCP server, ensure you have: - -- A OneUptime instance (cloud or self-hosted) -- A valid OneUptime API key -- An MCP-compatible client (Claude Desktop, etc.) - -## MCP Server URL - -The MCP server is hosted alongside your OneUptime instance. No local installation is required. - -**OneUptime Cloud**: `https://oneuptime.com/mcp` -**Self-Hosted**: `https://your-oneuptime-domain.com/mcp` - -## Available Endpoints - -The MCP server exposes the following endpoints: - -| Endpoint | Method | Description | -|----------|--------|-------------| -| `/mcp/sse` | GET | SSE endpoint for MCP connections | -| `/mcp/message` | POST | Message endpoint for client-to-server communication | -| `/mcp/health` | GET | Health check endpoint | -| `/mcp/tools` | GET | REST API to list available tools | - -## Getting Your API Key - -### For OneUptime Cloud - -1. Log in to [OneUptime Cloud](https://oneuptime.com) -2. Navigate to **Settings** → **API Keys** -3. Click **Create API Key** -4. Provide a name (e.g., "MCP Server") -5. Select the appropriate permissions for your use case -6. Copy the generated API key - -### For Self-Hosted OneUptime - -1. Access your OneUptime instance -2. Navigate to **Settings** → **API Keys** -3. Click **Create API Key** -4. Provide a name (e.g., "MCP Server") -5. Select the appropriate permissions -6. Copy the generated API key - -## Verification - -You can verify the MCP server is running by checking the health endpoint: - -```bash -# For OneUptime Cloud -curl https://oneuptime.com/mcp/health - -# For Self-Hosted -curl https://your-oneuptime-domain.com/mcp/health -``` - -You can also list available tools: - -```bash -# For OneUptime Cloud -curl https://oneuptime.com/mcp/tools - -# For Self-Hosted -curl https://your-oneuptime-domain.com/mcp/tools -``` - -## Next Steps - -- [Configure with Claude Desktop](/docs/mcp/configuration) -- [Quick Start Guide](/docs/mcp/quick-start) -- [View Usage Examples](/docs/mcp/examples) diff --git a/Docs/Content/mcp/quick-start.md b/Docs/Content/mcp/quick-start.md deleted file mode 100644 index a797ada85e..0000000000 --- a/Docs/Content/mcp/quick-start.md +++ /dev/null @@ -1,108 +0,0 @@ -# Quick Start - -Get up and running with the OneUptime MCP Server in just a few minutes. - -## Step 1: Get Your API Key - -1. Log in to your OneUptime instance -2. Go to **Settings** → **API Keys** -3. Create a new API key with appropriate permissions -4. Copy the API key for use in configuration - -## Step 2: Configure Claude Desktop - -Find your Claude Desktop configuration file: - -**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` -**Windows**: `%APPDATA%\Claude\claude_desktop_config.json` -**Linux**: `~/.config/Claude/claude_desktop_config.json` - -### For OneUptime Cloud - -Add the following configuration: - -```json -{ - "mcpServers": { - "oneuptime": { - "transport": "sse", - "url": "https://oneuptime.com/mcp/sse", - "headers": { - "x-api-key": "your-api-key-here" - } - } - } -} -``` - -### For Self-Hosted OneUptime - -Replace `oneuptime.com` with your OneUptime domain: - -```json -{ - "mcpServers": { - "oneuptime": { - "transport": "sse", - "url": "https://your-oneuptime-domain.com/mcp/sse", - "headers": { - "x-api-key": "your-api-key-here" - } - } - } -} -``` - -## Step 3: Restart Claude Desktop - -Close and restart Claude Desktop for the configuration changes to take effect. - -That's it! You're ready to use the OneUptime MCP Server. - -## Step 4: Test the Connection - -Once Claude Desktop restarts, you can test the MCP server by asking Claude to: - -- "List my OneUptime projects" -- "Show me recent incidents" -- "What monitors are currently down?" -- "Create a new monitor for my website" - -## Example Conversation - -Here's what you can do once everything is set up: - -**You**: "Can you show me all my OneUptime projects?" - -**Claude**: "I'll list your OneUptime projects for you." - -*Claude will use the MCP server to fetch and display your projects* - -**You**: "Create a new monitor for https://example.com" - -**Claude**: "I'll create a website monitor for https://example.com." - -*Claude will use the MCP server to create the monitor* - -## Common Issues - -### Permission Errors - -If you see permission errors, ensure your API key has the necessary permissions: -- Read access for listing resources -- Write access for creating/updating resources -- Delete access if you want to remove resources - -### Connection Issues - -If Claude can't connect to your OneUptime instance: -1. Verify your OneUptime URL is correct -2. Check that your API key is valid -3. Ensure your OneUptime instance is accessible -4. Test the health endpoint: `curl https://your-oneuptime-domain.com/mcp/health` - -## Next Steps - -- [Learn about configuration options](/docs/mcp/configuration) -- [Explore usage examples](/docs/mcp/examples) -- [View available resources](/docs/mcp/resources) diff --git a/Docs/Content/mcp/resources.md b/Docs/Content/mcp/resources.md deleted file mode 100644 index 9ee56f0e85..0000000000 --- a/Docs/Content/mcp/resources.md +++ /dev/null @@ -1,233 +0,0 @@ -# Available Resources - -The OneUptime MCP Server provides access to 126 different resource types across your OneUptime instance. Here's a comprehensive overview of what you can manage. - -## Core Resources - -### User Management -- **User**: Manage user accounts and profiles -- **TeamMember**: Handle team membership relationships -- **TeamPermission**: Control access permissions within teams -- **TwoFactorAuth**: Manage two-factor authentication settings - -### Project and Team Management -- **Project**: Create and manage monitoring projects -- **Team**: Organize users into teams with specific roles -- **TeamOwner**: Manage team ownership relationships - -### Authentication and Security -- **APIKey**: Generate and manage API keys for integrations -- **APIKeyPermission**: Control what each API key can access -- **Label**: Create labels for organizing resources - -## Monitoring and Observability - -### Monitors -- **Monitor**: Configure and manage all types of monitors -- **MonitorSecret**: Store sensitive data for monitor configurations -- **MonitorStatus**: Track the current state of monitors -- **MonitorCustomField**: Add custom metadata to monitors -- **MonitorProbe**: Assign probes to monitors -- **MonitorTeamOwner**: Manage monitor ownership by teams -- **MonitorUserOwner**: Manage monitor ownership by users -- **MonitorGroup**: Organize monitors into logical groups -- **MonitorGroupTeamOwner**: Manage group ownership by teams -- **MonitorGroupUserOwner**: Manage group ownership by users -- **MonitorGroupResource**: Associate monitors with groups -- **MonitorStatusEvent**: Track monitor status change events -- **MonitorFeed**: Monitor activity feeds and notifications -- **MonitorLog**: Access monitor execution logs - -### Probes -- **Probe**: Deploy and manage monitoring probes -- **ProbeOwnerTeam**: Manage probe ownership by teams -- **ProbeUserOwner**: Manage probe ownership by users - -## Incident Management - -### Incidents -- **Incident**: Create and manage incidents -- **IncidentState**: Define incident states (open, investigating, resolved) -- **IncidentFeed**: Incident activity feeds -- **IncidentCustomField**: Add custom fields to incidents -- **IncidentStateTimeline**: Track incident state changes over time -- **IncidentInternalNote**: Add internal notes for team communication -- **IncidentPublicNote**: Add public-facing notes for transparency -- **IncidentTemplate**: Create templates for common incident types -- **IncidentTemplateTeamOwner**: Manage template ownership by teams -- **IncidentTemplateUserOwner**: Manage template ownership by users -- **IncidentTeamOwner**: Assign incidents to teams -- **IncidentUserOwner**: Assign incidents to individual users -- **IncidentSeverity**: Define and manage incident severity levels -- **IncidentNoteTemplate**: Create templates for incident notes - -### Alerts -- **Alert**: Manage alert notifications -- **AlertState**: Define alert states -- **AlertFeed**: Alert activity feeds -- **AlertCustomField**: Add custom fields to alerts -- **AlertStateTimeline**: Track alert state changes -- **AlertInternalNote**: Internal alert notes -- **AlertTeamOwner**: Assign alerts to teams -- **AlertUserOwner**: Assign alerts to users -- **AlertSeverity**: Define alert severity levels -- **AlertNoteTemplate**: Create templates for alert notes - -## Status Pages - -### Status Page Management -- **StatusPage**: Create and manage public status pages -- **StatusPageGroup**: Organize status page components -- **StatusPageDomain**: Configure custom domains for status pages -- **StatusPageCustomField**: Add custom fields to status pages -- **StatusPageResource**: Manage resources displayed on status pages -- **StatusPageAnnouncement**: Create announcements for status pages -- **StatusPageAnnouncementTemplate**: Templates for common announcements -- **StatusPageSubscriber**: Manage status page subscribers -- **StatusPageFooterLink**: Add custom footer links -- **StatusPageHeaderLink**: Add custom header links -- **StatusPagePrivateUser**: Manage private status page access -- **StatusPageHistoryChartBarColor**: Customize status page chart colors -- **StatusPageTeamOwner**: Manage status page ownership by teams -- **StatusPageUserOwner**: Manage status page ownership by users -- **StatusPageSSO**: Configure single sign-on for private status pages - -## Scheduled Maintenance - -### Maintenance Management -- **ScheduledMaintenanceState**: Define maintenance states -- **ScheduledMaintenanceEvent**: Create and manage maintenance windows -- **ScheduledMaintenanceStateTimeline**: Track maintenance state changes -- **ScheduledEventPublicNote**: Public notes for maintenance events -- **ScheduledMaintenanceCustomField**: Custom fields for maintenance -- **ScheduledMaintenanceFeed**: Maintenance activity feeds -- **ScheduledMaintenanceTeamOwner**: Team ownership of maintenance events -- **ScheduledMaintenanceUserOwner**: User ownership of maintenance events -- **ScheduledMaintenanceTemplate**: Templates for common maintenance -- **ScheduledMaintenanceTemplateTeamOwner**: Template team ownership -- **ScheduledMaintenanceTemplateUserOwner**: Template user ownership -- **ScheduledMaintenanceNoteTemplate**: Templates for maintenance notes - -## On-Call Management - -### On-Call Policies -- **On-CallPolicy**: Define on-call escalation policies -- **On-CallPolicyCustomField**: Custom fields for on-call policies -- **EscalationRule**: Configure escalation rules -- **TeamOn-CallDutyEscalationRule**: Team-based escalation rules -- **User'SOn-CallDutyEscalationRule**: User-based escalation rules -- **Schedule'SOn-CallDutyEscalationRule**: Schedule-based escalation rules -- **On-CallDutyExecutionLog**: Logs of on-call executions -- **On-CallDutyExecutionLogTimeline**: Timeline of on-call events -- **UserOverride**: Temporary on-call schedule overrides -- **OnCallDutyPolicyFeed**: On-call policy activity feeds -- **OnCallDutyPolicyTeamOwner**: Team ownership of on-call policies -- **OnCallDutyPolicyUserOwner**: User ownership of on-call policies - -### Scheduling -- **On-CallPolicySchedule**: Define on-call schedules -- **On-CallScheduleLayer**: Create schedule layers for complex rotations -- **On-CallScheduleLayerUser**: Assign users to schedule layers -- **UserOn-CallLogTimeline**: Track user on-call activities -- **OnCallTimeLog**: Log on-call time for billing/reporting - -## Service Catalog - -### Service Management -- **ServiceInServiceCatalog**: Define services in your catalog -- **ServiceCatalogTeamOwner**: Team ownership of services -- **ServiceCatalogUserOwner**: User ownership of services -- **ServiceDependency**: Define dependencies between services -- **ServiceCatalogMonitor**: Associate monitors with services -- **ServiceCatalogTelemetryService**: Link telemetry to services - -## Workflow Automation - -### Workflows -- **Workflow**: Create automated workflows -- **WorkflowVariable**: Define variables for workflows -- **WorkflowLog**: Access workflow execution logs - -## Telemetry and Observability - -### Telemetry Services -- **TelemetryService**: Manage telemetry data sources -- **TelemetryIngestionKey**: Keys for telemetry data ingestion -- **Log**: Access and manage log data -- **Span**: Distributed tracing spans -- **Metric**: Application and infrastructure metrics -- **MetricType**: Define custom metric types - -### Error Tracking -- **Exception**: Track application exceptions -- **ExceptionInstance**: Individual exception occurrences - -### Code Repository Integration -- **CodeRepository**: Connect code repositories - -## Communication and Notifications - -### Notification Logs -- **SMSLog**: SMS notification delivery logs -- **CallLog**: Phone call notification logs -- **EmailLog**: Email notification delivery logs -- **UserNotificationLog**: User-specific notification history - -### Workspace Communication -- **WorkspaceNotificationRule**: Define workspace-wide notification rules - -## UI and Customization - -### Dashboard and Views -- **Dashboard**: Create custom dashboards -- **TableView**: Customize table views for resources -- **File**: Manage uploaded files and assets -- **Domain**: Configure custom domains - -## Resource Operations - -For each resource type, the MCP server typically provides these operations: - -### Standard Operations -- **List**: Retrieve multiple resources with filtering and pagination -- **Count**: Get the total count of resources matching criteria -- **Get**: Retrieve a single resource by ID -- **Create**: Create new resources -- **Update**: Modify existing resources -- **Delete**: Remove resources - -### Example Usage Patterns - -**Resource Listing:** -``` -"Show me all monitors" → Uses listMonitor -"How many incidents are open?" → Uses countIncident with status filter -``` - -**Resource Creation:** -``` -"Create a new team called 'DevOps'" → Uses createTeam -"Add a website monitor for example.com" → Uses createMonitor -``` - -**Resource Management:** -``` -"Update the timeout for monitor #123" → Uses updateMonitor -"Delete the test probe" → Uses deleteProbe -``` - -## Resource Relationships - -Many resources are interconnected: - -- **Monitors** can be owned by **Teams** and **Users** -- **Incidents** can be assigned to **Teams** and have multiple **Notes** -- **Status Pages** display **Resources** and can have **Announcements** -- **On-Call Policies** include **Escalation Rules** and **Schedules** -- **Services** can have **Dependencies** and associated **Monitors** - -## Next Steps - -- [View usage examples](/docs/mcp/examples) -- [Learn about configuration](/docs/mcp/configuration) -- [Explore troubleshooting](/docs/mcp/troubleshooting) diff --git a/Docs/Utils/Nav.ts b/Docs/Utils/Nav.ts index 3218dbeaae..624d039b5c 100644 --- a/Docs/Utils/Nav.ts +++ b/Docs/Utils/Nav.ts @@ -192,20 +192,12 @@ const DocsNav: NavGroup[] = [ { title: "Syslog", url: "/docs/telemetry/syslog" }, ], }, - { - title: "MCP Server", - links: [ - { title: "Overview", url: "/docs/mcp/index" }, - { title: "Installation", url: "/docs/mcp/installation" }, - { title: "Quick Start", url: "/docs/mcp/quick-start" }, - { title: "Configuration", url: "/docs/mcp/configuration" }, - { title: "Usage Examples", url: "/docs/mcp/examples" }, - { title: "Available Resources", url: "/docs/mcp/resources" }, - ], - }, { title: "AI", - links: [{ title: "LLM Providers", url: "/docs/ai/llm-provider" }], + links: [ + { title: "LLM Providers", url: "/docs/ai/llm-provider" }, + { title: "MCP Server", url: "/docs/ai/mcp-server" }, + ], }, { title: "API Reference", From 87ab8b6c40800f03ba3a51597ef097a1549e3501 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:54:24 +0000 Subject: [PATCH 40/46] feat: Add visibility condition for error view button in LlmLogsTable --- Dashboard/src/Components/AILogs/LlmLogsTable.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx index eeeccb5453..41193785da 100644 --- a/Dashboard/src/Components/AILogs/LlmLogsTable.tsx +++ b/Dashboard/src/Components/AILogs/LlmLogsTable.tsx @@ -168,6 +168,12 @@ const LlmLogsTable: FunctionComponent = ( title: "View Error", buttonStyleType: ButtonStyleType.NORMAL, icon: IconProp.Error, + isVisible: (item: LlmLog): boolean => { + return ( + item["status"] === LlmLogStatus.Error || + item["status"] === LlmLogStatus.InsufficientBalance + ); + }, onClick: async (item: LlmLog, onCompleteAction: VoidFunction) => { setModalText( (item["statusMessage"] as string) || "No error message", From c50aa35064a4b97693c30aa1f926670f81e1c849 Mon Sep 17 00:00:00 2001 From: Nawaz Dhandala Date: Tue, 16 Dec 2025 11:57:32 +0000 Subject: [PATCH 41/46] refactor: Simplify AILoader component by removing unused icons and stages, enhancing loading message display --- Common/UI/Components/AI/AILoader.tsx | 204 +++++---------------------- 1 file changed, 38 insertions(+), 166 deletions(-) diff --git a/Common/UI/Components/AI/AILoader.tsx b/Common/UI/Components/AI/AILoader.tsx index 16def00980..df2136ed3c 100644 --- a/Common/UI/Components/AI/AILoader.tsx +++ b/Common/UI/Components/AI/AILoader.tsx @@ -1,6 +1,4 @@ import React, { FunctionComponent, ReactElement, useEffect, useState } from "react"; -import Icon from "../Icon/Icon"; -import IconProp from "../../../Types/Icon/IconProp"; export interface AILoaderProps { /** Optional title to display */ @@ -13,202 +11,76 @@ export interface AILoaderProps { showDataSources?: boolean; } -interface LoadingStage { - label: string; - icon: IconProp; -} - -const loadingStages: Array = [ - { label: "Gathering context", icon: IconProp.Database }, - { label: "Analyzing data", icon: IconProp.Search }, - { label: "Generating content", icon: IconProp.Edit }, +const loadingMessages: Array = [ + "Gathering context", + "Analyzing data", + "Generating content", ]; const AILoader: FunctionComponent = ( props: AILoaderProps, ): ReactElement => { - const [currentStageIndex, setCurrentStageIndex] = useState(0); - const [showSources, setShowSources] = useState(false); + const [currentMessageIndex, setCurrentMessageIndex] = useState(0); - // Cycle through stages + // Cycle through messages useEffect(() => { const interval: NodeJS.Timeout = setInterval(() => { - setCurrentStageIndex((prev: number) => { - return (prev + 1) % loadingStages.length; + setCurrentMessageIndex((prev: number) => { + return (prev + 1) % loadingMessages.length; }); - }, 2500); + }, 3000); return () => { clearInterval(interval); }; }, []); - const currentStage: LoadingStage = loadingStages[currentStageIndex]!; - return ( -
- {/* Main AI animation container */} +
- {/* Animated AI icon with pulse rings */} -
- {/* Outer pulse rings */} -
+ {/* Minimal animated bars */} +
+ {[0, 1, 2, 3, 4].map((index: number) => (
-
-
-
-
- - {/* Center icon container */} -
-
- -
- - {/* Sparkle effects */} -
-
-
-
-
-
-
-
-
-
+ ))}
{/* Title */} -

- {props.title || "AI is working"} -

+

+ {props.title || "Generating"} +

- {/* Subtitle */} - {props.subtitle && ( -

- {props.subtitle} -

- )} + {/* Current stage with fade transition */} +

+ {loadingMessages[currentMessageIndex]} +

- {/* Current stage indicator */} -
-
- -
- - {currentStage.label} - - . - . - . - - -
- - {/* Progress stages dots */} -
- {loadingStages.map((_stage: LoadingStage, index: number) => { - const isActive: boolean = index === currentStageIndex; - const isPast: boolean = index < currentStageIndex; - - return ( -
- ); - })} -
- - {/* Data Sources Section */} + {/* Subtle data sources indicator */} {props.dataSourceItems && props.dataSourceItems.length > 0 && ( -
- {/* Toggle button */} - - - {/* Animated data sources */} -
-
- {props.dataSourceItems.map((item: string, index: number) => { - return ( -
-
- - {item} - -
- ); - })} -
-
-
+

+ Analyzing {props.dataSourceItems.length} data source{props.dataSourceItems.length > 1 ? "s" : ""} +

)}
- {/* CSS for custom animation */} + {/* CSS for animation */}