From 04aa24c0211420971b9abfa84665732fbc2d41fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Thu, 19 Dec 2024 14:29:51 +0100 Subject: [PATCH 01/78] Delete Trackers data when scrubbing workspace data (#9532) --- front/lib/resources/tracker_resource.ts | 71 +++++++++++++++----- front/poke/temporal/activities.ts | 16 +++++ front/poke/temporal/workflows.ts | 2 + front/temporal/scrub_workspace/activities.ts | 16 +++++ 4 files changed, 90 insertions(+), 15 deletions(-) diff --git a/front/lib/resources/tracker_resource.ts b/front/lib/resources/tracker_resource.ts index 56496c3e6420..4f2b74d4f034 100644 --- a/front/lib/resources/tracker_resource.ts +++ b/front/lib/resources/tracker_resource.ts @@ -377,12 +377,26 @@ export class TrackerConfigurationResource extends ResourceWithSpace { return this.baseFetch(auth, { where: { vaultId: space.id, }, + includeDeleted, + }); + } + + static async listByWorkspace( + auth: Authenticator, + { includeDeleted }: { includeDeleted?: boolean } = {} + ): Promise { + return this.baseFetch(auth, { + where: { + workspaceId: auth.getNonNullableWorkspace().id, + }, + includeDeleted, }); } @@ -438,6 +452,7 @@ export class TrackerConfigurationResource extends ResourceWithSpace validDsViewIds.has(c.dataSourceViewId)); - // Fetch the associated tracker configurations // Fetch the associated tracker configurations const trackerIds = _.uniq( dsConfigs.map((config) => config.trackerConfigurationId) @@ -556,19 +570,28 @@ export class TrackerConfigurationResource extends ResourceWithSpace> { + const workspaceId = auth.getNonNullableWorkspace().id; const deletedCount = await frontSequelize.transaction(async (t) => { - // TODO Daph: Delete all related resources. - // await TrackerDataSourceConfigurationResource.deleteAllByTrackerId(this.id, t); - // await TrackerGenerationResource.deleteAllByTrackerId(this.id, t); - + await TrackerGenerationModel.destroy({ + where: { + trackerConfigurationId: this.id, + }, + transaction: t, + hardDelete: true, + }); + await TrackerDataSourceConfigurationModel.destroy({ + where: { + trackerConfigurationId: this.id, + }, + transaction: t, + hardDelete: true, + }); return TrackerConfigurationModel.destroy({ where: { - workspaceId: auth.getNonNullableWorkspace().id, id: this.id, + workspaceId, }, transaction: t, - // Use 'hardDelete: true' to ensure the record is permanently deleted from the database, - // bypassing the soft deletion in place. hardDelete: true, }); }); @@ -579,12 +602,30 @@ export class TrackerConfigurationResource extends ResourceWithSpace> { - const deletedCount = await TrackerConfigurationModel.destroy({ - where: { - workspaceId: auth.getNonNullableWorkspace().id, - id: this.id, - }, - hardDelete: false, + const workspaceId = auth.getNonNullableWorkspace().id; + const deletedCount = await frontSequelize.transaction(async (t) => { + await TrackerGenerationModel.destroy({ + where: { + trackerConfigurationId: this.id, + }, + transaction: t, + hardDelete: false, + }); + await TrackerDataSourceConfigurationModel.destroy({ + where: { + trackerConfigurationId: this.id, + }, + transaction: t, + hardDelete: false, + }); + return TrackerConfigurationModel.destroy({ + where: { + id: this.id, + workspaceId, + }, + transaction: t, + hardDelete: false, + }); }); return new Ok(deletedCount); diff --git a/front/poke/temporal/activities.ts b/front/poke/temporal/activities.ts index 48bfb3663224..47f37fc52661 100644 --- a/front/poke/temporal/activities.ts +++ b/front/poke/temporal/activities.ts @@ -65,6 +65,7 @@ import { LabsTranscriptsHistoryModel, } from "@app/lib/resources/storage/models/labs_transcripts"; import { UserMetadataModel } from "@app/lib/resources/storage/models/user"; +import { TrackerConfigurationResource } from "@app/lib/resources/tracker_resource"; import { UserResource } from "@app/lib/resources/user_resource"; import { renderLightWorkspaceType } from "@app/lib/workspace"; import logger from "@app/logger/logger"; @@ -507,6 +508,21 @@ export async function deleteRunOnDustAppsActivity({ } } +export const deleteTrackersActivity = async ({ + workspaceId, +}: { + workspaceId: string; +}) => { + const auth = await Authenticator.internalAdminForWorkspace(workspaceId); + const trackers = await TrackerConfigurationResource.listByWorkspace(auth, { + includeDeleted: true, + }); + + for (const tracker of trackers) { + await tracker.delete(auth, { hardDelete: true }); + } +}; + export async function deleteMembersActivity({ workspaceId, }: { diff --git a/front/poke/temporal/workflows.ts b/front/poke/temporal/workflows.ts index decc1a370970..f260940ad053 100644 --- a/front/poke/temporal/workflows.ts +++ b/front/poke/temporal/workflows.ts @@ -10,6 +10,7 @@ const activityProxies = proxyActivities({ const { deleteAgentsActivity, deleteAppsActivity, + deleteTrackersActivity, deleteConversationsActivity, deleteMembersActivity, deleteRunOnDustAppsActivity, @@ -54,6 +55,7 @@ export async function deleteWorkspaceWorkflow({ await deleteAgentsActivity({ workspaceId }); await deleteAppsActivity({ workspaceId }); await deleteRunOnDustAppsActivity({ workspaceId }); + await deleteTrackersActivity({ workspaceId }); await deleteMembersActivity({ workspaceId }); await deleteSpacesActivity({ workspaceId }); await deleteTranscriptsActivity({ workspaceId }); diff --git a/front/temporal/scrub_workspace/activities.ts b/front/temporal/scrub_workspace/activities.ts index b6d69dd9ee8c..d29fba106d4e 100644 --- a/front/temporal/scrub_workspace/activities.ts +++ b/front/temporal/scrub_workspace/activities.ts @@ -29,6 +29,7 @@ import { subscriptionForWorkspaces } from "@app/lib/plans/subscription"; import { DataSourceResource } from "@app/lib/resources/data_source_resource"; import { MembershipResource } from "@app/lib/resources/membership_resource"; import { SpaceResource } from "@app/lib/resources/space_resource"; +import { TrackerConfigurationResource } from "@app/lib/resources/tracker_resource"; import { UserResource } from "@app/lib/resources/user_resource"; import { CustomerioServerSideTracking } from "@app/lib/tracking/customerio/server"; import { renderLightWorkspaceType } from "@app/lib/workspace"; @@ -89,6 +90,7 @@ export async function scrubWorkspaceData({ const auth = await Authenticator.internalAdminForWorkspace(workspaceId); await deleteAllConversations(auth); await archiveAssistants(auth); + await deleteTrackers(auth); await deleteDatasources(auth); await deleteSpaces(auth); await cleanupCustomerio(auth); @@ -151,6 +153,20 @@ async function archiveAssistants(auth: Authenticator) { } } +async function deleteTrackers(auth: Authenticator) { + const workspace = auth.workspace(); + if (!workspace) { + throw new Error("No workspace found"); + } + + const trackers = await TrackerConfigurationResource.listByWorkspace(auth, { + includeDeleted: true, + }); + for (const tracker of trackers) { + await tracker.delete(auth, { hardDelete: true }); + } +} + async function deleteDatasources(auth: Authenticator) { const globalAndSystemSpaces = await SpaceResource.listWorkspaceDefaultSpaces( auth, From fea93b30b00c1552f37a2e44bcad5412952dece9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Thu, 19 Dec 2024 14:37:49 +0100 Subject: [PATCH 02/78] New route + UI to soft delete a tracker (#9537) --- front/components/trackers/TrackerBuilder.tsx | 65 ++++++++++++- .../spaces/[spaceId]/trackers/[tId]/index.ts | 93 +++++++++++-------- 2 files changed, 118 insertions(+), 40 deletions(-) diff --git a/front/components/trackers/TrackerBuilder.tsx b/front/components/trackers/TrackerBuilder.tsx index 2e8406877b8a..faf9e0890c64 100644 --- a/front/components/trackers/TrackerBuilder.tsx +++ b/front/components/trackers/TrackerBuilder.tsx @@ -11,6 +11,7 @@ import { useSendNotification, } from "@dust-tt/sparkle"; import type { + APIError, DataSourceViewSelectionConfiguration, DataSourceViewType, SpaceType, @@ -24,9 +25,10 @@ import { TRACKER_FREQUENCIES, } from "@dust-tt/types"; import { useRouter } from "next/router"; -import { useMemo, useState } from "react"; +import { useContext, useMemo, useState } from "react"; import { AdvancedSettings } from "@app/components/assistant_builder/InstructionScreen"; +import { ConfirmContext } from "@app/components/Confirm"; import AppLayout from "@app/components/sparkle/AppLayout"; import { AppLayoutSimpleCloseTitle, @@ -53,10 +55,12 @@ export const TrackerBuilder = ({ initialTrackerId: string | null; }) => { const router = useRouter(); + const confirm = useContext(ConfirmContext); const sendNotification = useSendNotification(); const [edited, setEdited] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); + const [isDeleting, setIsDeleting] = useState(false); const [showMaintainedDsModal, setShowMaintainedDsModal] = useState(false); const [showWatchedDsModal, setShowWatchedDataSourcesModal] = useState(false); @@ -205,6 +209,54 @@ export const TrackerBuilder = ({ }); }; + const onDelete = async () => { + if (!initialTrackerId) { + // Should never happen. + sendNotification({ + title: "Failed to delete tracker", + description: "Can't delete a tracker that hasn't been created yet.", + type: "error", + }); + return; + } + + if ( + await confirm({ + title: "This can't be undone", + message: "Are you sure you want to delete this tracker?", + validateVariant: "warning", + }) + ) { + setIsDeleting(true); + const res = await fetch( + `/api/w/${owner.sId}/spaces/${globalSpace.sId}/trackers/${initialTrackerId}`, + { + method: "DELETE", + } + ); + if (res.ok) { + setIsDeleting(false); + void router.push(`/w/${owner.sId}/assistant/labs/trackers`); + sendNotification({ + title: "Tracker deleted", + description: "Tracker successfully deleted.", + type: "success", + }); + } else { + setIsDeleting(false); + const err = (await res.json()) as { error: APIError }; + sendNotification({ + title: "Failed to delete tracker", + description: err.error.message, + type: "error", + }); + } + return true; + } else { + return false; + } + }; + const trackableDataSourcesViews = useMemo( () => dataSourceViews.filter( @@ -284,7 +336,16 @@ export const TrackerBuilder = ({
-
+
+ {initialTrackerId && ( +
+ + + Blog Image + + + + + Blog Image + + Blog Image @@ -60,12 +84,12 @@ export function BlogSection() { Blog Image diff --git a/front/pages/home/solutions/customer-support.tsx b/front/pages/home/solutions/customer-support.tsx index cd7fd151076b..2af6b88d4d06 100644 --- a/front/pages/home/solutions/customer-support.tsx +++ b/front/pages/home/solutions/customer-support.tsx @@ -340,20 +340,20 @@ export default function CustomerSupport() { Blog Image Blog Image From c59515063d0d26d1874472d2517bce571e7d1016 Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:40:19 +0100 Subject: [PATCH 09/78] [parents_migration] Add and backfill Google Drive "Shared with me" folders (#9544) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Revert "[parents_migration] Add and backfill Google Drive "Shared wit…" This reverts commit 18bdec28b8e59b47689c4420df2cc97fcebe16b0. * allow using the batch commands for google_drive --- ...20241218_backfill_gdrive_shared_with_me.ts | 37 +++++++++++++++++++ .../src/connectors/google_drive/index.ts | 7 +++- .../google_drive/temporal/activities.ts | 25 ++++++++++++- .../google_drive/temporal/workflows.ts | 3 ++ connectors/src/lib/cli.ts | 1 + .../src/resources/connector/google_drive.ts | 4 +- 6 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 connectors/migrations/20241218_backfill_gdrive_shared_with_me.ts diff --git a/connectors/migrations/20241218_backfill_gdrive_shared_with_me.ts b/connectors/migrations/20241218_backfill_gdrive_shared_with_me.ts new file mode 100644 index 000000000000..d7e787e7edfe --- /dev/null +++ b/connectors/migrations/20241218_backfill_gdrive_shared_with_me.ts @@ -0,0 +1,37 @@ +import { makeScript } from "scripts/helpers"; + +import { GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID } from "@connectors/connectors/google_drive/lib/consts"; +import { getInternalId } from "@connectors/connectors/google_drive/temporal/utils"; +import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; +import { concurrentExecutor } from "@connectors/lib/async_utils"; +import { upsertDataSourceFolder } from "@connectors/lib/data_sources"; +import { ConnectorResource } from "@connectors/resources/connector_resource"; + +makeScript({}, async ({ execute }, logger) => { + const connectors = await ConnectorResource.listByType("google_drive", {}); + + await concurrentExecutor( + connectors, + async (connector) => { + const folderId = getInternalId(GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig: dataSourceConfigFromConnector(connector), + folderId, + parents: [folderId], + parentId: null, + title: "Shared with me", + mimeType: "application/vnd.dust.googledrive.folder", + }); + logger.info( + `Upserted folder ${folderId} for connector ${connector.id}` + ); + } else { + logger.info( + `Would upsert folder ${folderId} for connector ${connector.id}` + ); + } + }, + { concurrency: 10 } + ); +}); diff --git a/connectors/src/connectors/google_drive/index.ts b/connectors/src/connectors/google_drive/index.ts index 49ff2b1953f1..300eb24aeb35 100644 --- a/connectors/src/connectors/google_drive/index.ts +++ b/connectors/src/connectors/google_drive/index.ts @@ -409,7 +409,7 @@ export class GoogleDriveConnectorManager extends BaseConnectorManager { // that are not living in a shared drive. nodes.push({ provider: c.type, - internalId: GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID, + internalId: getInternalId(GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID), parentInternalId: null, type: "folder" as const, preventSelection: true, @@ -435,7 +435,10 @@ export class GoogleDriveConnectorManager extends BaseConnectorManager { // The "Shared with me" view requires to look for folders // with the flag `sharedWithMe=true`, but there is no need to check for the parents. let gdriveQuery = `mimeType='application/vnd.google-apps.folder'`; - if (parentInternalId === GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID) { + if ( + parentInternalId === + getInternalId(GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID) + ) { gdriveQuery += ` and sharedWithMe=true`; } else { gdriveQuery += ` and '${parentDriveId}' in parents`; diff --git a/connectors/src/connectors/google_drive/temporal/activities.ts b/connectors/src/connectors/google_drive/temporal/activities.ts index 9cab0a3653ca..45566089dc52 100644 --- a/connectors/src/connectors/google_drive/temporal/activities.ts +++ b/connectors/src/connectors/google_drive/temporal/activities.ts @@ -7,7 +7,10 @@ import StatsD from "hot-shots"; import PQueue from "p-queue"; import { Op } from "sequelize"; -import { GOOGLE_DRIVE_USER_SPACE_VIRTUAL_DRIVE_ID } from "@connectors/connectors/google_drive/lib/consts"; +import { + GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID, + GOOGLE_DRIVE_USER_SPACE_VIRTUAL_DRIVE_ID, +} from "@connectors/connectors/google_drive/lib/consts"; import { getGoogleDriveObject } from "@connectors/connectors/google_drive/lib/google_drive_api"; import { getFileParentsMemoized } from "@connectors/connectors/google_drive/lib/hierarchy"; import { syncOneFile } from "@connectors/connectors/google_drive/temporal/file"; @@ -54,6 +57,26 @@ type LightGoogleDrive = { export const statsDClient = new StatsD(); +/** + * Upserts to data_sources_folders (core) a top-level folder "Shared with me". + */ +export async function upsertSharedWithMeFolder(connectorId: ModelId) { + const connector = await ConnectorResource.fetchById(connectorId); + if (!connector) { + throw new Error(`Connector ${connectorId} not found`); + } + + const folderId = getInternalId(GOOGLE_DRIVE_SHARED_WITH_ME_VIRTUAL_ID); + await upsertDataSourceFolder({ + dataSourceConfig: dataSourceConfigFromConnector(connector), + folderId, + parents: [folderId], + parentId: null, + title: "Shared with me", + mimeType: "application/vnd.dust.googledrive.folder", + }); +} + export async function getDrives( connectorId: ModelId ): Promise { diff --git a/connectors/src/connectors/google_drive/temporal/workflows.ts b/connectors/src/connectors/google_drive/temporal/workflows.ts index 357e5269d7b8..a416b7edeb44 100644 --- a/connectors/src/connectors/google_drive/temporal/workflows.ts +++ b/connectors/src/connectors/google_drive/temporal/workflows.ts @@ -25,6 +25,7 @@ const { garbageCollectorFinished, markFolderAsVisited, shouldGarbageCollect, + upsertSharedWithMeFolder, } = proxyActivities({ startToCloseTimeout: "20 minutes", }); @@ -104,6 +105,8 @@ export async function googleDriveFullSync({ } }); + await upsertSharedWithMeFolder(connectorId); + // Temp to clean up the running workflows state foldersToBrowse = uniq(foldersToBrowse); diff --git a/connectors/src/lib/cli.ts b/connectors/src/lib/cli.ts index 247fe59d99ae..49b71f8ac833 100644 --- a/connectors/src/lib/cli.ts +++ b/connectors/src/lib/cli.ts @@ -271,6 +271,7 @@ export const batch = async ({ "intercom", "confluence", "github", + "google_drive", "snowflake", "zendesk", ]; diff --git a/connectors/src/resources/connector/google_drive.ts b/connectors/src/resources/connector/google_drive.ts index 152610d7bffe..438707d3608e 100644 --- a/connectors/src/resources/connector/google_drive.ts +++ b/connectors/src/resources/connector/google_drive.ts @@ -3,11 +3,9 @@ import type { Transaction } from "sequelize"; import { GoogleDriveConfig, - GoogleDriveSheet, -} from "@connectors/lib/models/google_drive"; -import { GoogleDriveFiles, GoogleDriveFolders, + GoogleDriveSheet, GoogleDriveSyncToken, } from "@connectors/lib/models/google_drive"; import type { From d1fa243e618f80a22551fe3154faaa581a17640e Mon Sep 17 00:00:00 2001 From: thib-martin <168569391+thib-martin@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:42:02 +0100 Subject: [PATCH 10/78] fixing some page alignment (#9548) * fixing some paging * dot --- .../home/content/Product/BlogSection.tsx | 22 +++++-------------- .../pages/home/solutions/customer-support.tsx | 2 +- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/front/components/home/content/Product/BlogSection.tsx b/front/components/home/content/Product/BlogSection.tsx index 70b80bb73178..eb8a40d0d145 100644 --- a/front/components/home/content/Product/BlogSection.tsx +++ b/front/components/home/content/Product/BlogSection.tsx @@ -34,7 +34,7 @@ export function BlogSection() {
- + - + - - - Blog Image - -
diff --git a/front/pages/home/solutions/customer-support.tsx b/front/pages/home/solutions/customer-support.tsx index 2af6b88d4d06..823cb4db5af2 100644 --- a/front/pages/home/solutions/customer-support.tsx +++ b/front/pages/home/solutions/customer-support.tsx @@ -353,7 +353,7 @@ export default function CustomerSupport() { Date: Thu, 19 Dec 2024 16:48:55 +0100 Subject: [PATCH 11/78] [sparkle] Fixed notification display (#9550) --- sparkle/package-lock.json | 4 ++-- sparkle/package.json | 2 +- sparkle/src/components/Notification.tsx | 12 +++--------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/sparkle/package-lock.json b/sparkle/package-lock.json index 35a0e9521912..68c156963886 100644 --- a/sparkle/package-lock.json +++ b/sparkle/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dust-tt/sparkle", - "version": "0.2.345", + "version": "0.2.346", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@dust-tt/sparkle", - "version": "0.2.345", + "version": "0.2.346", "license": "ISC", "dependencies": { "@emoji-mart/data": "^1.1.2", diff --git a/sparkle/package.json b/sparkle/package.json index 8519affc9066..7b11e5f28283 100644 --- a/sparkle/package.json +++ b/sparkle/package.json @@ -1,6 +1,6 @@ { "name": "@dust-tt/sparkle", - "version": "0.2.345", + "version": "0.2.346", "scripts": { "build": "rm -rf dist && npm run tailwind && npm run build:esm && npm run build:cjs", "tailwind": "tailwindcss -i ./src/styles/tailwind.css -o dist/sparkle.css", diff --git a/sparkle/src/components/Notification.tsx b/sparkle/src/components/Notification.tsx index 6b35a7aafd11..c2aeabe080eb 100644 --- a/sparkle/src/components/Notification.tsx +++ b/sparkle/src/components/Notification.tsx @@ -2,8 +2,7 @@ import { Transition } from "@headlessui/react"; import React, { useEffect } from "react"; import { createPortal } from "react-dom"; -import { IconButton } from "@sparkle/components/IconButton"; -import { CheckCircleIcon, XCircleIcon, XMarkIcon } from "@sparkle/icons"; +import { CheckCircleIcon, XCircleIcon } from "@sparkle/icons"; import { classNames } from "@sparkle/lib/utils"; import { Icon } from "./Icon"; @@ -40,6 +39,7 @@ export function Notification({ "s-pointer-events-auto s-flex s-max-w-[400px] s-flex-row s-items-center s-gap-2 s-rounded-xl s-border s-border-structure-100 s-bg-structure-0 s-p-4 s-shadow-xl", className )} + onClick={onClick} > {variant === "success" ? (
{title || variant}
-
{description && (
From b46327d1ea323ed37d5bd7cd222fbe0b132adefd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Thu, 19 Dec 2024 16:50:21 +0100 Subject: [PATCH 12/78] Code block copy button position is off (#9549) --- sparkle/src/components/markdown/ContentBlockWrapper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparkle/src/components/markdown/ContentBlockWrapper.tsx b/sparkle/src/components/markdown/ContentBlockWrapper.tsx index beb8a4bbc618..b267ddd034c9 100644 --- a/sparkle/src/components/markdown/ContentBlockWrapper.tsx +++ b/sparkle/src/components/markdown/ContentBlockWrapper.tsx @@ -106,7 +106,7 @@ export function ContentBlockWrapper({
{children}
-
+
{getContentToDownload && ( Date: Thu, 19 Dec 2024 16:51:46 +0100 Subject: [PATCH 13/78] [front] Add limit info (#9545) --- front/components/assistant_builder/ActionsScreen.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/front/components/assistant_builder/ActionsScreen.tsx b/front/components/assistant_builder/ActionsScreen.tsx index 96aaa89399c6..46a9bc2680a2 100644 --- a/front/components/assistant_builder/ActionsScreen.tsx +++ b/front/components/assistant_builder/ActionsScreen.tsx @@ -939,8 +939,9 @@ function ActionEditor({ What's the data?
- Provide a brief description of the data content and context to - help the assistant determine when to utilize it effectively + Provide a brief description (maximum 800 characters) of the data + content and context to help the assistant determine when to + utilize it effectively
) : ( From 43481eabac716cc399bd4f6be618beb7d3174a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Thu, 19 Dec 2024 16:56:36 +0100 Subject: [PATCH 14/78] From: Bump Sparkle to 0.2.346 (#9551) --- front/package-lock.json | 8 ++++---- front/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 6df44f16f4f0..fe208e1d9d4d 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -7,7 +7,7 @@ "dependencies": { "@auth0/nextjs-auth0": "^3.5.0", "@dust-tt/client": "file:../sdks/js", - "@dust-tt/sparkle": "0.2.345", + "@dust-tt/sparkle": "0.2.346", "@dust-tt/types": "file:../types", "@headlessui/react": "^1.7.7", "@heroicons/react": "^2.0.11", @@ -11453,9 +11453,9 @@ "link": true }, "node_modules/@dust-tt/sparkle": { - "version": "0.2.345", - "resolved": "https://registry.npmjs.org/@dust-tt/sparkle/-/sparkle-0.2.345.tgz", - "integrity": "sha512-4VdoTpN8OOg2FJ5EHPx1xAk7YGRLP5mAvps9TkjGCMkgPTTV0vdq/4U3iLN9phaM70B8YQVfeurI9uLzAOK61A==", + "version": "0.2.346", + "resolved": "https://registry.npmjs.org/@dust-tt/sparkle/-/sparkle-0.2.346.tgz", + "integrity": "sha512-wNOGHTcf/usi9mZMvIeMGxvvIydAh9YUhz9Sdp99KV68953wCyzSuIp5LVlHeYf8IoISJxqS9Hp3RCIgv0rLxg==", "dependencies": { "@emoji-mart/data": "^1.1.2", "@emoji-mart/react": "^1.1.1", diff --git a/front/package.json b/front/package.json index 139ba8abc94e..061926a49b0e 100644 --- a/front/package.json +++ b/front/package.json @@ -20,7 +20,7 @@ "dependencies": { "@auth0/nextjs-auth0": "^3.5.0", "@dust-tt/client": "file:../sdks/js", - "@dust-tt/sparkle": "0.2.345", + "@dust-tt/sparkle": "0.2.346", "@dust-tt/types": "file:../types", "@headlessui/react": "^1.7.7", "@heroicons/react": "^2.0.11", From 472322e85137d875039f9ecc72039962f23cc1ed Mon Sep 17 00:00:00 2001 From: Philippe Rolet Date: Thu, 19 Dec 2024 16:59:01 +0100 Subject: [PATCH 15/78] [Keyword search] Webcrawler folders update & backfill (#9515) * folders update * delete folders * backfill * clean * log --- .../20241218_backfill_webcrawler_folders.ts | 93 +++++++++++++++++++ .../webcrawler/temporal/activities.ts | 32 ++++++- 2 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 connectors/migrations/20241218_backfill_webcrawler_folders.ts diff --git a/connectors/migrations/20241218_backfill_webcrawler_folders.ts b/connectors/migrations/20241218_backfill_webcrawler_folders.ts new file mode 100644 index 000000000000..edbaacd52132 --- /dev/null +++ b/connectors/migrations/20241218_backfill_webcrawler_folders.ts @@ -0,0 +1,93 @@ +import assert from "node:assert"; + +import { concurrentExecutor } from "@dust-tt/types"; +import _ from "lodash"; +import { makeScript } from "scripts/helpers"; + +import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; +import { upsertDataSourceFolder } from "@connectors/lib/data_sources"; +import { WebCrawlerFolder } from "@connectors/lib/models/webcrawler"; +import { ConnectorResource } from "@connectors/resources/connector_resource"; + +makeScript( + { + nextConnectorId: { + type: "number", + required: false, + default: 0, + }, + connectorId: { + type: "number", + required: false, + default: 0, + }, + }, + async ({ execute, nextConnectorId }, logger) => { + logger.info( + { + nextConnectorId, + }, + "Starting backfill" + ); + + const connectors = await ConnectorResource.listByType("webcrawler", {}); + + // sort connectors by id and start from nextConnectorId + const sortedConnectors = connectors + .sort((a, b) => a.id - b.id) + .filter((_, idx) => idx >= nextConnectorId); + + for (const connector of sortedConnectors) { + const dataSourceConfig = dataSourceConfigFromConnector(connector); + const connectorId = connector.id; + + const folders = await WebCrawlerFolder.findAll({ + where: { + connectorId, + }, + }); + + const foldersByUrl = _.keyBy(folders, "url"); + + const getParents = (folder: WebCrawlerFolder): string[] => { + assert( + folder.parentUrl === null || foldersByUrl[folder.parentUrl], + "Parent folder not found" + ); + const parentFolder = folder.parentUrl + ? foldersByUrl[folder.parentUrl] + : null; + return [ + folder.internalId, + ...(parentFolder ? getParents(parentFolder) : []), + ]; + }; + await concurrentExecutor( + folders, + async (folder) => { + logger.info({ + folderId: folder.internalId, + folderUrl: folder.url, + execute, + }); + if (execute) { + const result = await upsertDataSourceFolder({ + dataSourceConfig, + folderId: folder.internalId, + timestampMs: folder.updatedAt.getTime(), + parents: getParents(folder), + title: folder.url, + mimeType: "application/vnd.dust.webcrawler.folder", + }); + logger.info({ + result, + folderId: folder.internalId, + folderUrl: folder.url, + }); + } + }, + { concurrency: 8 } + ); + } + } +); diff --git a/connectors/src/connectors/webcrawler/temporal/activities.ts b/connectors/src/connectors/webcrawler/temporal/activities.ts index 1c26d76ef531..cea57969e776 100644 --- a/connectors/src/connectors/webcrawler/temporal/activities.ts +++ b/connectors/src/connectors/webcrawler/temporal/activities.ts @@ -30,8 +30,10 @@ import { import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; import { deleteDataSourceDocument, + deleteDataSourceFolder, MAX_SMALL_DOCUMENT_TXT_LEN, upsertDataSourceDocument, + upsertDataSourceFolder, } from "@connectors/lib/data_sources"; import { WebCrawlerFolder, @@ -251,8 +253,13 @@ export async function crawlWebsiteByConnectorId(connectorId: ModelId) { totalExtracted += extracted.length; const pageTitle = $("title").text(); - const folders = getAllFoldersForUrl(request.url); - for (const folder of folders) { + // note that parentFolderUrls.length === parentFolderIds.length -1 + // since parentFolderIds includes the page as first element + // and parentFolderUrls does not + const parentFolderUrls = getAllFoldersForUrl(request.url); + const parentFolderIds = getParentsForPage(request.url, false); + + for (const [index, folder] of parentFolderUrls.entries()) { if (createdFolders.has(folder)) { continue; } @@ -260,7 +267,7 @@ export async function crawlWebsiteByConnectorId(connectorId: ModelId) { const logicalParent = isTopFolder(request.url) ? null : getFolderForUrl(folder); - await WebCrawlerFolder.upsert({ + const [webCrawlerFolder] = await WebCrawlerFolder.upsert({ url: folder, parentUrl: logicalParent, connectorId: connector.id, @@ -272,6 +279,19 @@ export async function crawlWebsiteByConnectorId(connectorId: ModelId) { lastSeenAt: new Date(), }); + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: webCrawlerFolder.internalId, + timestampMs: webCrawlerFolder.updatedAt.getTime(), + + // parent folder ids of the page are in hierarchy order from the + // page to the root so for the current folder, its parents start at + // index+1 (including itself as first parent) and end at the root + parents: parentFolderIds.slice(index + 1), + title: folder, + mimeType: "application/vnd.dust.webcrawler.folder", + }); + createdFolders.add(folder); } const documentId = stableIdForUrl({ @@ -342,7 +362,7 @@ export async function crawlWebsiteByConnectorId(connectorId: ModelId) { documentUrl: validatedUrl.standardized, timestampMs: new Date().getTime(), tags: [`title:${stripNullBytes(pageTitle)}`], - parents: getParentsForPage(request.url, false), + parents: parentFolderIds, upsertContext: { sync_type: "batch", }, @@ -552,6 +572,10 @@ export async function webCrawlerGarbageCollector( type: "delete_folder", }); for (const folder of foldersToDelete) { + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: folder.internalId, + }); await folder.destroy(); } } while (foldersToDelete.length > 0); From f67b17e3073658b977e30078847ee065b4729bb6 Mon Sep 17 00:00:00 2001 From: Edouard Wautier <4435185+Duncid@users.noreply.github.com> Date: Thu, 19 Dec 2024 17:03:55 +0100 Subject: [PATCH 16/78] small (#9542) --- sparkle/src/components/AssistantCard.tsx | 4 +++- sparkle/src/components/Citation.tsx | 2 +- sparkle/src/stories/AssistantCard.stories.tsx | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sparkle/src/components/AssistantCard.tsx b/sparkle/src/components/AssistantCard.tsx index dfde7bd7fc8f..15d4cb0d003f 100644 --- a/sparkle/src/components/AssistantCard.tsx +++ b/sparkle/src/components/AssistantCard.tsx @@ -102,7 +102,9 @@ export const LargeAssistantCard = React.forwardRef<

{title}

-

{description}

+

+ {description} +

diff --git a/sparkle/src/components/Citation.tsx b/sparkle/src/components/Citation.tsx index ae77221ac394..9dbb281cc747 100644 --- a/sparkle/src/components/Citation.tsx +++ b/sparkle/src/components/Citation.tsx @@ -205,7 +205,7 @@ const CitationTitle = React.forwardRef( ref={ref} className={cn( "s-z-10", - "s-line-clamp-1 s-overflow-hidden s-text-ellipsis", + "s-line-clamp-1 s-overflow-hidden s-text-ellipsis s-break-all", "s-text-sm s-font-medium s-text-foreground", className )} diff --git a/sparkle/src/stories/AssistantCard.stories.tsx b/sparkle/src/stories/AssistantCard.stories.tsx index 4271a0fced68..1bf7dd4fa0d4 100644 --- a/sparkle/src/stories/AssistantCard.stories.tsx +++ b/sparkle/src/stories/AssistantCard.stories.tsx @@ -48,7 +48,7 @@ export const AssistantCardExample = () => ( Date: Thu, 19 Dec 2024 17:07:02 +0100 Subject: [PATCH 17/78] add log (#9552) --- .../migrations/20241218_backfill_webcrawler_folders.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/connectors/migrations/20241218_backfill_webcrawler_folders.ts b/connectors/migrations/20241218_backfill_webcrawler_folders.ts index edbaacd52132..0932a3613e2d 100644 --- a/connectors/migrations/20241218_backfill_webcrawler_folders.ts +++ b/connectors/migrations/20241218_backfill_webcrawler_folders.ts @@ -40,7 +40,12 @@ makeScript( for (const connector of sortedConnectors) { const dataSourceConfig = dataSourceConfigFromConnector(connector); const connectorId = connector.id; - + logger.info( + { + connectorId, + }, + "Starting connector backfill" + ); const folders = await WebCrawlerFolder.findAll({ where: { connectorId, From 97902e7222f3f4b7f08a8fe2f7d79efc9500a1fc Mon Sep 17 00:00:00 2001 From: Stanislas Polu Date: Thu, 19 Dec 2024 17:13:26 +0100 Subject: [PATCH 18/78] Remove new conversation input bar animation (#9534) * Remove new conversation input bar animation * imports --- .../conversation/ConversationContainer.tsx | 75 +++++-------------- .../conversation/ConversationLayout.tsx | 3 +- .../conversation/ConversationTitle.tsx | 16 ++-- .../conversation/input_bar/InputBar.tsx | 5 +- 4 files changed, 33 insertions(+), 66 deletions(-) diff --git a/front/components/assistant/conversation/ConversationContainer.tsx b/front/components/assistant/conversation/ConversationContainer.tsx index 3a8c4651c985..530431ea1c73 100644 --- a/front/components/assistant/conversation/ConversationContainer.tsx +++ b/front/components/assistant/conversation/ConversationContainer.tsx @@ -11,16 +11,8 @@ import type { } from "@dust-tt/types"; import type { UploadedContentFragment } from "@dust-tt/types"; import { Err, Ok } from "@dust-tt/types"; -import { Transition } from "@headlessui/react"; import { useRouter } from "next/router"; -import { - Fragment, - useCallback, - useContext, - useEffect, - useRef, - useState, -} from "react"; +import { useCallback, useContext, useEffect, useRef, useState } from "react"; import { ReachedLimitPopup } from "@app/components/app/ReachedLimitPopup"; import { AssistantBrowserContainer } from "@app/components/assistant/conversation/AssistantBrowserContainer"; @@ -231,12 +223,12 @@ export function ConversationContainer({ }); } else { // We start the push before creating the message to optimize for instantaneity as well. - setActiveConversationId(conversationRes.value.sId); - void router.push( + await router.push( `/w/${owner.sId}/assistant/${conversationRes.value.sId}`, undefined, { shallow: true } ); + setActiveConversationId(conversationRes.value.sId); return new Ok(undefined); } @@ -287,39 +279,19 @@ export function ConversationContainer({ description="Drag and drop your text files (txt, doc, pdf) and image files (jpg, png) here." title="Attach files to the conversation" > - - {activeConversationId ? ( - - ) : ( -
- )} -
- - + {activeConversationId ? ( + + ) : ( +
+ )} + + {!activeConversationId && (
-
+ )} - + {!activeConversationId && ( { @@ -356,7 +319,7 @@ export function ConversationContainer({ owner={owner} isBuilder={isBuilder} /> - + )} void; }) { @@ -52,7 +54,7 @@ export function ConversationTitle({ const onTitleChange = async (title: string) => { try { const res = await fetch( - `/api/w/${owner.sId}/assistant/conversations/${conversation.sId}`, + `/api/w/${owner.sId}/assistant/conversations/${conversationId}`, { method: "PATCH", headers: { @@ -65,7 +67,7 @@ export function ConversationTitle({ } ); await mutate( - `/api/w/${owner.sId}/assistant/conversations/${conversation.sId}` + `/api/w/${owner.sId}/assistant/conversations/${conversationId}` ); void mutate(`/api/w/${owner.sId}/assistant/conversations`); if (!res.ok) { @@ -86,7 +88,7 @@ export function ConversationTitle({ onClose={() => setShowDeleteDialog(false)} onDelete={() => { setShowDeleteDialog(false); - onDelete(conversation.sId); + onDelete(conversationId); }} /> )} @@ -94,7 +96,7 @@ export function ConversationTitle({
{!isEditingTitle ? (
- {conversation.title || ""} + {conversation?.title || ""}
) : (
@@ -162,7 +164,7 @@ export function ConversationTitle({ { - setEditedTitle(conversation.title || ""); + setEditedTitle(conversation?.title || ""); setIsEditingTitle(true); }} size="sm" @@ -173,7 +175,7 @@ export function ConversationTitle({
diff --git a/front/components/assistant/conversation/input_bar/InputBar.tsx b/front/components/assistant/conversation/input_bar/InputBar.tsx index e7781e30f63f..4a313df04da9 100644 --- a/front/components/assistant/conversation/input_bar/InputBar.tsx +++ b/front/components/assistant/conversation/input_bar/InputBar.tsx @@ -168,7 +168,8 @@ export function AssistantInputBar({ ...new Set(rawMentions.map((mention) => mention.id)), ].map((id) => ({ configurationId: id })); - // When we are creating a new conversation, we will disable the input bar, show a loading spinner and in case of error, re-enable the input bar + // When we are creating a new conversation, we will disable the input bar, show a loading + // spinner and in case of error, re-enable the input bar if (!conversationId) { setLoading(true); setDisableSendButton(true); @@ -237,7 +238,7 @@ export function AssistantInputBar({ }), } ); - await mutateConversation(); + mutateConversation(); }; useEffect(() => { From 74f256f22b738eef1523130efe3360bd96b2251a Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Thu, 19 Dec 2024 17:16:25 +0100 Subject: [PATCH 19/78] [front] Fixed loading state (#9553) --- front/lib/swr/datasets.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/lib/swr/datasets.ts b/front/lib/swr/datasets.ts index f9ca43b32804..45f37fb5870a 100644 --- a/front/lib/swr/datasets.ts +++ b/front/lib/swr/datasets.ts @@ -39,18 +39,18 @@ export function useDataset( showData = false ) { const datasetFetcher: Fetcher = fetcher; - + const disabled = !dataset; const { data, error, mutate } = useSWRWithDefaults( `/api/w/${owner.sId}/spaces/${app.space.sId}/apps/${app.sId}/datasets/${dataset}${ showData ? "?data=true" : "" }`, datasetFetcher, - { disabled: !dataset } + { disabled } ); return { dataset: data ? data.dataset : null, - isDatasetLoading: !error && !data, + isDatasetLoading: !error && !data && !disabled, isDatasetError: !!error, mutateDataset: mutate, }; From 954bb31c7ce54cfc67b3101ccbbf5fef84185452 Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Thu, 19 Dec 2024 17:38:12 +0100 Subject: [PATCH 20/78] implement missing cases for github (#9536) --- connectors/src/connectors/github/index.ts | 94 +++++++++++++++++-- connectors/src/connectors/github/lib/utils.ts | 42 +++++++++ 2 files changed, 128 insertions(+), 8 deletions(-) diff --git a/connectors/src/connectors/github/index.ts b/connectors/src/connectors/github/index.ts index 17a0c45563cb..27828f269be6 100644 --- a/connectors/src/connectors/github/index.ts +++ b/connectors/src/connectors/github/index.ts @@ -5,6 +5,7 @@ import type { Result, } from "@dust-tt/types"; import { assertNever, Err, Ok } from "@dust-tt/types"; +import { Op } from "sequelize"; import type { GithubRepo } from "@connectors/connectors/github/lib/github_api"; import { @@ -18,7 +19,11 @@ import { } from "@connectors/connectors/github/lib/hierarchy"; import { getCodeRootInternalId, + getDiscussionInternalId, getDiscussionsInternalId, + getGithubIdsFromDiscussionInternalId, + getGithubIdsFromIssueInternalId, + getIssueInternalId, getIssuesInternalId, getRepositoryInternalId, matchGithubInternalIdType, @@ -436,10 +441,12 @@ export class GithubConnectorManager extends BaseConnectorManager { return new Ok(nodes); } - // we should never be getting issues, discussions or code files as parent + // we should never be getting issues, discussions, code files, single issues or discussions as parent case "REPO_ISSUES": case "REPO_DISCUSSIONS": case "REPO_CODE_FILE": + case "REPO_DISCUSSION": + case "REPO_ISSUE": return new Err(new Error("Invalid parent ID.")); default: assertNever(type); @@ -471,6 +478,10 @@ export class GithubConnectorManager extends BaseConnectorManager { const allIssuesFromRepoIds: number[] = []; const allDiscussionsFromRepoIds: number[] = []; + // Single issues or discussions + const issueIds: { repoId: string; issueNumber: number }[] = []; + const discussionIds: { repoId: string; discussionNumber: number }[] = []; + // The full code, or a specific folder or file in the code const allCodeFromRepoIds: string[] = []; const codeDirectoryIds: string[] = []; @@ -500,6 +511,12 @@ export class GithubConnectorManager extends BaseConnectorManager { case "REPO_CODE_FILE": codeFileIds.push(internalId); break; + case "REPO_DISCUSSION": + discussionIds.push(getGithubIdsFromDiscussionInternalId(internalId)); + break; + case "REPO_ISSUE": + issueIds.push(getGithubIdsFromIssueInternalId(internalId)); + break; default: assertNever(type); } @@ -544,6 +561,22 @@ export class GithubConnectorManager extends BaseConnectorManager { }), ]); + // Issues and Discussions are also stored in the db + const [issues, discussions] = await Promise.all([ + GithubIssue.findAll({ + where: { + connectorId: c.id, + [Op.or]: issueIds, + }, + }), + GithubDiscussion.findAll({ + where: { + connectorId: c.id, + [Op.or]: discussionIds, + }, + }), + ]); + // Constructing Nodes for Full Repo fullRepoIds.forEach((repoId) => { const repo = uniqueRepos[repoId]; @@ -605,6 +638,46 @@ export class GithubConnectorManager extends BaseConnectorManager { }); }); + issues.forEach((issue) => { + const { repoId, issueNumber } = issue; + const repo = uniqueRepos[parseInt(repoId, 10)]; + if (!repo) { + return; + } + nodes.push({ + provider: c.type, + internalId: getIssueInternalId(repoId, issueNumber), + parentInternalId: getIssuesInternalId(repoId), + type: "file", + title: `Issue #${issueNumber}`, + sourceUrl: repo.url + `/issues/${issueNumber}`, + expandable: false, + permission: "read", + dustDocumentId: getIssueInternalId(repoId, issueNumber), + lastUpdatedAt: issue.updatedAt.getTime(), + }); + }); + + discussions.forEach((discussion) => { + const { repoId, discussionNumber } = discussion; + const repo = uniqueRepos[parseInt(repoId, 10)]; + if (!repo) { + return; + } + nodes.push({ + provider: c.type, + internalId: getDiscussionInternalId(repoId, discussionNumber), + parentInternalId: getDiscussionsInternalId(repoId), + type: "file", + title: `Discussion #${discussionNumber}`, + sourceUrl: repo.url + `/discussions/${discussionNumber}`, + expandable: false, + permission: "read", + dustDocumentId: getDiscussionInternalId(repoId, discussionNumber), + lastUpdatedAt: discussion.updatedAt.getTime(), + }); + }); + // Constructing Nodes for Code fullCodeInRepos.forEach((codeRepo) => { const repo = uniqueRepos[parseInt(codeRepo.repoId)]; @@ -679,13 +752,6 @@ export class GithubConnectorManager extends BaseConnectorManager { ); } - if (/^github-issue-\d+-\d+$/.test(internalId)) { - return new Ok([internalId]); // this is incorrect but matches the previous behavior, will fix in a follow-up PR - } - if (/^github-discussion-\d+-\d+$/.test(internalId)) { - return new Ok([internalId]); // this is incorrect but matches the previous behavior, will fix in a follow-up PR - } - const { type, repoId } = matchGithubInternalIdType(internalId); switch (type) { @@ -715,6 +781,18 @@ export class GithubConnectorManager extends BaseConnectorManager { ); return new Ok([internalId, ...parents]); } + case "REPO_ISSUE": + return new Ok([ + internalId, + getIssuesInternalId(repoId), + getRepositoryInternalId(repoId), + ]); + case "REPO_DISCUSSION": + return new Ok([ + internalId, + getDiscussionsInternalId(repoId), + getRepositoryInternalId(repoId), + ]); default: { assertNever(type); } diff --git a/connectors/src/connectors/github/lib/utils.ts b/connectors/src/connectors/github/lib/utils.ts index 8cb0faddd1e0..9c95bad9b1cb 100644 --- a/connectors/src/connectors/github/lib/utils.ts +++ b/connectors/src/connectors/github/lib/utils.ts @@ -7,6 +7,8 @@ export const GITHUB_CONTENT_NODE_TYPES = [ "REPO_CODE", "REPO_CODE_DIR", "REPO_CODE_FILE", + "REPO_ISSUE", + "REPO_DISCUSSION", ] as const; export type GithubContentNodeType = (typeof GITHUB_CONTENT_NODE_TYPES)[number]; @@ -19,6 +21,28 @@ export function isGithubCodeFileId(internalId: string): boolean { return /^github-code-\d+-file-[a-f0-9]+$/.test(internalId); } +export function getGithubIdsFromDiscussionInternalId(internalId: string): { + repoId: string; + discussionNumber: number; +} { + const pattern = /^github-discussion-(\d+)-(\d+)$/; + return { + repoId: parseInt(internalId.replace(pattern, "$1"), 10).toString(), + discussionNumber: parseInt(internalId.replace(pattern, "$2"), 10), + }; +} + +export function getGithubIdsFromIssueInternalId(internalId: string): { + repoId: string; + issueNumber: number; +} { + const pattern = /^github-issue-(\d+)-(\d+)$/; + return { + repoId: parseInt(internalId.replace(pattern, "$1"), 10).toString(), + issueNumber: parseInt(internalId.replace(pattern, "$2"), 10), + }; +} + /** * Gets the type of the Github content node from its internal id. */ @@ -74,6 +98,24 @@ export function matchGithubInternalIdType(internalId: string): { ), }; } + if (/^github-issue-\d+-\d+$/.test(internalId)) { + return { + type: "REPO_ISSUE", + repoId: parseInt( + internalId.replace(/^github-issue-(\d+)-\d+$/, "$1"), + 10 + ), + }; + } + if (/^github-discussion-\d+-\d+$/.test(internalId)) { + return { + type: "REPO_DISCUSSION", + repoId: parseInt( + internalId.replace(/^github-discussion-(\d+)-\d+$/, "$1"), + 10 + ), + }; + } throw new Error(`Invalid Github internal id: ${internalId}`); } From 0ac967090205dc878dc3631ab59eef3d7290cf23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Thu, 19 Dec 2024 18:17:11 +0100 Subject: [PATCH 21/78] Display Dust App name in error messages (#9555) --- front/lib/api/assistant/actions/dust_app_run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/lib/api/assistant/actions/dust_app_run.ts b/front/lib/api/assistant/actions/dust_app_run.ts index 80cbf2a7d2e1..b0fbb273fbd5 100644 --- a/front/lib/api/assistant/actions/dust_app_run.ts +++ b/front/lib/api/assistant/actions/dust_app_run.ts @@ -333,7 +333,7 @@ export class DustAppRunConfigurationServerRunner extends BaseActionConfiguration messageId: agentMessage.sId, error: { code: "dust_app_run_error", - message: `Error running Dust app: ${runRes.error.message}`, + message: `Dust App ${app.name}: ${runRes.error.message}`, }, }; return; From 4bd92a4c58d7031c0d36201c4a727ce7672e426a Mon Sep 17 00:00:00 2001 From: Philippe Rolet Date: Thu, 19 Dec 2024 20:56:44 +0100 Subject: [PATCH 22/78] [Keyword search] Remove node from index on delete (#9520) * [Keyword search] Remove node from index on delete Description --- Fixes #9460 Also moves without changing search_store pre-existing functions Risks --- - slow down or fail deletes => unlikely given speed of deletion - miss some nodes deletion Deploy --- core * refactor delete_folder --- core/bin/core_api.rs | 61 +++++------- core/src/data_sources/data_source.rs | 16 +++- core/src/databases/table.rs | 10 ++ core/src/search_stores/search_store.rs | 126 +++++++++++++++---------- 4 files changed, 126 insertions(+), 87 deletions(-) diff --git a/core/bin/core_api.rs b/core/bin/core_api.rs index 71bee00e5aea..d59dae3b78b7 100644 --- a/core/bin/core_api.rs +++ b/core/bin/core_api.rs @@ -1988,6 +1988,7 @@ async fn data_sources_documents_delete( .delete_document( state.store.clone(), state.qdrant_clients.clone(), + state.search_store.clone(), &document_id, ) .await @@ -2095,6 +2096,7 @@ async fn data_sources_delete( state.store.clone(), state.databases_store.clone(), state.qdrant_clients.clone(), + state.search_store.clone(), ) .await { @@ -2398,7 +2400,11 @@ async fn tables_delete( ), Ok(Some(table)) => { match table - .delete(state.store.clone(), state.databases_store.clone()) + .delete( + state.store.clone(), + state.databases_store.clone(), + Some(state.search_store.clone()), + ) .await { Err(e) => error_response( @@ -3042,51 +3048,34 @@ async fn folders_delete( ) -> (StatusCode, Json) { let project = project::Project::new_from_id(project_id); - match state - .store - .load_data_source_folder(&project, &data_source_id, &folder_id) - .await - { + let result = async { + state + .store + .load_data_source_folder(&project, &data_source_id, &folder_id) + .await?; + state + .store + .delete_data_source_folder(&project, &data_source_id, &folder_id) + .await?; + state.search_store.delete_node(folder_id).await?; + Ok(()) + } + .await; + + match result { Err(e) => error_response( StatusCode::INTERNAL_SERVER_ERROR, "internal_server_error", - "Failed to load folder", + "Failed to delete folder", Some(e), ), - Ok(None) => ( + Ok(_) => ( StatusCode::OK, Json(APIResponse { error: None, - response: Some(json!({ - "success": true, - })), + response: Some(json!({"success": true})), }), ), - Ok(Some(_)) => { - match state - .store - .delete_data_source_folder(&project, &data_source_id, &folder_id) - .await - { - Err(e) => { - return error_response( - StatusCode::INTERNAL_SERVER_ERROR, - "internal_server_error", - "Failed to delete folder", - Some(e), - ) - } - Ok(_) => ( - StatusCode::OK, - Json(APIResponse { - error: None, - response: Some(json!({ - "success": true, - })), - }), - ), - } - } } } diff --git a/core/src/data_sources/data_source.rs b/core/src/data_sources/data_source.rs index 817287fcc23b..f7085e029bcb 100644 --- a/core/src/data_sources/data_source.rs +++ b/core/src/data_sources/data_source.rs @@ -1714,6 +1714,7 @@ impl DataSource { &self, store: Box, qdrant_clients: QdrantClients, + search_store: Box, document_id: &str, ) -> Result<()> { // Delete the document in the main embedder collection. @@ -1738,6 +1739,9 @@ impl DataSource { .delete_data_source_document(&self.project, &self.data_source_id, document_id) .await?; + // Delete document from search index. + search_store.delete_node(document_id.to_string()).await?; + // We also scrub it directly. We used to scrub async but now that we store a GCS version // for each data_source_documents entry we can scrub directly at the time of delete. self.scrub_document_deleted_versions(store, document_id) @@ -1959,6 +1963,7 @@ impl DataSource { store: Box, databases_store: Box, qdrant_clients: QdrantClients, + search_store: Box, ) -> Result<()> { if self.shadow_write_qdrant_cluster().is_some() { Err(anyhow!( @@ -1991,7 +1996,9 @@ impl DataSource { try_join_all( tables .iter() - .map(|t| t.delete(store.clone(), databases_store.clone())), + // not deleting from search index here, as it's done more efficiently in the + // full-nodes deletion below + .map(|t| t.delete(store.clone(), databases_store.clone(), None)), ) .await?; @@ -2001,9 +2008,11 @@ impl DataSource { "Deleted tables" ); + // Delete folders (concurrently). let (folders, total) = store .list_data_source_folders(&self.project, &self.data_source_id, &None, &None, None) .await?; + try_join_all(folders.iter().map(|f| { store.delete_data_source_folder(&self.project, &self.data_source_id, &f.folder_id()) })) @@ -2015,6 +2024,11 @@ impl DataSource { "Deleted folders" ); + // Delete all nodes from the search index + search_store + .delete_data_source_nodes(&self.data_source_id) + .await?; + // Delete data source and documents (SQL). let deleted_rows = store .delete_data_source(&self.project, &self.data_source_id) diff --git a/core/src/databases/table.rs b/core/src/databases/table.rs index 91f0cceb6adb..24a9359fd5d8 100644 --- a/core/src/databases/table.rs +++ b/core/src/databases/table.rs @@ -12,6 +12,7 @@ use crate::{ databases_store::store::DatabasesStore, project::Project, search_filter::{Filterable, SearchFilter}, + search_stores::search_store::SearchStore, sqlite_workers::client::HEARTBEAT_INTERVAL_MS, stores::store::Store, utils, @@ -170,10 +171,12 @@ impl Table { self.schema = Some(schema); } + // if search_store is provided, delete the table node from the search index pub async fn delete( &self, store: Box, databases_store: Box, + search_store: Option>, ) -> Result<()> { if self.table_type()? == TableType::Local { // Invalidate the databases that use the table. @@ -205,6 +208,13 @@ impl Table { .delete_data_source_table(&self.project, &self.data_source_id, &self.table_id) .await?; + // Delete the table node from the search index. + if let Some(search_store) = search_store { + search_store + .delete_node(self.table_id().to_string()) + .await?; + } + Ok(()) } diff --git a/core/src/search_stores/search_store.rs b/core/src/search_stores/search_store.rs index 27bd47d7f255..53d2c9baabb8 100644 --- a/core/src/search_stores/search_store.rs +++ b/core/src/search_stores/search_store.rs @@ -3,7 +3,7 @@ use async_trait::async_trait; use elasticsearch::{ auth::Credentials, http::transport::{SingleNodeConnectionPool, TransportBuilder}, - Elasticsearch, IndexParts, SearchParts, + DeleteByQueryParts, DeleteParts, Elasticsearch, IndexParts, SearchParts, }; use serde_json::json; use url::Url; @@ -35,10 +35,15 @@ pub trait SearchStore { filter: Vec, options: Option, ) -> Result>; + + async fn index_node(&self, node: Node) -> Result<()>; async fn index_document(&self, document: Document) -> Result<()>; async fn index_table(&self, table: Table) -> Result<()>; async fn index_folder(&self, folder: Folder) -> Result<()>; - async fn index_node(&self, node: Node) -> Result<()>; + + async fn delete_node(&self, node_id: String) -> Result<()>; + async fn delete_data_source_nodes(&self, data_source_id: &str) -> Result<()>; + fn clone_box(&self) -> Box; } @@ -82,54 +87,6 @@ const NODES_INDEX_NAME: &str = "core.data_sources_nodes"; #[async_trait] impl SearchStore for ElasticsearchSearchStore { - async fn index_document(&self, document: Document) -> Result<()> { - let node = Node::from(document); - self.index_node(node).await - } - - async fn index_table(&self, table: Table) -> Result<()> { - let node = Node::from(table); - self.index_node(node).await - } - - async fn index_folder(&self, folder: Folder) -> Result<()> { - let node = Node::from(folder); - self.index_node(node).await - } - - async fn index_node(&self, node: Node) -> Result<()> { - // todo(kw-search): fail on error - let now = utils::now(); - match self - .client - .index(IndexParts::IndexId(NODES_INDEX_NAME, &node.node_id)) - .timeout("200ms") - .body(node.clone()) - .send() - .await - { - Ok(_) => { - info!( - duration = utils::now() - now, - node_id = node.node_id, - "[ElasticsearchSearchStore] Indexed {}", - node.node_type.to_string() - ); - Ok(()) - } - Err(e) => { - error!( - error = %e, - duration = utils::now() - now, - node_id = node.node_id, - "[ElasticsearchSearchStore] Failed to index {}", - node.node_type.to_string() - ); - Ok(()) - } - } - } - async fn search_nodes( &self, query: String, @@ -190,6 +147,75 @@ impl SearchStore for ElasticsearchSearchStore { } } + async fn index_node(&self, node: Node) -> Result<()> { + // todo(kw-search): fail on error + let now = utils::now(); + match self + .client + .index(IndexParts::IndexId(NODES_INDEX_NAME, &node.node_id)) + .timeout("200ms") + .body(node.clone()) + .send() + .await + { + Ok(_) => { + info!( + duration = utils::now() - now, + node_id = node.node_id, + "[ElasticsearchSearchStore] Indexed {}", + node.node_type.to_string() + ); + Ok(()) + } + Err(e) => { + error!( + error = %e, + duration = utils::now() - now, + node_id = node.node_id, + "[ElasticsearchSearchStore] Failed to index {}", + node.node_type.to_string() + ); + Ok(()) + } + } + } + + async fn index_document(&self, document: Document) -> Result<()> { + let node = Node::from(document); + self.index_node(node).await + } + + async fn index_table(&self, table: Table) -> Result<()> { + let node = Node::from(table); + self.index_node(node).await + } + + async fn index_folder(&self, folder: Folder) -> Result<()> { + let node = Node::from(folder); + self.index_node(node).await + } + + async fn delete_node(&self, node_id: String) -> Result<()> { + self.client + .delete(DeleteParts::IndexId(NODES_INDEX_NAME, &node_id)) + .send() + .await?; + Ok(()) + } + + async fn delete_data_source_nodes(&self, data_source_id: &str) -> Result<()> { + self.client + .delete_by_query(DeleteByQueryParts::Index(&[NODES_INDEX_NAME])) + .body(json!({ + "query": { + "term": { "data_source_id": data_source_id } + } + })) + .send() + .await?; + Ok(()) + } + fn clone_box(&self) -> Box { Box::new(self.clone()) } From 5f50ec846c0ab79a78dd1545f69f033fd0058446 Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Thu, 19 Dec 2024 23:11:37 +0100 Subject: [PATCH 23/78] [connectors] ms: catch error when getting item (#9560) --- .../microsoft/temporal/activities.ts | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/connectors/src/connectors/microsoft/temporal/activities.ts b/connectors/src/connectors/microsoft/temporal/activities.ts index 83ddbc21f3c0..39264dfac3e6 100644 --- a/connectors/src/connectors/microsoft/temporal/activities.ts +++ b/connectors/src/connectors/microsoft/temporal/activities.ts @@ -1,5 +1,5 @@ import type { ModelId } from "@dust-tt/types"; -import { cacheWithRedis } from "@dust-tt/types"; +import { cacheWithRedis, removeNulls } from "@dust-tt/types"; import type { Client } from "@microsoft/microsoft-graph-client"; import { GraphError } from "@microsoft/microsoft-graph-client"; import type { DriveItem } from "@microsoft/microsoft-graph-types"; @@ -79,27 +79,42 @@ export async function getRootNodesToSyncFromResources( // get root folders and drives and drill down site-root and sites to their // child drives (converted to MicrosoftNode types) - const rootFolderAndDriveNodes = await Promise.all( - rootResources - .filter( - (resource) => - resource.nodeType === "folder" || resource.nodeType === "drive" - ) - .map(async (resource) => { - const item = await getItem( - client, - typeAndPathFromInternalId(resource.internalId).itemAPIPath - ); + const rootFolderAndDriveNodes = removeNulls( + await Promise.all( + rootResources + .filter( + (resource) => + resource.nodeType === "folder" || resource.nodeType === "drive" + ) + .map(async (resource) => { + try { + const item = await getItem( + client, + typeAndPathFromInternalId(resource.internalId).itemAPIPath + ); - const node = itemToMicrosoftNode( - resource.nodeType as "folder" | "drive", - item - ); - return { - ...node, - name: `${node.name} (${extractPath(item)})`, - }; - }) + const node = itemToMicrosoftNode( + resource.nodeType as "folder" | "drive", + item + ); + return { + ...node, + name: `${node.name} (${extractPath(item)})`, + }; + } catch (error) { + logger.error( + { + connectorId, + dataSourceId: dataSourceConfig.dataSourceId, + error, + id: resource.internalId, + }, + "Failed to get item" + ); + return null; + } + }) + ) ); const rootSitePaths: string[] = rootResources From 6e02bf91bce86b77520b66de8639e2cb3423171e Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Thu, 19 Dec 2024 23:18:21 +0100 Subject: [PATCH 24/78] [KW search] Upsert and backfill GitHub folders (#9556) * add folders upserts/deletes and activities that will be added to the workflows * add backfill script * add a few missing deletes * add an activity to upsert code root folder --- .../20241219_backfill_github_folders.ts | 148 +++++++++++++++++ .../connectors/github/temporal/activities.ts | 150 ++++++++++++++++++ 2 files changed, 298 insertions(+) create mode 100644 connectors/migrations/20241219_backfill_github_folders.ts diff --git a/connectors/migrations/20241219_backfill_github_folders.ts b/connectors/migrations/20241219_backfill_github_folders.ts new file mode 100644 index 000000000000..403502e7eba5 --- /dev/null +++ b/connectors/migrations/20241219_backfill_github_folders.ts @@ -0,0 +1,148 @@ +import { makeScript } from "scripts/helpers"; + +import { getGithubCodeDirectoryParentIds } from "@connectors/connectors/github/lib/hierarchy"; +import { + getCodeRootInternalId, + getDiscussionsInternalId, + getIssuesInternalId, + getRepositoryInternalId, +} from "@connectors/connectors/github/lib/utils"; +import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; +import { concurrentExecutor } from "@connectors/lib/async_utils"; +import { upsertDataSourceFolder } from "@connectors/lib/data_sources"; +import { + GithubCodeDirectory, + GithubCodeRepository, + GithubConnectorState, +} from "@connectors/lib/models/github"; +import type Logger from "@connectors/logger/logger"; +import { ConnectorResource } from "@connectors/resources/connector_resource"; + +const FOLDER_CONCURRENCY = 10; + +async function upsertFoldersForConnector( + connector: ConnectorResource, + execute: boolean, + logger: typeof Logger +) { + const dataSourceConfig = dataSourceConfigFromConnector(connector); + const connectorId = connector.id; + + const repositories = await GithubCodeRepository.findAll({ + where: { connectorId }, + }); + + for (const repository of repositories) { + const { repoId, repoName } = repository; + const repoInternalId = getRepositoryInternalId(repoId); + + // folder for the repository + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: repoInternalId, + parents: [repoInternalId], + title: repoName, + mimeType: "application/vnd.dust.github.repository", + }); + logger.info( + `Upserted repository folder ${repoInternalId} for ${repoName}` + ); + } else { + logger.info( + `Would upsert repository folder ${repoInternalId} for ${repoName}` + ); + } + + // folder with all the issues + const issuesInternalId = getIssuesInternalId(repoId); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: issuesInternalId, + parents: [issuesInternalId, repoInternalId], + title: "Issues", + mimeType: "application/vnd.dust.github.issues", + }); + logger.info(`Upserted issues folder ${issuesInternalId}`); + } else { + logger.info(`Would upsert issues folder ${issuesInternalId}`); + } + + // folder with all the discussions + const discussionsInternalId = getDiscussionsInternalId(repoId); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: discussionsInternalId, + parents: [discussionsInternalId, repoInternalId], + title: "Discussions", + mimeType: "application/vnd.dust.github.discussions", + }); + logger.info(`Upserted discussions folder ${discussionsInternalId}`); + } else { + logger.info(`Would upsert discussions folder ${discussionsInternalId}`); + } + + const connectorState = await GithubConnectorState.findOne({ + where: { connectorId }, + }); + if (connectorState?.codeSyncEnabled) { + // folder for the code root + const codeRootInternalId = getCodeRootInternalId(repoId); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: codeRootInternalId, + title: "Code", + parents: [codeRootInternalId, repoInternalId], + mimeType: "application/vnd.dust.github.code.root", + }); + logger.info(`Upserted code root folder ${codeRootInternalId}`); + } else { + logger.info(`Would upsert code root folder ${codeRootInternalId}`); + } + + const directories = await GithubCodeDirectory.findAll({ + where: { connectorId }, + }); + + // Upsert directories as folders + await concurrentExecutor( + directories, + async (directory) => { + const dirParents = await getGithubCodeDirectoryParentIds( + connectorId, + directory.internalId, + parseInt(repoId, 10) + ); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: directory.internalId, + parents: [directory.internalId, ...dirParents], + title: directory.dirName, + mimeType: "application/vnd.dust.github.code.directory", + }); + logger.info( + `Upserted directory folder ${directory.internalId} for ${directory.dirName}` + ); + } else { + logger.info( + `Would upsert directory folder ${directory.internalId} for ${directory.dirName}` + ); + } + }, + { concurrency: FOLDER_CONCURRENCY } + ); + } + } +} +makeScript({}, async ({ execute }, logger) => { + const connectors = await ConnectorResource.listByType("zendesk", {}); + + for (const connector of connectors) { + logger.info(`Upserting folders for connector ${connector.id}`); + await upsertFoldersForConnector(connector, execute, logger); + } +}); diff --git a/connectors/src/connectors/github/temporal/activities.ts b/connectors/src/connectors/github/temporal/activities.ts index de170ffee2a2..1e297105fe21 100644 --- a/connectors/src/connectors/github/temporal/activities.ts +++ b/connectors/src/connectors/github/temporal/activities.ts @@ -34,11 +34,14 @@ import { QUEUE_NAME } from "@connectors/connectors/github/temporal/config"; import { newWebhookSignal } from "@connectors/connectors/github/temporal/signals"; import { getCodeSyncWorkflowId } from "@connectors/connectors/github/temporal/utils"; import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; +import { concurrentExecutor } from "@connectors/lib/async_utils"; import { deleteDataSourceDocument, + deleteDataSourceFolder, renderDocumentTitleAndContent, renderMarkdownSection, upsertDataSourceDocument, + upsertDataSourceFolder, } from "@connectors/lib/data_sources"; import { ExternalOAuthTokenError } from "@connectors/lib/error"; import { @@ -665,6 +668,24 @@ export async function githubRepoGarbageCollectActivity( logger ); + // deleting the folders that are tied to a repository from data_source_folders (core) + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getDiscussionsInternalId(repoId), + }); + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getIssuesInternalId(repoId), + }); + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getCodeRootInternalId(repoId), + }); + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getRepositoryInternalId(repoId), + }); + // Finally delete the repository object if it exists. await GithubCodeRepository.destroy({ where: { @@ -835,6 +856,17 @@ async function garbageCollectCodeSync( "GarbageCollectCodeSync: deleting directories" ); + await concurrentExecutor( + directoriesToDelete, + async (d) => { + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: d.internalId, + }); + }, + { concurrency: 10 } + ); + await GithubCodeDirectory.destroy({ where: { connectorId: connector.id, @@ -900,6 +932,12 @@ export async function githubCodeSyncActivity({ logger.child({ task: "garbageCollectCodeSyncDisabled" }) ); + // deleting the code root folder from data_source_folders (core) + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getCodeRootInternalId(repoId), + }); + // Finally delete the repository object if it exists. await GithubCodeRepository.destroy({ where: { @@ -911,6 +949,15 @@ export async function githubCodeSyncActivity({ return; } + // upserting a folder for the code root in data_source_folders (core) + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: getCodeRootInternalId(repoId), + title: "Code", + parents: [getCodeRootInternalId(repoId), getRepositoryInternalId(repoId)], + mimeType: "application/vnd.dust.github.code.root", + }); + let githubCodeRepository = await GithubCodeRepository.findOne({ where: { connectorId: connector.id, @@ -981,6 +1028,12 @@ export async function githubCodeSyncActivity({ Context.current().heartbeat(); + // deleting the code root folder from data_source_folders (core) + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getCodeRootInternalId(repoId), + }); + // Finally delete the repository object if it exists. await GithubCodeRepository.destroy({ where: { @@ -1145,6 +1198,18 @@ export async function githubCodeSyncActivity({ Context.current().heartbeat(); const parentInternalId = d.parentInternalId || rootInternalId; + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: d.internalId, + parents: [ + ...d.parents, + getCodeRootInternalId(repoId), + getRepositoryInternalId(repoId), + ], + title: d.dirName, + mimeType: "application/vnd.dust.github.code.directory", + }); + // Find directory or create it. let githubCodeDirectory = await GithubCodeDirectory.findOne({ where: { @@ -1262,3 +1327,88 @@ export async function githubCodeSyncDailyCronActivity({ }, }); } + +export async function githubUpsertRepositoryFolderActivity({ + connectorId, + repoId, + repoName, +}: { + connectorId: ModelId; + repoId: number; + repoName: string; +}) { + const connector = await ConnectorResource.fetchById(connectorId); + if (!connector) { + throw new Error(`Connector not found. ConnectorId: ${connectorId}`); + } + await upsertDataSourceFolder({ + dataSourceConfig: dataSourceConfigFromConnector(connector), + folderId: getRepositoryInternalId(repoId), + title: repoName, + parents: [getRepositoryInternalId(repoId)], + mimeType: "application/vnd.dust.github.repository", + }); +} + +export async function githubUpsertIssuesFolderActivity({ + connectorId, + repoId, +}: { + connectorId: ModelId; + repoId: number; +}) { + const connector = await ConnectorResource.fetchById(connectorId); + if (!connector) { + throw new Error(`Connector not found. ConnectorId: ${connectorId}`); + } + await upsertDataSourceFolder({ + dataSourceConfig: dataSourceConfigFromConnector(connector), + folderId: getIssuesInternalId(repoId), + title: "Issues", + parents: [getIssuesInternalId(repoId), getRepositoryInternalId(repoId)], + mimeType: "application/vnd.dust.github.issues", + }); +} + +export async function githubUpsertDiscussionsFolderActivity({ + connectorId, + repoId, +}: { + connectorId: ModelId; + repoId: number; +}) { + const connector = await ConnectorResource.fetchById(connectorId); + if (!connector) { + throw new Error(`Connector not found. ConnectorId: ${connectorId}`); + } + await upsertDataSourceFolder({ + dataSourceConfig: dataSourceConfigFromConnector(connector), + folderId: getDiscussionsInternalId(repoId), + title: "Discussions", + parents: [ + getDiscussionsInternalId(repoId), + getRepositoryInternalId(repoId), + ], + mimeType: "application/vnd.dust.github.discussions", + }); +} + +export async function githubUpsertCodeRootFolderActivity({ + connectorId, + repoId, +}: { + connectorId: ModelId; + repoId: number; +}) { + const connector = await ConnectorResource.fetchById(connectorId); + if (!connector) { + throw new Error(`Connector not found. ConnectorId: ${connectorId}`); + } + await upsertDataSourceFolder({ + dataSourceConfig: dataSourceConfigFromConnector(connector), + folderId: getCodeRootInternalId(repoId), + title: "Code", + parents: [getCodeRootInternalId(repoId), getRepositoryInternalId(repoId)], + mimeType: "application/vnd.dust.github.code.root", + }); +} From ea6879d0ccebee655e0b8c645948639e6b3b05b9 Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Thu, 19 Dec 2024 23:22:35 +0100 Subject: [PATCH 25/78] [connectors] Fixed error logging (#9561) --- connectors/src/connectors/microsoft/temporal/activities.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/connectors/src/connectors/microsoft/temporal/activities.ts b/connectors/src/connectors/microsoft/temporal/activities.ts index 39264dfac3e6..9684629da143 100644 --- a/connectors/src/connectors/microsoft/temporal/activities.ts +++ b/connectors/src/connectors/microsoft/temporal/activities.ts @@ -105,7 +105,6 @@ export async function getRootNodesToSyncFromResources( logger.error( { connectorId, - dataSourceId: dataSourceConfig.dataSourceId, error, id: resource.internalId, }, From 3995c0314312b0e91d9b7af1604bfb807d90be99 Mon Sep 17 00:00:00 2001 From: Jules Belveze <32683010+JulesBelveze@users.noreply.github.com> Date: Fri, 20 Dec 2024 08:14:31 +0100 Subject: [PATCH 26/78] =?UTF-8?q?=E2=9C=82=EF=B8=8F=20(#9547)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- k8s/deploy-image.sh | 8 -- k8s/dust-kube/apply_infra_dust-kube.sh | 124 ------------------ .../apache-tika-backend-config.yaml | 6 - .../connectors-backend-config.yaml | 12 -- .../backend-configs/core-backend-config.yaml | 6 - .../backend-configs/front-backend-config.yaml | 15 --- .../metabase-backend-config.yaml | 10 -- .../backend-configs/oauth-backend-config.yaml | 6 - .../backend-configs/viz-backend-config.yaml | 15 --- .../alerting-temporal-configmap.yaml | 11 -- .../configmaps/apache-tika-configmap.yaml | 10 -- .../configmaps/connectors-configmap.yaml | 11 -- .../connectors-worker-configmap.yaml | 11 -- .../connectors-worker-specific-configmap.yaml | 11 -- k8s/dust-kube/configmaps/core-configmap.yaml | 10 -- .../core-sqlite-worker-configmap.yaml | 10 -- k8s/dust-kube/configmaps/front-configmap.yaml | 12 -- .../configmaps/front-edge-configmap.yaml | 11 -- .../configmaps/front-qa-configmap.yaml | 11 -- .../front-upsert-table-worker-configmap.yaml | 11 -- .../configmaps/front-worker-configmap.yaml | 11 -- k8s/dust-kube/configmaps/oauth-configmap.yaml | 9 -- .../configmaps/prodbox-configmap.yaml | 9 -- k8s/dust-kube/configmaps/viz-configmap.yaml | 11 -- k8s/dust-kube/datadog-values.yml | 53 -------- .../alerting-temporal-deployment.yaml | 49 ------- .../deployments/apache-tika-deployment.yaml | 31 ----- .../deployments/connectors-deployment.yaml | 73 ----------- .../connectors-worker-deployment.yaml | 71 ---------- ...ectors-worker-google-drive-deployment.yaml | 66 ---------- .../connectors-worker-notion-deployment.yaml | 62 --------- ...onnectors-worker-notion-gc-deployment.yaml | 62 --------- ...nnectors-worker-webcrawler-deployment.yaml | 62 --------- .../deployments/core-deployment.yaml | 69 ---------- .../core-sqlite-worker-deployment.yaml | 53 -------- .../deployments/front-deployment.yaml | 77 ----------- .../deployments/front-edge-deployment.yaml | 88 ------------- .../deployments/front-qa-deployment.yaml | 85 ------------ .../front-upsert-table-worker-deployment.yaml | 61 --------- .../deployments/front-worker-deployment.yaml | 74 ----------- .../deployments/metabase-deployment.yaml | 51 ------- .../deployments/oauth-deployment.yaml | 66 ---------- .../deployments/prodbox-deployment.yaml | 77 ----------- k8s/dust-kube/deployments/viz-deployment.yaml | 52 -------- .../dust-frontend-config.yaml | 9 -- k8s/dust-kube/hpas/apache-tika-hpa.yaml | 19 --- .../connectors-managed-cert.yaml | 7 - .../front-edge-managed-cert.yaml | 7 - .../managed-certs/front-managed-cert.yaml | 7 - .../managed-certs/front-qa-managed-cert.yaml | 7 - .../managed-certs/metabase-managed-cert.yaml | 7 - .../managed-certs/viz-managed-cert.yaml | 7 - .../network-policies/core-network-policy.yaml | 44 ------- .../core-sqlite-worker-network-policy.yaml | 21 --- .../oauth-network-policy.yaml | 54 -------- .../services/apache-tika-service.yaml | 15 --- .../services/connectors-service.yaml | 15 --- .../services/connectors-worker-service.yaml | 13 -- k8s/dust-kube/services/core-service.yaml | 15 --- .../core-sqlite-worker-headless-service.yaml | 16 --- .../services/front-edge-service.yaml | 15 --- k8s/dust-kube/services/front-qa-service.yaml | 15 --- k8s/dust-kube/services/front-service.yaml | 15 --- k8s/dust-kube/services/metabase-service.yaml | 15 --- k8s/dust-kube/services/oauth-service.yaml | 15 --- k8s/dust-kube/services/viz-service.yaml | 15 --- 66 files changed, 1996 deletions(-) delete mode 100755 k8s/deploy-image.sh delete mode 100755 k8s/dust-kube/apply_infra_dust-kube.sh delete mode 100644 k8s/dust-kube/backend-configs/apache-tika-backend-config.yaml delete mode 100644 k8s/dust-kube/backend-configs/connectors-backend-config.yaml delete mode 100644 k8s/dust-kube/backend-configs/core-backend-config.yaml delete mode 100644 k8s/dust-kube/backend-configs/front-backend-config.yaml delete mode 100644 k8s/dust-kube/backend-configs/metabase-backend-config.yaml delete mode 100644 k8s/dust-kube/backend-configs/oauth-backend-config.yaml delete mode 100644 k8s/dust-kube/backend-configs/viz-backend-config.yaml delete mode 100644 k8s/dust-kube/configmaps/alerting-temporal-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/apache-tika-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/connectors-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/connectors-worker-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/connectors-worker-specific-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/core-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/core-sqlite-worker-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/front-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/front-edge-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/front-qa-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/front-upsert-table-worker-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/front-worker-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/oauth-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/prodbox-configmap.yaml delete mode 100644 k8s/dust-kube/configmaps/viz-configmap.yaml delete mode 100644 k8s/dust-kube/datadog-values.yml delete mode 100644 k8s/dust-kube/deployments/alerting-temporal-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/apache-tika-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/connectors-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/connectors-worker-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/connectors-worker-google-drive-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/connectors-worker-notion-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/connectors-worker-notion-gc-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/connectors-worker-webcrawler-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/core-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/core-sqlite-worker-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/front-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/front-edge-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/front-qa-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/front-upsert-table-worker-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/front-worker-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/metabase-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/oauth-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/prodbox-deployment.yaml delete mode 100644 k8s/dust-kube/deployments/viz-deployment.yaml delete mode 100644 k8s/dust-kube/frontend-configs/dust-frontend-config.yaml delete mode 100644 k8s/dust-kube/hpas/apache-tika-hpa.yaml delete mode 100644 k8s/dust-kube/managed-certs/connectors-managed-cert.yaml delete mode 100644 k8s/dust-kube/managed-certs/front-edge-managed-cert.yaml delete mode 100644 k8s/dust-kube/managed-certs/front-managed-cert.yaml delete mode 100644 k8s/dust-kube/managed-certs/front-qa-managed-cert.yaml delete mode 100644 k8s/dust-kube/managed-certs/metabase-managed-cert.yaml delete mode 100644 k8s/dust-kube/managed-certs/viz-managed-cert.yaml delete mode 100644 k8s/dust-kube/network-policies/core-network-policy.yaml delete mode 100644 k8s/dust-kube/network-policies/core-sqlite-worker-network-policy.yaml delete mode 100644 k8s/dust-kube/network-policies/oauth-network-policy.yaml delete mode 100644 k8s/dust-kube/services/apache-tika-service.yaml delete mode 100644 k8s/dust-kube/services/connectors-service.yaml delete mode 100644 k8s/dust-kube/services/connectors-worker-service.yaml delete mode 100644 k8s/dust-kube/services/core-service.yaml delete mode 100644 k8s/dust-kube/services/core-sqlite-worker-headless-service.yaml delete mode 100644 k8s/dust-kube/services/front-edge-service.yaml delete mode 100644 k8s/dust-kube/services/front-qa-service.yaml delete mode 100644 k8s/dust-kube/services/front-service.yaml delete mode 100644 k8s/dust-kube/services/metabase-service.yaml delete mode 100644 k8s/dust-kube/services/oauth-service.yaml delete mode 100644 k8s/dust-kube/services/viz-service.yaml diff --git a/k8s/deploy-image.sh b/k8s/deploy-image.sh deleted file mode 100755 index 95f7a5cae5b2..000000000000 --- a/k8s/deploy-image.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# first arg : image -# second arg : deployment name -# third arg : container name (default=web) -set -e - -kubectl set image deployment/$2 ${3:-web}=$1 && kubectl rollout status deployment/$2 --watch=false | grep Waiting || kubectl rollout restart deployment/$2 -echo "Updated $2 image to: $1" \ No newline at end of file diff --git a/k8s/dust-kube/apply_infra_dust-kube.sh b/k8s/dust-kube/apply_infra_dust-kube.sh deleted file mode 100755 index d7502b596de9..000000000000 --- a/k8s/dust-kube/apply_infra_dust-kube.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/bash - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source "$SCRIPT_DIR/../utils.sh" - -# By convention, the name of the folder enclosing this script is the cluster name -CLUSTER_NAME=$(basename $(dirname "$0")) - -check_context $CLUSTER_NAME - -install_datadog_agent - -echo "-----------------------------------" -echo "Applying configmaps" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/configmaps/apache-tika-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/front-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/front-worker-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/front-upsert-table-worker-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/front-edge-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/front-qa-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/connectors-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/connectors-worker-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/connectors-worker-specific-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/alerting-temporal-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/core-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/core-sqlite-worker-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/oauth-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/prodbox-configmap.yaml" -kubectl apply -f "$(dirname "$0")/configmaps/viz-configmap.yaml" - -echo "-----------------------------------" -echo "Applying backend configs" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/backend-configs/apache-tika-backend-config.yaml" -kubectl apply -f "$(dirname "$0")/backend-configs/front-backend-config.yaml" -kubectl apply -f "$(dirname "$0")/backend-configs/connectors-backend-config.yaml" -kubectl apply -f "$(dirname "$0")/backend-configs/metabase-backend-config.yaml" -kubectl apply -f "$(dirname "$0")/backend-configs/core-backend-config.yaml" -kubectl apply -f "$(dirname "$0")/backend-configs/oauth-backend-config.yaml" -kubectl apply -f "$(dirname "$0")/backend-configs/viz-backend-config.yaml" - -echo "-----------------------------------" -echo "Applying managed certificates" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/managed-certs/front-managed-cert.yaml" -kubectl apply -f "$(dirname "$0")/managed-certs/front-edge-managed-cert.yaml" -kubectl apply -f "$(dirname "$0")/managed-certs/front-qa-managed-cert.yaml" -kubectl apply -f "$(dirname "$0")/managed-certs/connectors-managed-cert.yaml" -kubectl apply -f "$(dirname "$0")/managed-certs/metabase-managed-cert.yaml" -kubectl apply -f "$(dirname "$0")/managed-certs/viz-managed-cert.yaml" - - -echo "-----------------------------------" -echo "Applying frontend configs" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/frontend-configs/dust-frontend-config.yaml" - -echo "-----------------------------------" -echo "Applying deployments" -echo "-----------------------------------" - -apply_deployment apache-tika-deployment -apply_deployment front-deployment -apply_deployment front-worker-deployment -apply_deployment front-upsert-table-worker-deployment -apply_deployment front-edge-deployment -apply_deployment front-qa-deployment -apply_deployment connectors-deployment -apply_deployment connectors-worker-deployment -apply_deployment connectors-worker-notion-deployment -apply_deployment connectors-worker-notion-gc-deployment -apply_deployment connectors-worker-webcrawler-deployment -apply_deployment connectors-worker-google-drive-deployment -apply_deployment metabase-deployment -apply_deployment alerting-temporal-deployment -apply_deployment core-deployment -apply_deployment core-sqlite-worker-deployment -apply_deployment oauth-deployment -apply_deployment prodbox-deployment -apply_deployment viz-deployment - -echo "-----------------------------------" -echo "Applying HPAs" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/hpas/apache-tika-hpa.yaml" - -echo "-----------------------------------" -echo "Applying services" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/services/apache-tika-service.yaml" -kubectl apply -f "$(dirname "$0")/services/front-service.yaml" -kubectl apply -f "$(dirname "$0")/services/front-edge-service.yaml" -kubectl apply -f "$(dirname "$0")/services/front-qa-service.yaml" -kubectl apply -f "$(dirname "$0")/services/connectors-service.yaml" -kubectl apply -f "$(dirname "$0")/services/connectors-worker-service.yaml" -kubectl apply -f "$(dirname "$0")/services/metabase-service.yaml" -kubectl apply -f "$(dirname "$0")/services/core-service.yaml" -kubectl apply -f "$(dirname "$0")/services/core-sqlite-worker-headless-service.yaml" -kubectl apply -f "$(dirname "$0")/services/oauth-service.yaml" -kubectl apply -f "$(dirname "$0")/services/viz-service.yaml" - - -echo "-----------------------------------" -echo "Applying ingress" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/ingress.yaml" - -echo "-----------------------------------" -echo "Applying network policies" -echo "-----------------------------------" - -kubectl apply -f "$(dirname "$0")/network-policies/core-network-policy.yaml" -kubectl apply -f "$(dirname "$0")/network-policies/oauth-network-policy.yaml" -kubectl apply -f "$(dirname "$0")/network-policies/core-sqlite-worker-network-policy.yaml" diff --git a/k8s/dust-kube/backend-configs/apache-tika-backend-config.yaml b/k8s/dust-kube/backend-configs/apache-tika-backend-config.yaml deleted file mode 100644 index 91d5e8469bf3..000000000000 --- a/k8s/dust-kube/backend-configs/apache-tika-backend-config.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: apache-tika-backendconfig -spec: - timeoutSec: 120 diff --git a/k8s/dust-kube/backend-configs/connectors-backend-config.yaml b/k8s/dust-kube/backend-configs/connectors-backend-config.yaml deleted file mode 100644 index 5f91e648843f..000000000000 --- a/k8s/dust-kube/backend-configs/connectors-backend-config.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: connectors-backendconfig -spec: - timeoutSec: 300 - customResponseHeaders: - headers: - - "Strict-Transport-Security: max-age=86400" - - "X-Content-Type-Options: nosniff" - - "Referrer-Policy: strict-origin-when-cross-origin" - - "Permissions-Policy: geolocation=(), microphone=(), camera=()" diff --git a/k8s/dust-kube/backend-configs/core-backend-config.yaml b/k8s/dust-kube/backend-configs/core-backend-config.yaml deleted file mode 100644 index 39b636235883..000000000000 --- a/k8s/dust-kube/backend-configs/core-backend-config.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: core-backendconfig -spec: - timeoutSec: 300 diff --git a/k8s/dust-kube/backend-configs/front-backend-config.yaml b/k8s/dust-kube/backend-configs/front-backend-config.yaml deleted file mode 100644 index b9f482874cd8..000000000000 --- a/k8s/dust-kube/backend-configs/front-backend-config.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: front-backendconfig -spec: - sessionAffinity: - affinityType: "GENERATED_COOKIE" - affinityCookieTtlSec: 600 - timeoutSec: 300 - customResponseHeaders: - headers: - - "Strict-Transport-Security: max-age=86400" - - "X-Content-Type-Options: nosniff" - - "Referrer-Policy: strict-origin-when-cross-origin" - - "Permissions-Policy: geolocation=(self src), microphone=(self src), camera=(self src)" diff --git a/k8s/dust-kube/backend-configs/metabase-backend-config.yaml b/k8s/dust-kube/backend-configs/metabase-backend-config.yaml deleted file mode 100644 index 12d03f703d49..000000000000 --- a/k8s/dust-kube/backend-configs/metabase-backend-config.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: metabase-backendconfig -spec: - iap: - enabled: true - oauthclientCredentials: - secretName: iap-creds - timeoutSec: 120 diff --git a/k8s/dust-kube/backend-configs/oauth-backend-config.yaml b/k8s/dust-kube/backend-configs/oauth-backend-config.yaml deleted file mode 100644 index a8c0516ca635..000000000000 --- a/k8s/dust-kube/backend-configs/oauth-backend-config.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: oauth-backendconfig -spec: - timeoutSec: 30 diff --git a/k8s/dust-kube/backend-configs/viz-backend-config.yaml b/k8s/dust-kube/backend-configs/viz-backend-config.yaml deleted file mode 100644 index 74d284c0cb24..000000000000 --- a/k8s/dust-kube/backend-configs/viz-backend-config.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: viz-backendconfig -spec: - sessionAffinity: - affinityType: "GENERATED_COOKIE" - affinityCookieTtlSec: 600 - timeoutSec: 30 - customResponseHeaders: - headers: - - "Strict-Transport-Security: max-age=86400" - - "X-Content-Type-Options: nosniff" - - "Referrer-Policy: strict-origin-when-cross-origin" - - "Permissions-Policy: geolocation=(), microphone=(), camera=()" diff --git a/k8s/dust-kube/configmaps/alerting-temporal-configmap.yaml b/k8s/dust-kube/configmaps/alerting-temporal-configmap.yaml deleted file mode 100644 index 5be445ebfe4c..000000000000 --- a/k8s/dust-kube/configmaps/alerting-temporal-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: alerting-temporal-config -data: - DD_ENV: "prod" - DD_SERVICE: "alerting-temporal" - NODE_OPTIONS: "-r dd-trace/init" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/apache-tika-configmap.yaml b/k8s/dust-kube/configmaps/apache-tika-configmap.yaml deleted file mode 100644 index b0e14addea48..000000000000 --- a/k8s/dust-kube/configmaps/apache-tika-configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: apache-tika-config -data: - DD_ENV: "prod" - DD_SERVICE: "apache-tika" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - JAVA_OPTS: "-Xms2g -Xmx3g -XX:MaxMetaspaceSize=256m" diff --git a/k8s/dust-kube/configmaps/connectors-configmap.yaml b/k8s/dust-kube/configmaps/connectors-configmap.yaml deleted file mode 100644 index 10e2204311c5..000000000000 --- a/k8s/dust-kube/configmaps/connectors-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: connectors-config -data: - DD_ENV: "prod" - DD_SERVICE: "connectors" - NODE_OPTIONS: "-r dd-trace/init --max-old-space-size=6000" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/connectors-worker-configmap.yaml b/k8s/dust-kube/configmaps/connectors-worker-configmap.yaml deleted file mode 100644 index 09ecabd1f79b..000000000000 --- a/k8s/dust-kube/configmaps/connectors-worker-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: connectors-worker-config -data: - DD_ENV: "prod" - DD_SERVICE: "connectors-worker" - NODE_OPTIONS: "-r dd-trace/init --max-old-space-size=6144" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/connectors-worker-specific-configmap.yaml b/k8s/dust-kube/configmaps/connectors-worker-specific-configmap.yaml deleted file mode 100644 index cc8c3605cb7f..000000000000 --- a/k8s/dust-kube/configmaps/connectors-worker-specific-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: connectors-worker-specific-config -data: - DD_ENV: "prod" - DD_SERVICE: "connectors-worker" - NODE_OPTIONS: "-r dd-trace/init --max-old-space-size=3276" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/core-configmap.yaml b/k8s/dust-kube/configmaps/core-configmap.yaml deleted file mode 100644 index 5520d3b43399..000000000000 --- a/k8s/dust-kube/configmaps/core-configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: core-config -data: - DD_ENV: "prod" - DD_SERVICE: "core" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - CORE_SECONDARY_API: "http://core-secondary-service" diff --git a/k8s/dust-kube/configmaps/core-sqlite-worker-configmap.yaml b/k8s/dust-kube/configmaps/core-sqlite-worker-configmap.yaml deleted file mode 100644 index fdba46aa7f62..000000000000 --- a/k8s/dust-kube/configmaps/core-sqlite-worker-configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: core-sqlite-worker-config -data: - DD_ENV: "prod" - DD_SERVICE: "core-sqlite-worker" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - CORE_API: "http://core-service" diff --git a/k8s/dust-kube/configmaps/front-configmap.yaml b/k8s/dust-kube/configmaps/front-configmap.yaml deleted file mode 100644 index 4e65abe39a6b..000000000000 --- a/k8s/dust-kube/configmaps/front-configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: front-config -data: - DD_ENV: "prod" - DD_SERVICE: "front" - NODE_OPTIONS: "-r dd-trace/init" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" - ENABLE_BOT_CRAWLING: "true" diff --git a/k8s/dust-kube/configmaps/front-edge-configmap.yaml b/k8s/dust-kube/configmaps/front-edge-configmap.yaml deleted file mode 100644 index 4394cac744ca..000000000000 --- a/k8s/dust-kube/configmaps/front-edge-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: front-edge-config -data: - DD_ENV: "prod" - DD_SERVICE: "front-edge" - NODE_OPTIONS: "-r dd-trace/init" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/front-qa-configmap.yaml b/k8s/dust-kube/configmaps/front-qa-configmap.yaml deleted file mode 100644 index 2cbb26aadf11..000000000000 --- a/k8s/dust-kube/configmaps/front-qa-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: front-qa-config -data: - DD_ENV: "prod" - DD_SERVICE: "front-qa" - NODE_OPTIONS: "-r dd-trace/init" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/front-upsert-table-worker-configmap.yaml b/k8s/dust-kube/configmaps/front-upsert-table-worker-configmap.yaml deleted file mode 100644 index 257ff92e7d38..000000000000 --- a/k8s/dust-kube/configmaps/front-upsert-table-worker-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: front-upsert-table-config -data: - DD_ENV: "prod" - DD_SERVICE: "front-upsert-table-worker" - NODE_OPTIONS: "-r dd-trace/init --max-old-space-size=4200" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/front-worker-configmap.yaml b/k8s/dust-kube/configmaps/front-worker-configmap.yaml deleted file mode 100644 index cd1d3dfeb237..000000000000 --- a/k8s/dust-kube/configmaps/front-worker-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: front-worker-config -data: - DD_ENV: "prod" - DD_SERVICE: "front-worker" - NODE_OPTIONS: "-r dd-trace/init --max-old-space-size=4200" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/configmaps/oauth-configmap.yaml b/k8s/dust-kube/configmaps/oauth-configmap.yaml deleted file mode 100644 index f2b8479143f4..000000000000 --- a/k8s/dust-kube/configmaps/oauth-configmap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: oauth-config -data: - DD_ENV: "prod" - DD_SERVICE: "oauth" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" diff --git a/k8s/dust-kube/configmaps/prodbox-configmap.yaml b/k8s/dust-kube/configmaps/prodbox-configmap.yaml deleted file mode 100644 index 4360851e92e8..000000000000 --- a/k8s/dust-kube/configmaps/prodbox-configmap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: prodbox-config -data: - DD_ENV: "prodbox" - DD_SERVICE: "prodbox" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" diff --git a/k8s/dust-kube/configmaps/viz-configmap.yaml b/k8s/dust-kube/configmaps/viz-configmap.yaml deleted file mode 100644 index 309e83487f45..000000000000 --- a/k8s/dust-kube/configmaps/viz-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: viz-config -data: - DD_ENV: "prod" - DD_SERVICE: "viz" - NODE_OPTIONS: "-r dd-trace/init" - DD_LOGS_INJECTION: "true" - DD_RUNTIME_METRICS_ENABLED: "true" - NODE_ENV: "production" diff --git a/k8s/dust-kube/datadog-values.yml b/k8s/dust-kube/datadog-values.yml deleted file mode 100644 index a747d5f2290b..000000000000 --- a/k8s/dust-kube/datadog-values.yml +++ /dev/null @@ -1,53 +0,0 @@ -datadog: - logs: - enabled: true - containerCollectAll: false - containerExcludeLogs: - - "name:datadog-agent" - site: datadoghq.eu - clusterName: dust-kube - - apm: - socketEnabled: false - portEnabled: true - - dogstatsd: - useDogStatsDSocketVolume: false - port: 8125 - useHostPort: true - nonLocalTraffic: true - - ignoreAutoConfig: - - cilium - - nginx - - redis - - kubeStateMetricsCore: - enabled: true - - kubeStateMetricsEnabled: false - -clusterAgent: - enabled: true - resources: - requests: - cpu: 200m - memory: 512Mi - replicas: 2 - createPodDisruptionBudget: true - -agents: - priorityClassCreate: true - containers: - agent: - resources: - requests: - cpu: 200m - memory: 512Mi - limits: - cpu: 200m - memory: 512Mi - -providers: - gke: - autopilot: true diff --git a/k8s/dust-kube/deployments/alerting-temporal-deployment.yaml b/k8s/dust-kube/deployments/alerting-temporal-deployment.yaml deleted file mode 100644 index 26837e8f452d..000000000000 --- a/k8s/dust-kube/deployments/alerting-temporal-deployment.yaml +++ /dev/null @@ -1,49 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: alerting-temporal-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: alerting-temporal - template: - metadata: - labels: - app: alerting-temporal - name: alerting-temporal-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "alerting-temporal","service": "alerting-temporal","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/alerting-temporal-image:latest - command: ["npm", "run", "start"] - imagePullPolicy: Always - envFrom: - - configMapRef: - name: alerting-temporal-config - - secretRef: - name: alerting-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - resources: - requests: - cpu: 500m - memory: 1Gi - limits: - cpu: 500m - memory: 1Gi - volumes: - - name: cert-volume - secret: - secretName: temporal-datadog-cert diff --git a/k8s/dust-kube/deployments/apache-tika-deployment.yaml b/k8s/dust-kube/deployments/apache-tika-deployment.yaml deleted file mode 100644 index 4b3a943bd3fd..000000000000 --- a/k8s/dust-kube/deployments/apache-tika-deployment.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: apache-tika-deployment - namespace: apache-tika - annotations: - admission.datadoghq.com/enabled: "true" -spec: - replicas: 1 - selector: - matchLabels: - app: apache-tika - template: - metadata: - labels: - app: apache-tika - annotations: - ad.datadoghq.com/apache-tika.logs: '[{"source": "apache-tika","service": "apache-tika","tags": ["env:prod"]}]' - spec: - containers: - - name: apache-tika - image: apache/tika:2.9.2.1 - ports: - - containerPort: 9998 - resources: - requests: - cpu: 2000m - memory: 4Gi - limits: - cpu: 2000m - memory: 4Gi diff --git a/k8s/dust-kube/deployments/connectors-deployment.yaml b/k8s/dust-kube/deployments/connectors-deployment.yaml deleted file mode 100644 index d7f6b98f42eb..000000000000 --- a/k8s/dust-kube/deployments/connectors-deployment.yaml +++ /dev/null @@ -1,73 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: connectors-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: connectors - template: - metadata: - labels: - app: connectors - name: connectors-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "connectors","service": "connectors","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 60 - containers: - - name: web - image: gcr.io/or1g1n-186209/connectors-image:latest - command: ["node"] - args: - [ - "/app/node_modules/.bin/tsx", - "./src/start_server.ts", - "-p", - "3002", - ] - imagePullPolicy: Always - ports: - - containerPort: 3002 - readinessProbe: - httpGet: - path: / - port: 3002 - initialDelaySeconds: 5 - periodSeconds: 5 - - envFrom: - - configMapRef: - name: connectors-config - - secretRef: - name: connectors-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: private-key-volume - mountPath: /etc/private-keys - - resources: - requests: - cpu: 1000m - memory: 2.5Gi - limits: - cpu: 1000m - memory: 2.5Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-cert - - - name: private-key-volume - secret: - secretName: github-app-private-key diff --git a/k8s/dust-kube/deployments/connectors-worker-deployment.yaml b/k8s/dust-kube/deployments/connectors-worker-deployment.yaml deleted file mode 100644 index e0d8624aae0e..000000000000 --- a/k8s/dust-kube/deployments/connectors-worker-deployment.yaml +++ /dev/null @@ -1,71 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: connectors-worker-deployment -spec: - replicas: 4 - selector: - matchLabels: - app: connectors-worker - template: - metadata: - labels: - app: connectors-worker - name: connectors-worker-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "connectors-worker","service": "connectors-worker","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/connectors-image:latest - command: ["npm", "run", "start:worker"] - args: - [ - "--", - "--workers", - "confluence", - "github", - "intercom", - "slack", - "microsoft", - "snowflake", - ] - imagePullPolicy: Always - envFrom: - - configMapRef: - name: connectors-worker-config - - secretRef: - name: connectors-secrets - - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: private-key-volume - mountPath: /etc/private-keys - - resources: - requests: - cpu: 3000m - memory: 8Gi - ephemeral-storage: 10Gi - - limits: - cpu: 3000m - memory: 8Gi - ephemeral-storage: 10Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-cert - - - name: private-key-volume - secret: - secretName: github-app-private-key diff --git a/k8s/dust-kube/deployments/connectors-worker-google-drive-deployment.yaml b/k8s/dust-kube/deployments/connectors-worker-google-drive-deployment.yaml deleted file mode 100644 index fc64d63afd01..000000000000 --- a/k8s/dust-kube/deployments/connectors-worker-google-drive-deployment.yaml +++ /dev/null @@ -1,66 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: connectors-worker-google-drive-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: connectors-worker - worker: google_drive - template: - metadata: - labels: - app: connectors-worker - name: connectors-worker-pod - worker: google_drive - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "connectors-worker","service": "connectors-worker","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/connectors-image:latest - command: ["npm", "run", "start:worker"] - args: ["--", "--workers", "google_drive"] - imagePullPolicy: Always - envFrom: - - configMapRef: - name: connectors-worker-specific-config - - secretRef: - name: connectors-secrets - env: - - name: DD_PROFILING_ENABLED - value: "true" - - name: DD_PROFILING_EXPERIMENTAL_CPU_ENABLED - value: "true" - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: private-key-volume - mountPath: /etc/private-keys - - resources: - requests: - cpu: 2000m - memory: 4Gi - ephemeral-storage: 4Gi - - limits: - cpu: 2000m - memory: 4Gi - ephemeral-storage: 4Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-cert - - - name: private-key-volume - secret: - secretName: github-app-private-key diff --git a/k8s/dust-kube/deployments/connectors-worker-notion-deployment.yaml b/k8s/dust-kube/deployments/connectors-worker-notion-deployment.yaml deleted file mode 100644 index fbed569b96e5..000000000000 --- a/k8s/dust-kube/deployments/connectors-worker-notion-deployment.yaml +++ /dev/null @@ -1,62 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: connectors-worker-notion-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: connectors-worker - worker: notion - template: - metadata: - labels: - app: connectors-worker - name: connectors-worker-pod - worker: notion - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "connectors-worker","service": "connectors-worker","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/connectors-image:latest - command: ["npm", "run", "start:worker"] - args: ["--", "--workers", "notion"] - imagePullPolicy: Always - envFrom: - - configMapRef: - name: connectors-worker-specific-config - - secretRef: - name: connectors-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: private-key-volume - mountPath: /etc/private-keys - - resources: - requests: - cpu: 2000m - memory: 4Gi - ephemeral-storage: 4Gi - - limits: - cpu: 2000m - memory: 4Gi - ephemeral-storage: 4Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-cert - - - name: private-key-volume - secret: - secretName: github-app-private-key diff --git a/k8s/dust-kube/deployments/connectors-worker-notion-gc-deployment.yaml b/k8s/dust-kube/deployments/connectors-worker-notion-gc-deployment.yaml deleted file mode 100644 index b056c28e6189..000000000000 --- a/k8s/dust-kube/deployments/connectors-worker-notion-gc-deployment.yaml +++ /dev/null @@ -1,62 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: connectors-worker-notion-gc-deployment -spec: - replicas: 3 - selector: - matchLabels: - app: connectors-worker - worker: notion-gc - template: - metadata: - labels: - app: connectors-worker - name: connectors-worker-pod - worker: notion-gc - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "connectors-worker","service": "connectors-worker","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/connectors-image:latest - command: ["npm", "run", "start:worker"] - args: ["--", "--workers", "notion_garbage_collector"] - imagePullPolicy: Always - envFrom: - - configMapRef: - name: connectors-worker-specific-config - - secretRef: - name: connectors-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: private-key-volume - mountPath: /etc/private-keys - - resources: - requests: - cpu: 2000m - memory: 4Gi - ephemeral-storage: 4Gi - - limits: - cpu: 2000m - memory: 4Gi - ephemeral-storage: 4Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-cert - - - name: private-key-volume - secret: - secretName: github-app-private-key diff --git a/k8s/dust-kube/deployments/connectors-worker-webcrawler-deployment.yaml b/k8s/dust-kube/deployments/connectors-worker-webcrawler-deployment.yaml deleted file mode 100644 index 38bf4895214d..000000000000 --- a/k8s/dust-kube/deployments/connectors-worker-webcrawler-deployment.yaml +++ /dev/null @@ -1,62 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: connectors-worker-webcrawler-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: connectors-worker - worker: webcrawler - template: - metadata: - labels: - app: connectors-worker - name: connectors-worker-pod - worker: webcrawler - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "connectors-worker","service": "connectors-worker","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/connectors-image:latest - command: ["npm", "run", "start:worker"] - args: ["--", "--workers", "webcrawler"] - imagePullPolicy: Always - envFrom: - - configMapRef: - name: connectors-worker-specific-config - - secretRef: - name: connectors-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: private-key-volume - mountPath: /etc/private-keys - - resources: - requests: - cpu: 3000m - memory: 16Gi - ephemeral-storage: 4Gi - - limits: - cpu: 3000m - memory: 16Gi - ephemeral-storage: 4Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-cert - - - name: private-key-volume - secret: - secretName: github-app-private-key diff --git a/k8s/dust-kube/deployments/core-deployment.yaml b/k8s/dust-kube/deployments/core-deployment.yaml deleted file mode 100644 index 839eaa5ef7ca..000000000000 --- a/k8s/dust-kube/deployments/core-deployment.yaml +++ /dev/null @@ -1,69 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: core-deployment -spec: - replicas: 3 - selector: - matchLabels: - app: core - template: - metadata: - labels: - app: core - name: core-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "core","service": "core","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 180 - containers: - - name: web - image: gcr.io/or1g1n-186209/core-image:latest - command: ["cargo", "run", "--release", "--bin", "core-api"] - imagePullPolicy: Always - ports: - - containerPort: 3001 - readinessProbe: - httpGet: - path: / - port: 3001 - initialDelaySeconds: 10 - periodSeconds: 5 - - envFrom: - - configMapRef: - name: core-config - - secretRef: - name: core-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - - name: IS_SECONDARY - value: "false" - - volumeMounts: - - name: service-account-volume - mountPath: /etc/service-accounts - - name: api-keys-volume - mountPath: /etc/api-keys - - resources: - requests: - cpu: 4000m - memory: 8Gi - limits: - cpu: 4000m - memory: 8Gi - - volumes: - - name: service-account-volume - secret: - secretName: gcp-service-account-secret - - - name: api-keys-volume - secret: - secretName: core-api-keys-secret diff --git a/k8s/dust-kube/deployments/core-sqlite-worker-deployment.yaml b/k8s/dust-kube/deployments/core-sqlite-worker-deployment.yaml deleted file mode 100644 index 2a6139c0146c..000000000000 --- a/k8s/dust-kube/deployments/core-sqlite-worker-deployment.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: core-sqlite-worker-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: core-sqlite-worker - template: - metadata: - labels: - app: core-sqlite-worker - name: core-sqlite-worker-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "core-sqlite-worker","service": "core-sqlite-worker","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 180 - containers: - - name: web - image: gcr.io/or1g1n-186209/core-image:latest - command: ["cargo", "run", "--release", "--bin", "sqlite-worker"] - imagePullPolicy: Always - ports: - - containerPort: 3005 - - envFrom: - - configMapRef: - name: core-sqlite-worker-config - - secretRef: - name: core-sqlite-worker-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - - name: POD_PORT - value: "3005" - - resources: - requests: - cpu: 1000m - memory: 16Gi - limits: - cpu: 1000m - memory: 16Gi diff --git a/k8s/dust-kube/deployments/front-deployment.yaml b/k8s/dust-kube/deployments/front-deployment.yaml deleted file mode 100644 index b90b1712d094..000000000000 --- a/k8s/dust-kube/deployments/front-deployment.yaml +++ /dev/null @@ -1,77 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: front-deployment -spec: - replicas: 10 - selector: - matchLabels: - app: front - template: - metadata: - labels: - app: front - name: front-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "front","service": "front","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 60 - containers: - - name: web - image: gcr.io/or1g1n-186209/front-image:latest - imagePullPolicy: Always - ports: - - containerPort: 3000 - readinessProbe: - httpGet: - path: /api/healthz - port: 3000 - initialDelaySeconds: 5 - periodSeconds: 5 - - envFrom: - - configMapRef: - name: front-config - - secretRef: - name: front-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - - name: PRESTOP_SECRET - valueFrom: - secretKeyRef: - name: prestop-secret - key: PRESTOP_SECRET - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: service-account-volume - mountPath: /etc/service-accounts - - lifecycle: - preStop: - exec: - command: ["/bin/sh", "-c", "admin/prestop.sh"] - - resources: - requests: - # 1000m for nodejs (mono-threaded) + 500m to absorb spikes from contaner - cpu: 1500m - memory: 2.5Gi - - limits: - cpu: 1500m - memory: 2.5Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-front-cert - - name: service-account-volume - secret: - secretName: gcp-service-account-secret diff --git a/k8s/dust-kube/deployments/front-edge-deployment.yaml b/k8s/dust-kube/deployments/front-edge-deployment.yaml deleted file mode 100644 index 0aadce0278ef..000000000000 --- a/k8s/dust-kube/deployments/front-edge-deployment.yaml +++ /dev/null @@ -1,88 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: front-edge-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: front-edge - template: - metadata: - labels: - app: front-edge - name: front-edge-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "front","service": "front-edge","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 60 - containers: - - name: web - image: gcr.io/or1g1n-186209/front-edge-image:latest - imagePullPolicy: Always - ports: - - containerPort: 3000 - readinessProbe: - httpGet: - path: /api/healthz - port: 3000 - initialDelaySeconds: 5 - periodSeconds: 5 - - envFrom: - - configMapRef: - name: front-edge-config - - secretRef: - name: front-secrets - - secretRef: - name: front-edge-secrets - - env: - # we override --max-old-space-size for edge as pods - # don't have the same memory limits as the regular front pods - - name: NODE_OPTIONS - value: "-r dd-trace/init" - - name: AUTH0_BASE_URL - value: https://front-edge.dust.tt - # Make public prod API point to front-edge instead of front - - name: DUST_PROD_API - value: https://front-edge.dust.tt - - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - - name: PRESTOP_SECRET - valueFrom: - secretKeyRef: - name: prestop-secret - key: PRESTOP_SECRET - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: service-account-volume - mountPath: /etc/service-accounts - - lifecycle: - preStop: - exec: - command: ["/bin/sh", "-c", "admin/prestop.sh"] - - resources: - requests: - cpu: 1000m - memory: 1.5Gi - - imagePullSecrets: - - name: gcr-json-key - - volumes: - - name: cert-volume - secret: - secretName: temporal-front-cert - - name: service-account-volume - secret: - secretName: gcp-service-account-secret diff --git a/k8s/dust-kube/deployments/front-qa-deployment.yaml b/k8s/dust-kube/deployments/front-qa-deployment.yaml deleted file mode 100644 index bd11bb164865..000000000000 --- a/k8s/dust-kube/deployments/front-qa-deployment.yaml +++ /dev/null @@ -1,85 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: front-qa-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: front-qa - template: - metadata: - labels: - app: front-qa - name: front-qa-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "front","service": "front-qa","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 60 - containers: - - name: web - image: gcr.io/or1g1n-186209/front-qa-image:latest - imagePullPolicy: Always - ports: - - containerPort: 3000 - readinessProbe: - httpGet: - path: /api/healthz - port: 3000 - initialDelaySeconds: 5 - periodSeconds: 5 - - envFrom: - - configMapRef: - name: front-qa-config - - secretRef: - name: front-secrets - - secretRef: - name: front-edge-secrets - - env: - # we override --max-old-space-size for edge as pods - # don't have the same memory limits as the regular front pods - - name: NODE_OPTIONS - value: "-r dd-trace/init" - - name: AUTH0_BASE_URL - value: https://front-qa.dust.tt - - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - - name: PRESTOP_SECRET - valueFrom: - secretKeyRef: - name: prestop-secret - key: PRESTOP_SECRET - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: service-account-volume - mountPath: /etc/service-accounts - - lifecycle: - preStop: - exec: - command: ["/bin/sh", "-c", "admin/prestop.sh"] - - resources: - requests: - cpu: 1000m - memory: 1.5Gi - - imagePullSecrets: - - name: gcr-json-key - - volumes: - - name: cert-volume - secret: - secretName: temporal-front-cert - - name: service-account-volume - secret: - secretName: gcp-service-account-secret diff --git a/k8s/dust-kube/deployments/front-upsert-table-worker-deployment.yaml b/k8s/dust-kube/deployments/front-upsert-table-worker-deployment.yaml deleted file mode 100644 index 7abdcae7bd9f..000000000000 --- a/k8s/dust-kube/deployments/front-upsert-table-worker-deployment.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: front-upsert-table-worker-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: front-upsert-table-worker - template: - metadata: - labels: - app: front-upsert-table-worker - name: front-upsert-table-worker-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "front-upsert-table-worker","service": "front-upsert-table-worker","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/front-image:latest - command: ["npm", "run", "start:worker"] - args: ["--", "--workers", "upsert_table_queue"] - imagePullPolicy: Always - - envFrom: - - configMapRef: - name: front-worker-config - - secretRef: - name: front-secrets - - secretRef: - name: front-worker-secrets - - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: service-account-volume - mountPath: /etc/service-accounts - - resources: - requests: - cpu: 2000m - memory: 10Gi - - limits: - cpu: 2000m - memory: 10Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-front-cert - - name: service-account-volume - secret: - secretName: gcp-service-account-secret diff --git a/k8s/dust-kube/deployments/front-worker-deployment.yaml b/k8s/dust-kube/deployments/front-worker-deployment.yaml deleted file mode 100644 index 6fd8363e9425..000000000000 --- a/k8s/dust-kube/deployments/front-worker-deployment.yaml +++ /dev/null @@ -1,74 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: front-worker-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: front-worker - template: - metadata: - labels: - app: front-worker - name: front-worker-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "front-worker","service": "front-worker","tags": ["env:prod"]}]' - spec: - containers: - - name: web - image: gcr.io/or1g1n-186209/front-image:latest - command: ["npm", "run", "start:worker"] - args: - [ - "--", - "--workers", - "hard_delete", - "labs", - "mentions_count", - "poke", - "post_upsert_hooks", - "production_checks", - "scrub_workspace_queue", - "update_workspace_usage", - "upsert_queue", - ] - imagePullPolicy: Always - - envFrom: - - configMapRef: - name: front-worker-config - - secretRef: - name: front-secrets - - secretRef: - name: front-worker-secrets - - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: service-account-volume - mountPath: /etc/service-accounts - - resources: - requests: - cpu: 2000m - memory: 10Gi - - limits: - cpu: 2000m - memory: 10Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-front-cert - - name: service-account-volume - secret: - secretName: gcp-service-account-secret diff --git a/k8s/dust-kube/deployments/metabase-deployment.yaml b/k8s/dust-kube/deployments/metabase-deployment.yaml deleted file mode 100644 index 48c76fd269c9..000000000000 --- a/k8s/dust-kube/deployments/metabase-deployment.yaml +++ /dev/null @@ -1,51 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: metabase-deployment - -spec: - replicas: 2 - selector: - matchLabels: - app: metabase - template: - metadata: - labels: - app: metabase - name: metabase-pod - - spec: - containers: - - name: metabase - image: metabase/metabase - ports: - - containerPort: 3000 - readinessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 10 - periodSeconds: 5 - - envFrom: - - secretRef: - name: metabase-secret - - env: - - name: MB_REDIRECT_ALL_REQUESTS_TO_HTTPS - value: "false" - - - name: MB_SITE_URL - value: https://metabase.dust.tt - - - name: MB_JDBC_DATA_WAREHOUSE_MAX_CONNECTION_POOL_SIZE - value: "30" - - resources: - requests: - cpu: 1000m - memory: 2Gi - - limits: - cpu: 1000m - memory: 2Gi diff --git a/k8s/dust-kube/deployments/oauth-deployment.yaml b/k8s/dust-kube/deployments/oauth-deployment.yaml deleted file mode 100644 index 4789c9656bd7..000000000000 --- a/k8s/dust-kube/deployments/oauth-deployment.yaml +++ /dev/null @@ -1,66 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: oauth-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: oauth - template: - metadata: - labels: - app: oauth - name: oauth-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "oauth","service": "oauth","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 180 - containers: - - name: web - image: gcr.io/or1g1n-186209/oauth-image:latest - command: ["cargo", "run", "--release", "--bin", "oauth"] - imagePullPolicy: Always - ports: - - containerPort: 3006 - readinessProbe: - httpGet: - path: / - port: 3006 - initialDelaySeconds: 10 - periodSeconds: 5 - - envFrom: - - configMapRef: - name: oauth-config - - secretRef: - name: oauth-secrets - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: api-keys-volume - mountPath: /etc/api-keys - - name: private-key-volume - mountPath: /etc/private-keys - - resources: - requests: - cpu: 1000m - memory: 1Gi - limits: - cpu: 1000m - memory: 1Gi - - volumes: - - name: api-keys-volume - secret: - secretName: oauth-api-keys-secret - - - name: private-key-volume - secret: - secretName: github-app-private-key diff --git a/k8s/dust-kube/deployments/prodbox-deployment.yaml b/k8s/dust-kube/deployments/prodbox-deployment.yaml deleted file mode 100644 index b3110516b02d..000000000000 --- a/k8s/dust-kube/deployments/prodbox-deployment.yaml +++ /dev/null @@ -1,77 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: prodbox-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: prodbox - template: - metadata: - labels: - app: prodbox - name: prodbox-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "prodbox","service": "prodbox","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 180 - containers: - - name: web - image: gcr.io/or1g1n-186209/prodbox-image:latest - command: ["/bin/sh", "-c", "/dust/prodbox/init.sh"] - imagePullPolicy: Always - - envFrom: - - configMapRef: - name: prodbox-config - - secretRef: - name: core-secrets - - secretRef: - name: connectors-secrets - - secretRef: - name: front-secrets - - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - volumeMounts: - - name: cert-volume - mountPath: /etc/certs - - name: private-key-volume - mountPath: /etc/private-keys - - name: service-account-volume - mountPath: /etc/service-accounts - - name: github-deploykey-deploybox - mountPath: /etc/github-deploykey-deploybox - - resources: - requests: - cpu: 4000m - memory: 8Gi - ephemeral-storage: 10Gi - limits: - cpu: 4000m - memory: 8Gi - ephemeral-storage: 10Gi - - volumes: - - name: cert-volume - secret: - secretName: temporal-cert - - - name: private-key-volume - secret: - secretName: github-app-private-key - - - name: service-account-volume - secret: - secretName: gcp-service-account-secret - - - name: github-deploykey-deploybox - secret: - secretName: github-deploykey-deploybox diff --git a/k8s/dust-kube/deployments/viz-deployment.yaml b/k8s/dust-kube/deployments/viz-deployment.yaml deleted file mode 100644 index f5c72f2b3e76..000000000000 --- a/k8s/dust-kube/deployments/viz-deployment.yaml +++ /dev/null @@ -1,52 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: viz-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: viz - template: - metadata: - labels: - app: viz - name: viz-pod - admission.datadoghq.com/enabled: "true" - annotations: - ad.datadoghq.com/web.logs: '[{"source": "viz","service": "viz","tags": ["env:prod"]}]' - spec: - terminationGracePeriodSeconds: 60 - containers: - - name: web - image: gcr.io/or1g1n-186209/viz-image:latest - imagePullPolicy: Always - ports: - - containerPort: 3000 - readinessProbe: - httpGet: - path: /api/healthz - port: 3000 - initialDelaySeconds: 5 - periodSeconds: 5 - - envFrom: - - configMapRef: - name: viz-config - - secretRef: - name: viz-secrets - - env: - - name: DD_AGENT_HOST - valueFrom: - fieldRef: - fieldPath: status.hostIP - - resources: - requests: - cpu: 250m - memory: 200Mi - - limits: - cpu: 250m - memory: 200Mi diff --git a/k8s/dust-kube/frontend-configs/dust-frontend-config.yaml b/k8s/dust-kube/frontend-configs/dust-frontend-config.yaml deleted file mode 100644 index eacf47595ecb..000000000000 --- a/k8s/dust-kube/frontend-configs/dust-frontend-config.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: networking.gke.io/v1beta1 -kind: FrontendConfig -metadata: - name: dust-frontendconfig -spec: - redirectToHttps: - enabled: true - responseCodeName: MOVED_PERMANENTLY_DEFAULT - sslPolicy: dust-front-ssl-policy diff --git a/k8s/dust-kube/hpas/apache-tika-hpa.yaml b/k8s/dust-kube/hpas/apache-tika-hpa.yaml deleted file mode 100644 index 38bd12611cc5..000000000000 --- a/k8s/dust-kube/hpas/apache-tika-hpa.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: apache-tika-hpa - namespace: apache-tika -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: apache-tika-deployment - minReplicas: 1 - maxReplicas: 10 - metrics: - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: 70 diff --git a/k8s/dust-kube/managed-certs/connectors-managed-cert.yaml b/k8s/dust-kube/managed-certs/connectors-managed-cert.yaml deleted file mode 100644 index 290c8e24c1ee..000000000000 --- a/k8s/dust-kube/managed-certs/connectors-managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: connectors-managed-cert -spec: - domains: - - connectors.dust.tt diff --git a/k8s/dust-kube/managed-certs/front-edge-managed-cert.yaml b/k8s/dust-kube/managed-certs/front-edge-managed-cert.yaml deleted file mode 100644 index 886b2eb6e60b..000000000000 --- a/k8s/dust-kube/managed-certs/front-edge-managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: front-edge-managed-cert -spec: - domains: - - front-edge.dust.tt diff --git a/k8s/dust-kube/managed-certs/front-managed-cert.yaml b/k8s/dust-kube/managed-certs/front-managed-cert.yaml deleted file mode 100644 index 154a6500b015..000000000000 --- a/k8s/dust-kube/managed-certs/front-managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: front-managed-cert -spec: - domains: - - dust.tt diff --git a/k8s/dust-kube/managed-certs/front-qa-managed-cert.yaml b/k8s/dust-kube/managed-certs/front-qa-managed-cert.yaml deleted file mode 100644 index 6caa90653161..000000000000 --- a/k8s/dust-kube/managed-certs/front-qa-managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: front-qa-managed-cert -spec: - domains: - - front-qa.dust.tt diff --git a/k8s/dust-kube/managed-certs/metabase-managed-cert.yaml b/k8s/dust-kube/managed-certs/metabase-managed-cert.yaml deleted file mode 100644 index 026a7c95aa75..000000000000 --- a/k8s/dust-kube/managed-certs/metabase-managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: metabase-managed-cert -spec: - domains: - - metabase.dust.tt diff --git a/k8s/dust-kube/managed-certs/viz-managed-cert.yaml b/k8s/dust-kube/managed-certs/viz-managed-cert.yaml deleted file mode 100644 index 48dbfbde050e..000000000000 --- a/k8s/dust-kube/managed-certs/viz-managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: viz-managed-cert -spec: - domains: - - viz.dust.tt diff --git a/k8s/dust-kube/network-policies/core-network-policy.yaml b/k8s/dust-kube/network-policies/core-network-policy.yaml deleted file mode 100644 index 8c61b566815f..000000000000 --- a/k8s/dust-kube/network-policies/core-network-policy.yaml +++ /dev/null @@ -1,44 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: core-network-policy -spec: - podSelector: - matchLabels: - app: core - policyTypes: - - Ingress - ingress: - - from: - - podSelector: - matchLabels: - app: front - - podSelector: - matchLabels: - app: front-worker - - podSelector: - matchLabels: - app: front-upsert-table-worker - - podSelector: - matchLabels: - app: front-edge - - podSelector: - matchLabels: - app: front-qa - - podSelector: - matchLabels: - app: core-sqlite-worker - - podSelector: - matchLabels: - app: prodbox - - podSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - front - - front-worker - - front-upsert-table-worker - ports: - - protocol: TCP - port: 3001 \ No newline at end of file diff --git a/k8s/dust-kube/network-policies/core-sqlite-worker-network-policy.yaml b/k8s/dust-kube/network-policies/core-sqlite-worker-network-policy.yaml deleted file mode 100644 index cd722415285a..000000000000 --- a/k8s/dust-kube/network-policies/core-sqlite-worker-network-policy.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: core-sqlite-worker-network-policy -spec: - podSelector: - matchLabels: - app: core-sqlite-worker - policyTypes: - - Ingress - ingress: - - from: - - podSelector: - matchLabels: - app: core - - podSelector: - matchLabels: - app: core-secondary - ports: - - protocol: TCP - port: 3005 diff --git a/k8s/dust-kube/network-policies/oauth-network-policy.yaml b/k8s/dust-kube/network-policies/oauth-network-policy.yaml deleted file mode 100644 index 11685c24aba7..000000000000 --- a/k8s/dust-kube/network-policies/oauth-network-policy.yaml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: oauth-network-policy -spec: - podSelector: - matchLabels: - app: oauth - policyTypes: - - Ingress - ingress: - - from: - - podSelector: - matchLabels: - app: front - - podSelector: - matchLabels: - app: front-edge - - podSelector: - matchLabels: - app: front-qa - - podSelector: - matchLabels: - app: connectors - - podSelector: - matchLabels: - app: connectors-worker - - podSelector: - matchLabels: - app: front-worker - - podSelector: - matchLabels: - app: prodbox - - podSelector: - matchLabels: - app: core - - podSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - connectors - - connectors-worker - - connectors-worker-google-drive - - connectors-worker-notion - - connectors-worker-notion-gc - - connectors-worker-webcrawler - - connectors-worker-zendesk - - front - - front-worker - - front-upsert-table-worker - ports: - - protocol: TCP - port: 3006 \ No newline at end of file diff --git a/k8s/dust-kube/services/apache-tika-service.yaml b/k8s/dust-kube/services/apache-tika-service.yaml deleted file mode 100644 index f1bc35313b49..000000000000 --- a/k8s/dust-kube/services/apache-tika-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: apache-tika-service - namespace: apache-tika - annotations: - cloud.google.com/backend-config: '{"default": "apache-tika-backendconfig"}' -spec: - selector: - app: apache-tika - ports: - - protocol: TCP - port: 80 - targetPort: 9998 - type: ClusterIP diff --git a/k8s/dust-kube/services/connectors-service.yaml b/k8s/dust-kube/services/connectors-service.yaml deleted file mode 100644 index 40223f2ca9b6..000000000000 --- a/k8s/dust-kube/services/connectors-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: connectors-service - annotations: - cloud.google.com/backend-config: '{"default": "connectors-backendconfig"}' -spec: - selector: - app: connectors - name: connectors-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3002 - type: ClusterIP diff --git a/k8s/dust-kube/services/connectors-worker-service.yaml b/k8s/dust-kube/services/connectors-worker-service.yaml deleted file mode 100644 index b698c7b061f8..000000000000 --- a/k8s/dust-kube/services/connectors-worker-service.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: connectors-worker-service -spec: - selector: - app: connectors-worker - name: connectors-worker-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3000 - type: ClusterIP diff --git a/k8s/dust-kube/services/core-service.yaml b/k8s/dust-kube/services/core-service.yaml deleted file mode 100644 index f6353ed6c703..000000000000 --- a/k8s/dust-kube/services/core-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: core-service - annotations: - cloud.google.com/backend-config: '{"default": "core-backendconfig"}' -spec: - selector: - app: core - name: core-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3001 - type: ClusterIP diff --git a/k8s/dust-kube/services/core-sqlite-worker-headless-service.yaml b/k8s/dust-kube/services/core-sqlite-worker-headless-service.yaml deleted file mode 100644 index 24b7e470f9e3..000000000000 --- a/k8s/dust-kube/services/core-sqlite-worker-headless-service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: core-sqlite-worker-headless-service - annotations: - cloud.google.com/backend-config: '{"default": "core-backendconfig"}' -spec: - # This makes the service headless. - clusterIP: None - selector: - app: core-sqlite-worker - name: core-sqlite-worker-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3005 diff --git a/k8s/dust-kube/services/front-edge-service.yaml b/k8s/dust-kube/services/front-edge-service.yaml deleted file mode 100644 index d45fb1b6b0ee..000000000000 --- a/k8s/dust-kube/services/front-edge-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: front-edge-service - annotations: - cloud.google.com/backend-config: '{"default": "front-backendconfig"}' -spec: - selector: - app: front-edge - name: front-edge-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3000 - type: ClusterIP diff --git a/k8s/dust-kube/services/front-qa-service.yaml b/k8s/dust-kube/services/front-qa-service.yaml deleted file mode 100644 index 3d3021ed4bf6..000000000000 --- a/k8s/dust-kube/services/front-qa-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: front-qa-service - annotations: - cloud.google.com/backend-config: '{"default": "front-backendconfig"}' -spec: - selector: - app: front-qa - name: front-qa-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3000 - type: ClusterIP diff --git a/k8s/dust-kube/services/front-service.yaml b/k8s/dust-kube/services/front-service.yaml deleted file mode 100644 index 55cf9784a3c4..000000000000 --- a/k8s/dust-kube/services/front-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: front-service - annotations: - cloud.google.com/backend-config: '{"default": "front-backendconfig"}' -spec: - selector: - app: front - name: front-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3000 - type: ClusterIP diff --git a/k8s/dust-kube/services/metabase-service.yaml b/k8s/dust-kube/services/metabase-service.yaml deleted file mode 100644 index 1c61e835848d..000000000000 --- a/k8s/dust-kube/services/metabase-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: metabase-service - annotations: - beta.cloud.google.com/backend-config: '{"ports": {"80":"metabase-backendconfig"}}' -spec: - selector: - app: metabase - name: metabase-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3000 - type: ClusterIP diff --git a/k8s/dust-kube/services/oauth-service.yaml b/k8s/dust-kube/services/oauth-service.yaml deleted file mode 100644 index bfd9031c1a97..000000000000 --- a/k8s/dust-kube/services/oauth-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: oauth-service - annotations: - cloud.google.com/backend-config: '{"default": "oauth-backendconfig"}' -spec: - selector: - app: oauth - name: oauth-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3006 - type: ClusterIP diff --git a/k8s/dust-kube/services/viz-service.yaml b/k8s/dust-kube/services/viz-service.yaml deleted file mode 100644 index 80d9e5dee595..000000000000 --- a/k8s/dust-kube/services/viz-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: viz-service - annotations: - cloud.google.com/backend-config: '{"default": "viz-backendconfig"}' -spec: - selector: - app: viz - name: viz-pod - ports: - - protocol: TCP - port: 80 - targetPort: 3000 - type: ClusterIP From 7d5808fdc85e35518db8353170980c9c31e11634 Mon Sep 17 00:00:00 2001 From: Jules Belveze <32683010+JulesBelveze@users.noreply.github.com> Date: Fri, 20 Dec 2024 08:38:37 +0100 Subject: [PATCH 27/78] [.github] - feature: add region choice and matrix build to deployment workflow (#9563) - Add input for choosing deployment regions or selecting "all" for deploying to multiple regions - Implement job matrix to build connectors in different regions - Create a notification step to announce the start of the build process - Restructure workflow to separate notification, matrix creation, build, and deploy jobs - Update deployment job to reference the new region selection and matrix build steps - Remove hardcoded region in favor of dynamic input from GitHub Actions trigger --- .github/workflows/deploy-connectors.yml | 73 +++++++++++++++++++------ 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/.github/workflows/deploy-connectors.yml b/.github/workflows/deploy-connectors.yml index dd7f273841b1..84cc81f355ca 100644 --- a/.github/workflows/deploy-connectors.yml +++ b/.github/workflows/deploy-connectors.yml @@ -3,6 +3,15 @@ name: Deploy Connectors on: workflow_dispatch: inputs: + regions: + description: "Regions to deploy to" + required: true + default: "us-central1" + type: choice + options: + - "us-central1" + - "europe-west1" + - "all" check_deployment_blocked: description: "Check #deployment locks or force deploy" required: true @@ -18,17 +27,15 @@ concurrency: env: GCLOUD_PROJECT_ID: ${{ secrets.GCLOUD_PROJECT_ID }} + IMAGE_NAME: connectors jobs: - build-and-deploy: + notify-start: runs-on: ubuntu-latest - - if: github.ref == 'refs/heads/main' - + outputs: + thread_ts: ${{ steps.build_message.outputs.thread_ts }} steps: - - name: Checkout code - uses: actions/checkout@v3 - + - uses: actions/checkout@v3 - name: Get short sha id: short_sha run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT @@ -52,22 +59,56 @@ jobs: channel: ${{ secrets.SLACK_CHANNEL_ID }} slack_token: ${{ secrets.SLACK_BOT_TOKEN }} + create-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - id: set-matrix + run: | + if [ "${{ github.event.inputs.regions }}" = "all" ]; then + echo "matrix=[\"us-central1\",\"europe-west1\"]" >> $GITHUB_OUTPUT + else + echo "matrix=[\"${{ github.event.inputs.regions }}\"]" >> $GITHUB_OUTPUT + fi + + build: + needs: [notify-start, create-matrix] + runs-on: ubuntu-latest + strategy: + matrix: + region: ${{ fromJson(needs.create-matrix.outputs.matrix) }} + fail-fast: true + + steps: + - uses: actions/checkout@v3 + - name: Get short sha + id: short_sha + run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + - name: "Authenticate with Google Cloud" uses: "google-github-actions/auth@v1" with: credentials_json: "${{ secrets.GCLOUD_SA_KEY }}" - - name: "Set up Cloud SDK" - uses: "google-github-actions/setup-gcloud@v1" - - - name: Build the image on Cloud Build + - name: Build image for ${{ matrix.region }} run: | chmod +x ./k8s/cloud-build.sh ./k8s/cloud-build.sh \ - --image-name=connectors \ + --image-name=$IMAGE_NAME \ --dockerfile-path=./connectors/Dockerfile \ --working-dir=./ \ - --region=us-central1 + --region=${{ matrix.region }} + + deploy: + if: github.ref == 'refs/heads/main' + needs: [notify-start, build] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Get short sha + id: short_sha + run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - name: Generate a token id: generate-token @@ -89,10 +130,10 @@ jobs: repo: 'dust-infra', event_type: 'trigger-component-deploy', client_payload: { - regions: 'us-central1', + regions: '${{ github.event.inputs.regions }}', component: 'connectors', image_tag: '${{ steps.short_sha.outputs.short_sha }}', - slack_thread_ts: "${{ steps.build_message.outputs.thread_ts }}", + slack_thread_ts: "${{ needs.notify-start.outputs.thread_ts }}", slack_channel: '${{ secrets.SLACK_CHANNEL_ID }}' } }); @@ -107,4 +148,4 @@ jobs: image_tag: ${{ steps.short_sha.outputs.short_sha }} channel: ${{ secrets.SLACK_CHANNEL_ID }} slack_token: ${{ secrets.SLACK_BOT_TOKEN }} - thread_ts: "${{ steps.build_message.outputs.thread_ts }}" + thread_ts: "${{ needs.notify-start.outputs.thread_ts }}" From 9f7e42d91e8e7298dc2c37539430dc77b48b59b3 Mon Sep 17 00:00:00 2001 From: Stanislas Polu Date: Fri, 20 Dec 2024 08:57:12 +0100 Subject: [PATCH 28/78] middleware to prevent path traversal attempts (#9554) --- front/middleware.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 front/middleware.ts diff --git a/front/middleware.ts b/front/middleware.ts new file mode 100644 index 000000000000..77fcc688b59d --- /dev/null +++ b/front/middleware.ts @@ -0,0 +1,16 @@ +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; + +export function middleware(request: NextRequest) { + // Detect path traversal attempts + const url = request.nextUrl.pathname; + if (url.includes("../") || url.includes("..%2F") || url.includes("..%5C")) { + return new NextResponse(null, { status: 400 }); + } + + return NextResponse.next(); +} + +export const config = { + matcher: "/:path*", +}; From 40eb40d660d5fbe0a12c6f5def05e58c6e40f74b Mon Sep 17 00:00:00 2001 From: thib-martin <168569391+thib-martin@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:30:51 +0100 Subject: [PATCH 29/78] Changing pricing page and adding request demo button (#9539) * changing pricing page and adding request demo * fix capital letter * few fixes * order * add salesforce * fixing linting --- front/components/home/LandingLayout.tsx | 9 +- front/components/plans/PlansTables.tsx | 128 ++++++++---------------- 2 files changed, 50 insertions(+), 87 deletions(-) diff --git a/front/components/home/LandingLayout.tsx b/front/components/home/LandingLayout.tsx index 0d0c1ef2d765..0c5b968f85c2 100644 --- a/front/components/home/LandingLayout.tsx +++ b/front/components/home/LandingLayout.tsx @@ -98,7 +98,14 @@ export default function LandingLayout({
-
+
+
+ {/* Tracker Settings */} +
@@ -400,6 +441,7 @@ export const TrackerBuilder = ({ placeholder="Descriptive name." message={tracker.nameError} messageStatus={tracker.nameError ? "error" : undefined} + disabled={tracker.status === "inactive"} />
@@ -419,11 +461,14 @@ export const TrackerBuilder = ({ placeholder="Brief description of what you're tracking and why." message={tracker.descriptionError} messageStatus={tracker.descriptionError ? "error" : undefined} + disabled={tracker.status === "inactive"} />
+ {/* Notification Settings */} +
@@ -447,6 +492,7 @@ export const TrackerBuilder = ({ } variant="outline" isSelect + disabled={tracker.status === "inactive"} /> @@ -486,10 +532,14 @@ export const TrackerBuilder = ({ }} message={tracker.recipientsError} messageStatus={tracker.recipientsError ? "error" : undefined} + disabled={tracker.status === "inactive"} />
+ + {/* DataSource Configurations Settings */} +
@@ -516,6 +566,7 @@ export const TrackerBuilder = ({ }} error={tracker.promptError} showErrorLabel={!!tracker.promptError} + disabled={tracker.status === "inactive"} />
@@ -528,6 +579,7 @@ export const TrackerBuilder = ({ setShowMaintainedDsModal(true); }} className="w-fit" + disabled={tracker.status === "inactive"} />
@@ -558,6 +610,7 @@ export const TrackerBuilder = ({ setShowWatchedDataSourcesModal(true); }} className="w-fit" + disabled={tracker.status === "inactive"} /> diff --git a/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/[tId]/index.ts b/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/[tId]/index.ts index 03a9db596ec6..654819565b2e 100644 --- a/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/[tId]/index.ts +++ b/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/[tId]/index.ts @@ -108,13 +108,13 @@ async function handler( const updatedTrackerRes = await tracker.updateConfig( auth, { + status: body.status, name: body.name, description: body.description, prompt: body.prompt, modelId: body.modelId, providerId: body.providerId, temperature: body.temperature, - status: "active", frequency: body.frequency, recipients: body.recipients, }, diff --git a/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/index.ts b/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/index.ts index 932f4d6c8977..18401e9a1431 100644 --- a/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/index.ts +++ b/front/pages/api/w/[wId]/spaces/[spaceId]/trackers/index.ts @@ -37,6 +37,7 @@ const TrackerDataSourcesConfigurationBodySchema = t.array( ); export const PostTrackersRequestBodySchema = t.type({ + status: t.union([t.literal("active"), t.literal("inactive")]), name: t.string, description: t.union([t.string, t.null]), prompt: t.union([t.string, t.null]), @@ -137,7 +138,7 @@ async function handler( modelId: body.modelId, providerId: body.providerId, temperature: body.temperature, - status: "active", + status: body.status, frequency: body.frequency, recipients: body.recipients, }, diff --git a/front/pages/w/[wId]/assistant/labs/trackers/[tId]/index.tsx b/front/pages/w/[wId]/assistant/labs/trackers/[tId]/index.tsx index 1e47fed54f74..510364a2756f 100644 --- a/front/pages/w/[wId]/assistant/labs/trackers/[tId]/index.tsx +++ b/front/pages/w/[wId]/assistant/labs/trackers/[tId]/index.tsx @@ -126,6 +126,7 @@ const initializeTrackerBuilderState = async ( ); return { + status: trackerToEdit.status, name: trackerToEdit.name, description: trackerToEdit.description, prompt: trackerToEdit.prompt, diff --git a/types/src/front/tracker.ts b/types/src/front/tracker.ts index 3210db9d8ca1..b092d3b1ef7d 100644 --- a/types/src/front/tracker.ts +++ b/types/src/front/tracker.ts @@ -3,11 +3,13 @@ import { DataSourceViewSelectionConfigurations } from "./data_source_view"; import { ModelIdType, ModelProviderIdType } from "./lib/assistant"; import { SpaceType } from "./space"; +type TrackerStatus = "active" | "inactive"; + export type TrackerConfigurationType = { id: ModelId; sId: string; name: string; - status: "active" | "inactive"; + status: TrackerStatus; description: string | null; modelId: ModelIdType; providerId: ModelProviderIdType; @@ -33,6 +35,7 @@ export type TrackerDataSourceConfigurationType = { export type TrackerConfigurationStateType = { name: string | null; + status: TrackerStatus; nameError: string | null; description: string | null; descriptionError: string | null; @@ -50,8 +53,12 @@ export type TrackerConfigurationStateType = { }; export const TRACKER_FREQUENCIES = [ - { label: "Daily", value: "0 17 * * 1-5" }, - { label: "Weekly", value: "0 17 * * 5" }, + { label: "Daily (Mon-Fri)", value: "0 17 * * 1-5" }, + { label: "Weekly on Monday", value: "0 17 * * 1" }, + { label: "Weekly on Tuesday", value: "0 17 * * 2" }, + { label: "Weekly on Wednesday", value: "0 17 * * 3" }, + { label: "Weekly on Thursday", value: "0 17 * * 4" }, + { label: "Weekly on Friday", value: "0 17 * * 5" }, ]; export type TrackerIdWorkspaceId = { From 1f22ddcdc0e2ae696f96191e41aa1512ab0f17e9 Mon Sep 17 00:00:00 2001 From: Philippe Rolet Date: Fri, 20 Dec 2024 09:58:59 +0100 Subject: [PATCH 31/78] [Favorites] Fix mutate order of agent configurations (#9565) Description --- Part of work on #8933 We should first update the current agent configuration, then everybody Risks --- none Deploy --- front --- front/lib/swr/assistants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/lib/swr/assistants.ts b/front/lib/swr/assistants.ts index 77b7389e9824..106a1839d378 100644 --- a/front/lib/swr/assistants.ts +++ b/front/lib/swr/assistants.ts @@ -535,8 +535,8 @@ export function useUpdateUserFavorite({ }`, type: "success", }); - await mutateAgentConfigurations(); await mutateCurrentAgentConfiguration(); + await mutateAgentConfigurations(); return true; } else { const data = await res.json(); From 063966c2511a2cd7620ebbc5e635c10590e88639 Mon Sep 17 00:00:00 2001 From: Stanislas Polu Date: Fri, 20 Dec 2024 10:13:47 +0100 Subject: [PATCH 32/78] rename progressiveAgentConfigurations to unifiedAgentConfigurations + comments (#9566) --- .../AssistantBrowserContainer.tsx | 5 ++- .../conversation/input_bar/InputBar.tsx | 5 ++- .../editor/useAssistantSuggestions.ts | 5 ++- front/lib/swr/assistants.ts | 42 ++++++------------- 4 files changed, 21 insertions(+), 36 deletions(-) diff --git a/front/components/assistant/conversation/AssistantBrowserContainer.tsx b/front/components/assistant/conversation/AssistantBrowserContainer.tsx index 481ac58494a2..20de3dc04fbe 100644 --- a/front/components/assistant/conversation/AssistantBrowserContainer.tsx +++ b/front/components/assistant/conversation/AssistantBrowserContainer.tsx @@ -6,7 +6,7 @@ import type { import { useCallback } from "react"; import { AssistantBrowser } from "@app/components/assistant/AssistantBrowser"; -import { useProgressiveAgentConfigurations } from "@app/lib/swr/assistants"; +import { useUnifiedAgentConfigurations } from "@app/lib/swr/assistants"; import { classNames } from "@app/lib/utils"; interface AssistantBrowserContainerProps { @@ -22,7 +22,8 @@ export function AssistantBrowserContainer({ isBuilder, setAssistantToMention, }: AssistantBrowserContainerProps) { - const { agentConfigurations, isLoading } = useProgressiveAgentConfigurations({ + // We use this specific hook because this component is involved in the new conversation page. + const { agentConfigurations, isLoading } = useUnifiedAgentConfigurations({ workspaceId: owner.sId, }); diff --git a/front/components/assistant/conversation/input_bar/InputBar.tsx b/front/components/assistant/conversation/input_bar/InputBar.tsx index 4a313df04da9..e125ba7ffb7e 100644 --- a/front/components/assistant/conversation/input_bar/InputBar.tsx +++ b/front/components/assistant/conversation/input_bar/InputBar.tsx @@ -18,7 +18,7 @@ import InputBarContainer, { import { InputBarContext } from "@app/components/assistant/conversation/input_bar/InputBarContext"; import { useFileUploaderService } from "@app/hooks/useFileUploaderService"; import type { DustError } from "@app/lib/error"; -import { useProgressiveAgentConfigurations } from "@app/lib/swr/assistants"; +import { useUnifiedAgentConfigurations } from "@app/lib/swr/assistants"; import { useConversation } from "@app/lib/swr/conversations"; import { classNames } from "@app/lib/utils"; @@ -82,8 +82,9 @@ export function AssistantInputBar({ options: { disabled: true }, // We just want to get the mutation function }); + // We use this specific hook because this component is involved in the new conversation page. const { agentConfigurations: baseAgentConfigurations } = - useProgressiveAgentConfigurations({ + useUnifiedAgentConfigurations({ workspaceId: owner.sId, }); diff --git a/front/components/assistant/conversation/input_bar/editor/useAssistantSuggestions.ts b/front/components/assistant/conversation/input_bar/editor/useAssistantSuggestions.ts index 6ea357943968..a9c2bf2aad0f 100644 --- a/front/components/assistant/conversation/input_bar/editor/useAssistantSuggestions.ts +++ b/front/components/assistant/conversation/input_bar/editor/useAssistantSuggestions.ts @@ -5,7 +5,7 @@ import type { import { compareAgentsForSort } from "@dust-tt/types"; import { useMemo } from "react"; -import { useProgressiveAgentConfigurations } from "@app/lib/swr/assistants"; +import { useUnifiedAgentConfigurations } from "@app/lib/swr/assistants"; function makeEditorSuggestions( agentConfigurations: LightAgentConfigurationType[] @@ -25,7 +25,8 @@ const useAssistantSuggestions = ( inListAgentConfigurations: LightAgentConfigurationType[], owner: WorkspaceType ) => { - const { agentConfigurations } = useProgressiveAgentConfigurations({ + // We use this specific hook because this component is involved in the new conversation page. + const { agentConfigurations } = useUnifiedAgentConfigurations({ workspaceId: owner.sId, }); diff --git a/front/lib/swr/assistants.ts b/front/lib/swr/assistants.ts index 106a1839d378..c41a6a8be60e 100644 --- a/front/lib/swr/assistants.ts +++ b/front/lib/swr/assistants.ts @@ -142,25 +142,16 @@ export function useAgentConfigurations({ }; } -export function useProgressiveAgentConfigurations({ +// This is the call that is required for the new conversation page to load all views on that page. +// All elements that are involved in that page should rely on it to avoid concurrent calls to +// getAgentConfigurations at the initial page load. +export function useUnifiedAgentConfigurations({ workspaceId, disabled, }: { workspaceId: string; disabled?: boolean; }) { - // const { - // agentConfigurations: initialAgentConfigurations, - // isAgentConfigurationsLoading: isInitialAgentConfigurationsLoading, - // } = useAgentConfigurations({ - // workspaceId, - // agentsGetView: "list", - // limit: 24, - // includes: ["usage"], - // disabled, - // revalidate: false, - // }); - const { agentConfigurations: agentConfigurationsWithAuthors, isAgentConfigurationsLoading: isAgentConfigurationsWithAuthorsLoading, @@ -173,13 +164,6 @@ export function useProgressiveAgentConfigurations({ disabled, }); - // const isLoading = - // isInitialAgentConfigurationsLoading || - // isAgentConfigurationsWithAuthorsLoading; - // const agentConfigurations = isAgentConfigurationsWithAuthorsLoading - // ? initialAgentConfigurations - // : agentConfigurationsWithAuthors; - return { agentConfigurations: agentConfigurationsWithAuthors, isLoading: isAgentConfigurationsWithAuthorsLoading, @@ -419,11 +403,10 @@ export function useUpdateAgentScope({ agentConfigurationId, disabled: true, }); - const { mutate: mutateAgentConfigurations } = - useProgressiveAgentConfigurations({ - workspaceId: owner.sId, - disabled: true, - }); + const { mutate: mutateAgentConfigurations } = useUnifiedAgentConfigurations({ + workspaceId: owner.sId, + disabled: true, + }); const doUpdate = useCallback( async (scope: Exclude) => { @@ -500,11 +483,10 @@ export function useUpdateUserFavorite({ agentConfigurationId, disabled: true, }); - const { mutate: mutateAgentConfigurations } = - useProgressiveAgentConfigurations({ - workspaceId: owner.sId, - disabled: true, - }); + const { mutate: mutateAgentConfigurations } = useUnifiedAgentConfigurations({ + workspaceId: owner.sId, + disabled: true, + }); const [isUpdatingFavorite, setIsUpdatingFavorite] = useState(false); From 6b128f5a5107a442a8df0211be8f11270e4f751e Mon Sep 17 00:00:00 2001 From: Sebastien Flory Date: Fri, 20 Dec 2024 10:28:08 +0100 Subject: [PATCH 33/78] Add: support for multi regions in auth flow (#9557) * Add: support for multi regions in auth flow * review fdbk * Review fdbk * Enable redirection on front-edge and in europe --- .github/workflows/deploy-resolver.yml | 67 - front/lib/multi_regions/config.ts | 37 + front/lib/multi_regions/lookup.ts | 39 + .../lib/multi_regions/region_lookup_client.ts | 51 + front/pages/api/auth/[auth0].ts | 2 +- front/pages/api/login.ts | 35 +- front/pages/api/lookup/[resource]/index.ts | 45 +- resolver/.gitignore | 36 - resolver/logger/logger.ts | 50 - resolver/logger/withlogging.ts | 141 - resolver/package-lock.json | 9062 ----------------- resolver/src/components/Layout.tsx | 68 - resolver/src/lib/config.ts | 25 - resolver/src/lib/lookup_api.ts | 62 - resolver/src/pages/_app.tsx | 23 - resolver/src/pages/index.tsx | 22 - resolver/tsconfig.json | 36 - 17 files changed, 175 insertions(+), 9626 deletions(-) delete mode 100644 .github/workflows/deploy-resolver.yml create mode 100644 front/lib/multi_regions/config.ts create mode 100644 front/lib/multi_regions/lookup.ts create mode 100644 front/lib/multi_regions/region_lookup_client.ts delete mode 100644 resolver/.gitignore delete mode 100644 resolver/logger/logger.ts delete mode 100644 resolver/logger/withlogging.ts delete mode 100644 resolver/package-lock.json delete mode 100644 resolver/src/components/Layout.tsx delete mode 100644 resolver/src/lib/config.ts delete mode 100644 resolver/src/lib/lookup_api.ts delete mode 100644 resolver/src/pages/_app.tsx delete mode 100644 resolver/src/pages/index.tsx delete mode 100644 resolver/tsconfig.json diff --git a/.github/workflows/deploy-resolver.yml b/.github/workflows/deploy-resolver.yml deleted file mode 100644 index b3a9c6e8d28b..000000000000 --- a/.github/workflows/deploy-resolver.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: Deploy Region Resolver - -on: - workflow_dispatch: - -env: - GCLOUD_PROJECT_ID: ${{ secrets.GCLOUD_PROJECT_ID }} - SERVICE: region-resolver - IMAGE_NAME: region-resolver - REGION: us-central1 - -concurrency: - group: deploy_resolver - cancel-in-progress: false - -jobs: - notify-start: - runs-on: ubuntu-latest - outputs: - thread_ts: ${{ steps.build_message.outputs.thread_ts }} - steps: - - uses: actions/checkout@v3 - - name: Get short sha - id: short_sha - run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - - name: Notify Build And Deploy Start - id: build_message - uses: ./.github/actions/slack-notify - with: - step: "start" - component: "region-resolver" - image_tag: ${{ steps.short_sha.outputs.short_sha }} - channel: ${{ secrets.SLACK_CHANNEL_ID }} - slack_token: ${{ secrets.SLACK_BOT_TOKEN }} - - deploy: - needs: [notify-start] - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Get short sha - id: short_sha - run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - - name: "Authenticate with Google Cloud" - uses: "google-github-actions/auth@v1" - with: - credentials_json: "${{ secrets.GCLOUD_SA_KEY }}" - - - name: Build using Cloud Build - run: | - chmod +x ./k8s/cloud-build.sh - ./k8s/cloud-build.sh \ - --working-dir=./ \ - --image-name=${IMAGE_NAME} \ - --dockerfile-path=./resolver/Dockerfile \ - --region=${REGION} - - - name: Deploy to Cloud Run - uses: google-github-actions/deploy-cloudrun@v1 - with: - service: ${{ env.SERVICE }} - region: ${{ env.REGION }} - image: "${{ env.REGION }}-docker.pkg.dev/${{ env.GCLOUD_PROJECT_ID }}/dust-images/${{ env.IMAGE_NAME }}:${{ steps.short_sha.outputs.short_sha }}" diff --git a/front/lib/multi_regions/config.ts b/front/lib/multi_regions/config.ts new file mode 100644 index 000000000000..401c7daa536e --- /dev/null +++ b/front/lib/multi_regions/config.ts @@ -0,0 +1,37 @@ +import { EnvironmentConfig, isDevelopment } from "@dust-tt/types"; + +const CLUSTER_REGIONS = ["local", "europe-west1", "us-central1"] as const; + +export type ClusterRegionType = (typeof CLUSTER_REGIONS)[number]; + +const REGIONS_TO_URLS: Map = new Map([ + ["local", "http://localhost:3000"], + ["europe-west1", "https://eu.dust.tt"], + ["us-central1", "https://dust.tt"], +]); + +export const config = { + getCurrentRegion: (): string => { + return EnvironmentConfig.getEnvVariable("DUST_REGION"); + }, + getLookupApiSecret: (): string => { + return EnvironmentConfig.getEnvVariable("REGION_RESOLVER_SECRET"); + }, + getAvailableRegions: () => { + return ( + [...REGIONS_TO_URLS] + // Keep only the regions that match the current environment + .filter( + ([region]) => + (isDevelopment() && region.startsWith("local")) || + (!isDevelopment() && !region.startsWith("local")) + ) + ); + }, +}; + +export function isCurrentRegion(region: ClusterRegionType): boolean { + return config.getCurrentRegion() === region; +} + +export const isMultiRegions = () => config.getAvailableRegions().length > 1; diff --git a/front/lib/multi_regions/lookup.ts b/front/lib/multi_regions/lookup.ts new file mode 100644 index 000000000000..7182c8ed21de --- /dev/null +++ b/front/lib/multi_regions/lookup.ts @@ -0,0 +1,39 @@ +import { getPendingMembershipInvitationWithWorkspaceForEmail } from "@app/lib/iam/invitations"; +import { fetchUserWithAuth0Sub } from "@app/lib/iam/users"; +import { Workspace } from "@app/lib/models/workspace"; + +export async function handleLookupUser(userLookup: { + sub: string; + email: string; +}) { + // Check if user exists or has pending invitations + const [user, pendingInvite] = await Promise.all([ + fetchUserWithAuth0Sub(userLookup.sub), + getPendingMembershipInvitationWithWorkspaceForEmail(userLookup.email), + ]); + + if (user) { + return { + user: { email: user.email }, + }; + } else if (pendingInvite) { + return { + user: { email: pendingInvite.invitation.inviteEmail }, + }; + } + + return { + user: null, + }; +} + +export async function handleLookupWorkspace(workspaceLookup: { + workspace: string; +}) { + const workspace = await Workspace.findOne({ + where: { sId: workspaceLookup.workspace }, + }); + return { + workspace: workspace?.sId ? { sId: workspace.sId } : null, + }; +} diff --git a/front/lib/multi_regions/region_lookup_client.ts b/front/lib/multi_regions/region_lookup_client.ts new file mode 100644 index 000000000000..b1e31e0d7521 --- /dev/null +++ b/front/lib/multi_regions/region_lookup_client.ts @@ -0,0 +1,51 @@ +import type { + UserLookupRequestBodyType, + UserLookupResponse, +} from "@app/pages/api/lookup/[resource]"; + +import { config, isCurrentRegion } from "./config"; + +type Resource = "user"; + +export class RegionLookupClient { + private async lookup(resource: Resource, body: U) { + const rawResults = await Promise.all( + config.getAvailableRegions().map(async ([region, url]) => { + const response = await fetch(`${url}/api/lookup/${resource}`, { + method: "POST", + headers: this.getDefaultHeaders(), + body: JSON.stringify(body), + }); + + const data = await response.json(); + if ("error" in data) { + throw new Error(`${region} lookup failed: ${data.error.message}`); + } else { + return [ + region, + { + reponse: data as T, + isCurrentRegion: isCurrentRegion(region), + regionUrl: url, + }, + ] as const; + } + }) + ); + + return new Map(rawResults); + } + + private getDefaultHeaders() { + return { + "Content-Type": "application/json", + Authorization: `Bearer ${config.getLookupApiSecret()}`, + }; + } + + async lookupUser(user: UserLookupRequestBodyType["user"]) { + return this.lookup("user", { + user, + }); + } +} diff --git a/front/pages/api/auth/[auth0].ts b/front/pages/api/auth/[auth0].ts index 0a0bd66e2aca..982cb02e7399 100644 --- a/front/pages/api/auth/[auth0].ts +++ b/front/pages/api/auth/[auth0].ts @@ -48,7 +48,7 @@ export default handleAuth({ return { authorizationParams: defaultAuthorizationParams, - returnTo: "/api/login", + returnTo: "/api/login", // Note from seb, I think this is not used }; }), callback: async (req: NextApiRequest, res: NextApiResponse) => { diff --git a/front/pages/api/login.ts b/front/pages/api/login.ts index 16e4469e701f..39fd6412853a 100644 --- a/front/pages/api/login.ts +++ b/front/pages/api/login.ts @@ -3,9 +3,10 @@ import type { Result, WithAPIErrorResponse, } from "@dust-tt/types"; -import { Err, Ok } from "@dust-tt/types"; +import { Err, isDevelopment, Ok } from "@dust-tt/types"; import type { NextApiRequest, NextApiResponse } from "next"; +import config from "@app/lib/api/config"; import { evaluateWorkspaceSeatAvailability } from "@app/lib/api/workspace"; import { getSession } from "@app/lib/auth"; import { AuthFlowError, SSOEnforcedError } from "@app/lib/iam/errors"; @@ -24,6 +25,11 @@ import { } from "@app/lib/iam/workspaces"; import type { MembershipInvitation } from "@app/lib/models/workspace"; import { Workspace } from "@app/lib/models/workspace"; +import { + config as multiRegionConfig, + isMultiRegions, +} from "@app/lib/multi_regions/config"; +import { RegionLookupClient } from "@app/lib/multi_regions/region_lookup_client"; import { subscriptionForWorkspace } from "@app/lib/plans/subscription"; import { MembershipResource } from "@app/lib/resources/membership_resource"; import type { UserResource } from "@app/lib/resources/user_resource"; @@ -343,6 +349,33 @@ async function handler( }); } + if ( + isMultiRegions() && + (isDevelopment() || + multiRegionConfig.getCurrentRegion() === "europe-west1" || + config.getClientFacingUrl() === "https://front-edge.dust.tt") + ) { + // Check if the user should be redirect to another region. + const regionLookupClient = new RegionLookupClient(); + const r = await regionLookupClient.lookupUser(session.user); + r.forEach((result, region) => { + if (result.reponse.user?.email) { + if (!result.isCurrentRegion) { + const reqUrl = req.url; + const { searchParams } = new URL(reqUrl ?? ""); + res.redirect( + `${result.regionUrl}/api/login?${searchParams.toString()}` + ); + return; + } else { + console.log( + `User ${result.reponse.user.email} is already in the correct region ${region} (${result.regionUrl}).` + ); + } + } + }); + } + const { inviteToken, wId } = req.query; const targetWorkspaceId = typeof wId === "string" ? wId : undefined; // Auth0 flow augments token with a claim for workspace id linked to the enterprise connection. diff --git a/front/pages/api/lookup/[resource]/index.ts b/front/pages/api/lookup/[resource]/index.ts index 5b754b9ba6ad..a64ec594e7e6 100644 --- a/front/pages/api/lookup/[resource]/index.ts +++ b/front/pages/api/lookup/[resource]/index.ts @@ -6,18 +6,19 @@ import type { NextApiRequest, NextApiResponse } from "next"; import config from "@app/lib/api/config"; import { getBearerToken } from "@app/lib/auth"; -import { getPendingMembershipInvitationWithWorkspaceForEmail } from "@app/lib/iam/invitations"; -import { fetchUserWithAuth0Sub } from "@app/lib/iam/users"; -import { Workspace } from "@app/lib/models/workspace"; +import { + handleLookupUser, + handleLookupWorkspace, +} from "@app/lib/multi_regions/lookup"; import { apiError, withLogging } from "@app/logger/withlogging"; -type WorkspaceLookupResponse = { +export type WorkspaceLookupResponse = { workspace: { sId: string; } | null; }; -type UserLookupResponse = { +export type UserLookupResponse = { user: { email: string; } | null; @@ -39,6 +40,12 @@ const WorkspaceLookupSchema = t.type({ workspace: t.string, }); +export type UserLookupRequestBodyType = t.TypeOf; + +export type WorkspaceLookupRequestBodyType = t.TypeOf< + typeof WorkspaceLookupSchema +>; + const ResourceType = t.union([t.literal("user"), t.literal("workspace")]); async function handler( @@ -116,7 +123,7 @@ async function handler( }, }); } - response = await handleLookupUser(bodyValidation.right); + response = await handleLookupUser(bodyValidation.right.user); } break; case "workspace": { @@ -138,30 +145,4 @@ async function handler( return; } -async function handleLookupUser( - userLookup: t.TypeOf -): Promise { - // Check if user exists and for pending invitations - const [user, pendingInvite] = await Promise.all([ - fetchUserWithAuth0Sub(userLookup.user.sub), - getPendingMembershipInvitationWithWorkspaceForEmail(userLookup.user.email), - ]); - - const isUserKnown = !!user || !!pendingInvite; - return { - user: isUserKnown ? { email: userLookup.user.email } : null, - }; -} - -async function handleLookupWorkspace( - body: t.TypeOf -): Promise { - const workspace = await Workspace.findOne({ - where: { sId: body.workspace }, - }); - return { - workspace: workspace?.sId ? { sId: workspace.sId } : null, - }; -} - export default withLogging(handler); diff --git a/resolver/.gitignore b/resolver/.gitignore deleted file mode 100644 index 321b6d4a5407..000000000000 --- a/resolver/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel - -.env.local - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/resolver/logger/logger.ts b/resolver/logger/logger.ts deleted file mode 100644 index 436124e0e49f..000000000000 --- a/resolver/logger/logger.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { LoggerOptions } from "pino"; -import pino from "pino"; - -const NODE_ENV = process.env.NODE_ENV; -const LOG_LEVEL = process.env.LOG_LEVEL || "info"; - -const defaultPinoOptions: LoggerOptions = { - serializers: { - error: pino.stdSerializers.err, - }, - formatters: { - level(level) { - return { level }; - }, - }, - redact: [ - // Redact Axios config. - "*.*.config.headers.Authorization", - "*.config.headers.Authorization", - "*.*.response.config.headers.Authorization", - "*.response.config.headers.Authorization", - // Redact Undici config. - "headers.authorization", - ], - level: LOG_LEVEL, -}; - -const devOptions = { - transport: { - target: "pino-pretty", - options: { - errorLikeObjectKeys: [ - "err", - "error", - "error_stack", - "stack", - "apiErrorHandlerCallStack", - ], - }, - }, -}; -let pinoOptions = defaultPinoOptions; -if (NODE_ENV === "development") { - pinoOptions = { ...defaultPinoOptions, ...devOptions }; -} - -const logger = pino(pinoOptions); - -export default logger; -export type { Logger } from "pino"; diff --git a/resolver/logger/withlogging.ts b/resolver/logger/withlogging.ts deleted file mode 100644 index 4a81de6216aa..000000000000 --- a/resolver/logger/withlogging.ts +++ /dev/null @@ -1,141 +0,0 @@ -import tracer from "dd-trace"; -import StatsD from "hot-shots"; -import type { NextApiRequest, NextApiResponse } from "next"; - -import logger from "./logger"; -import { APIErrorWithStatusCode, WithAPIErrorResponse } from "@dust-tt/types"; - -export const statsDClient = new StatsD(); - -export function withLogging( - handler: ( - req: NextApiRequest, - res: NextApiResponse>, - ) => Promise, - streaming = false, -) { - return async ( - req: NextApiRequest, - res: NextApiResponse>, - ): Promise => { - const ddtraceSpan = tracer.scope().active(); - if (ddtraceSpan) { - ddtraceSpan.setTag("streaming", streaming); - } - const now = new Date(); - - let route = req.url; - let workspaceId: string | null = null; - if (route) { - route = route.split("?")[0]; - for (const key in req.query) { - if (key === "wId") { - workspaceId = req.query[key] as string; - } - - const value = req.query[key]; - if (typeof value === "string" && value.length > 0) { - route = route.replaceAll(value, `[${key}]`); - } - } - } - - // Extract commit hash from headers or query params. - const commitHash = req.headers["x-commit-hash"] ?? req.query.commitHash; - - try { - await handler(req, res); - } catch (err) { - const elapsed = new Date().getTime() - now.getTime(); - logger.error( - { - commitHash, - durationMs: elapsed, - error: err, - method: req.method, - route, - url: req.url, - // @ts-expect-error best effort to get err.stack if it exists - error_stack: err?.stack, - workspaceId, - }, - "Unhandled API Error", - ); - - const tags = [ - `method:${req.method}`, - `route:${route}`, - `status_code:500`, - `error_type:unhandled_internal_server_error`, - ]; - - statsDClient.increment("api_errors.count", 1, tags); - - // Try to return a 500 as it's likely nothing was returned yet. - res.status(500).json({ - error: { - type: "internal_server_error", - message: `Unhandled internal server error: ${err}`, - }, - }); - return; - } - - const elapsed = new Date().getTime() - now.getTime(); - - const tags = [ - `method:${req.method}`, - `route:${route}`, - `status_code:${res.statusCode}`, - ]; - - statsDClient.increment("requests.count", 1, tags); - statsDClient.distribution("requests.duration.distribution", elapsed, tags); - - logger.info( - { - commitHash, - durationMs: elapsed, - method: req.method, - route, - statusCode: res.statusCode, - url: req.url, - workspaceId, - }, - "Processed request", - ); - }; -} - -export function apiError( - req: NextApiRequest, - res: NextApiResponse>, - apiError: APIErrorWithStatusCode, - error?: Error, -): void { - logger.error( - { - method: req.method, - url: req.url, - statusCode: apiError.status_code, - apiError: apiError, - error: error, - apiErrorHandlerCallStack: new Error().stack, - }, - "API Error", - ); - - const tags = [ - `method:${req.method}`, - // `url:${req.url}`, - `status_code:${apiError.status_code}`, - `error_type:${apiError.api_error.type}`, - ]; - - statsDClient.increment("api_errors.count", 1, tags); - - res.status(apiError.status_code).json({ - error: apiError.api_error, - }); - return; -} diff --git a/resolver/package-lock.json b/resolver/package-lock.json deleted file mode 100644 index 7cb8fce523dc..000000000000 --- a/resolver/package-lock.json +++ /dev/null @@ -1,9062 +0,0 @@ -{ - "name": "@dust-tt/resolver", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@dust-tt/resolver", - "version": "0.1.0", - "dependencies": { - "@dust-tt/sparkle": "^0.2.342", - "@dust-tt/types": "file:../types", - "body-parser": "^1.20.2", - "dd-trace": "^5.17.0", - "express": "^4.21.2", - "hot-shots": "^10.0.0", - "io-ts": "^2.2.20", - "io-ts-reporters": "^2.0.1", - "morgan": "^1.10.0", - "next": "^14.2.3", - "pino": "^8.11.0", - "pino-pretty": "^10.0.0", - "tailwindcss": "^3.2.4" - }, - "devDependencies": { - "@types/express": "^4.17.17", - "@types/node": "^20.12.12", - "eslint": "^8.56.0", - "prettier": "^3.0", - "tsx": "^4.10.2", - "typescript": "^5.4.5" - } - }, - "../types": { - "version": "0.1.0", - "dependencies": { - "@notionhq/client": "^2.2.4", - "csv-parse": "^5.5.6", - "csv-stringify": "^6.5.0", - "eventsource-parser": "^1.1.1", - "hot-shots": "^10.0.0", - "htmlparser2": "^9.1.0", - "io-ts": "^2.2.20", - "io-ts-reporters": "^2.0.1", - "io-ts-types": "^0.5.19", - "moment-timezone": "^0.5.43", - "redis": "^4.6.8", - "uuid": "^9.0.1" - }, - "devDependencies": { - "@tsconfig/recommended": "^1.0.3", - "@types/uuid": "^9.0.7", - "dts-cli": "^2.0.5", - "eslint-plugin-simple-import-sort": "^12.1.0", - "tslib": "^2.6.2", - "typescript": "^5.4.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" - }, - "node_modules/@datadog/libdatadog": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@datadog/libdatadog/-/libdatadog-0.2.2.tgz", - "integrity": "sha512-rTWo96mEPTY5UbtGoFj8/wY0uKSViJhsPg/Z6aoFWBFXQ8b45Ix2e/yvf92AAwrhG+gPLTxEqTXh3kef2dP8Ow==" - }, - "node_modules/@datadog/native-appsec": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-8.3.0.tgz", - "integrity": "sha512-RYHbSJ/MwJcJaLzaCaZvUyNLUKFbMshayIiv4ckpFpQJDiq1T8t9iM2k7008s75g1vRuXfsRNX7MaLn4aoFuWA==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^3.9.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@datadog/native-iast-rewriter": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@datadog/native-iast-rewriter/-/native-iast-rewriter-2.5.0.tgz", - "integrity": "sha512-WRu34A3Wwp6oafX8KWNAbedtDaaJO+nzfYQht7pcJKjyC2ggfPeF7SoP+eDo9wTn4/nQwEOscSR4hkJqTRlpXQ==", - "dependencies": { - "lru-cache": "^7.14.0", - "node-gyp-build": "^4.5.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@datadog/native-iast-rewriter/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@datadog/native-iast-rewriter/node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/@datadog/native-iast-taint-tracking": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-3.2.0.tgz", - "integrity": "sha512-Mc6FzCoyvU5yXLMsMS9yKnEqJMWoImAukJXolNWCTm+JQYCMf2yMsJ8pBAm7KyZKliamM9rCn7h7Tr2H3lXwjA==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^3.9.0" - } - }, - "node_modules/@datadog/native-metrics": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@datadog/native-metrics/-/native-metrics-3.1.0.tgz", - "integrity": "sha512-yOBi4x0OQRaGNPZ2bx9TGvDIgEdQ8fkudLTFAe7gEM1nAlvFmbE5YfpH8WenEtTSEBwojSau06m2q7axtEEmCg==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^6.1.0", - "node-gyp-build": "^3.9.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@datadog/pprof": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@datadog/pprof/-/pprof-5.4.1.tgz", - "integrity": "sha512-IvpL96e/cuh8ugP5O8Czdup7XQOLHeIDgM5pac5W7Lc1YzGe5zTtebKFpitvb1CPw1YY+1qFx0pWGgKP2kOfHg==", - "hasInstallScript": true, - "dependencies": { - "delay": "^5.0.0", - "node-gyp-build": "<4.0", - "p-limit": "^3.1.0", - "pprof-format": "^2.1.0", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@datadog/sketches-js": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@datadog/sketches-js/-/sketches-js-2.1.1.tgz", - "integrity": "sha512-d5RjycE+MObE/hU+8OM5Zp4VjTwiPLRa8299fj7muOmR16fb942z8byoMbCErnGh0lBevvgkGrLclQDvINbIyg==" - }, - "node_modules/@dust-tt/sparkle": { - "version": "0.2.342", - "resolved": "https://registry.npmjs.org/@dust-tt/sparkle/-/sparkle-0.2.342.tgz", - "integrity": "sha512-D7BaQkXaleddh4LuMfIeIx7cdsSi2OX/f/xeQ0BGbWSS9X909mqESN+0OiCawJyxwVHgAkAfsoedF+HcU48aEg==", - "dependencies": { - "@emoji-mart/data": "^1.1.2", - "@emoji-mart/react": "^1.1.1", - "@headlessui/react": "^1.7.19", - "@radix-ui/react-aspect-ratio": "^1.1.0", - "@radix-ui/react-checkbox": "^1.1.2", - "@radix-ui/react-dialog": "^1.1.2", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-popover": "^1.1.2", - "@radix-ui/react-radio-group": "^1.2.1", - "@radix-ui/react-scroll-area": "^1.2.0", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-tabs": "^1.1.1", - "@radix-ui/react-tooltip": "^1.1.3", - "@tanstack/react-table": "^8.13.0", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "emoji-mart": "^5.5.2", - "lottie-react": "^2.4.0", - "lottie-web": "^5.12.2", - "mermaid": "^10.9.3", - "react-confetti": "^6.1.0", - "react-dropdown-menu": "^0.0.2", - "react-katex": "^3.0.1", - "react-markdown": "^8.0.7", - "react-syntax-highlighter": "^15.6.1", - "rehype-katex": "^7.0.1", - "remark-directive": "^2.0.1", - "remark-gfm": "^3.0.1", - "remark-math": "^5.1.1", - "tailwind-merge": "^2.5.3", - "tailwind-scrollbar-hide": "^1.1.7", - "unist-util-visit": "^5.0.0" - }, - "peerDependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - } - }, - "node_modules/@dust-tt/types": { - "resolved": "../types", - "link": true - }, - "node_modules/@emoji-mart/data": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz", - "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==" - }, - "node_modules/@emoji-mart/react": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emoji-mart/react/-/react-1.1.1.tgz", - "integrity": "sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==", - "peerDependencies": { - "emoji-mart": "^5.2", - "react": "^16.8 || ^17 || ^18" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", - "dependencies": { - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", - "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" - }, - "node_modules/@headlessui/react": { - "version": "1.7.19", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz", - "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==", - "dependencies": { - "@tanstack/react-virtual": "^3.0.0-beta.60", - "client-only": "^0.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "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", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@next/env": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.20.tgz", - "integrity": "sha512-JfDpuOCB0UBKlEgEy/H6qcBSzHimn/YWjUHzKl1jMeUO+QVRdzmTTl8gFJaNO87c8DXmVKhFCtwxQ9acqB3+Pw==" - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.20.tgz", - "integrity": "sha512-WDfq7bmROa5cIlk6ZNonNdVhKmbCv38XteVFYsxea1vDJt3SnYGgxLGMTXQNfs5OkFvAhmfKKrwe7Y0Hs+rWOg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.20.tgz", - "integrity": "sha512-XIQlC+NAmJPfa2hruLvr1H1QJJeqOTDV+v7tl/jIdoFvqhoihvSNykLU/G6NMgoeo+e/H7p/VeWSOvMUHKtTIg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.20.tgz", - "integrity": "sha512-pnzBrHTPXIMm5QX3QC8XeMkpVuoAYOmyfsO4VlPn+0NrHraNuWjdhe+3xLq01xR++iCvX+uoeZmJDKcOxI201Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.20.tgz", - "integrity": "sha512-WhJJAFpi6yqmUx1momewSdcm/iRXFQS0HU2qlUGlGE/+98eu7JWLD5AAaP/tkK1mudS/rH2f9E3WCEF2iYDydQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.20.tgz", - "integrity": "sha512-ao5HCbw9+iG1Kxm8XsGa3X174Ahn17mSYBQlY6VGsdsYDAbz/ZP13wSLfvlYoIDn1Ger6uYA+yt/3Y9KTIupRg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.20.tgz", - "integrity": "sha512-CXm/kpnltKTT7945np6Td3w7shj/92TMRPyI/VvveFe8+YE+/YOJ5hyAWK5rpx711XO1jBCgXl211TWaxOtkaA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.20.tgz", - "integrity": "sha512-upJn2HGQgKNDbXVfIgmqT2BN8f3z/mX8ddoyi1I565FHbfowVK5pnMEwauvLvaJf4iijvuKq3kw/b6E9oIVRWA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.20.tgz", - "integrity": "sha512-igQW/JWciTGJwj3G1ipalD2V20Xfx3ywQy17IV0ciOUBbFhNfyU1DILWsTi32c8KmqgIDviUEulW/yPb2FF90w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.20.tgz", - "integrity": "sha512-AFmqeLW6LtxeFTuoB+MXFeM5fm5052i3MU6xD0WzJDOwku6SkZaxb1bxjBaRC8uNqTRTSPl0yMFtjNowIVI67w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.29.0.tgz", - "integrity": "sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "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==" - }, - "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==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "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==", - "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==" - }, - "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==" - }, - "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==" - }, - "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==" - }, - "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==" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", - "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", - "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==" - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz", - "integrity": "sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.1.tgz", - "integrity": "sha512-kNU4FIpcFMBLkOUcgeIteH06/8JLBcYY6Le1iKenDGCYNYFX3TQqCZjzkOsz37h7r94/99GTb7YhEr98ZBJibw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.3.tgz", - "integrity": "sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz", - "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", - "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", - "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz", - "integrity": "sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.3", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.3", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "^2.6.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", - "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz", - "integrity": "sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.4.tgz", - "integrity": "sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.4", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", - "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz", - "integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz", - "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.4.tgz", - "integrity": "sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-collection": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.3", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.1", - "@radix-ui/react-portal": "1.1.3", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-roving-focus": "1.1.1", - "@radix-ui/react-slot": "1.1.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "^2.6.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.4.tgz", - "integrity": "sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.3", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.1", - "@radix-ui/react-portal": "1.1.3", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "^2.6.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.1.tgz", - "integrity": "sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz", - "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", - "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", - "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", - "dependencies": { - "@radix-ui/react-slot": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.2.tgz", - "integrity": "sha512-E0MLLGfOP0l8P/NxgVzfXJ8w3Ch8cdO6UDzJfDChu4EJDy+/WdO5LqpdY8PYnCErkmZH3gZhDL1K7kQ41fAHuQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-roving-focus": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz", - "integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-collection": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.2.tgz", - "integrity": "sha512-EFI1N/S3YxZEW/lJ/H1jY3njlvTd8tBmgKEn4GHi51+aMm94i6NmAJstsm5cu3yJwYqYc93gpCPm21FeAbFk6g==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.1.tgz", - "integrity": "sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", - "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz", - "integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-roving-focus": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.6.tgz", - "integrity": "sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.3", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.1", - "@radix-ui/react-portal": "1.1.3", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", - "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", - "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", - "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", - "dependencies": { - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz", - "integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" - }, - "node_modules/@scarf/scarf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", - "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", - "hasInstallScript": true - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@tanstack/react-table": { - "version": "8.20.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.6.tgz", - "integrity": "sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==", - "dependencies": { - "@tanstack/table-core": "8.20.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/@tanstack/react-virtual": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz", - "integrity": "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==", - "dependencies": { - "@tanstack/virtual-core": "3.11.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "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/@tanstack/table-core": { - "version": "8.20.5", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", - "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/virtual-core": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz", - "integrity": "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==" - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" - }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/node": { - "version": "20.17.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", - "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" - }, - "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.3.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", - "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "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==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/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==" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "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/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001689", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", - "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-randomuuid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-randomuuid/-/crypto-randomuuid-1.0.0.tgz", - "integrity": "sha512-/RC5F4l1SCqD/jazwUF6+t34Cd8zTSAGZ7rvvZu1whZUhD2a5MOGKjSGowoGcpj/cbVZk1ZODIooJEQQq3nNAA==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "peer": true - }, - "node_modules/cytoscape": { - "version": "3.30.4", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.4.tgz", - "integrity": "sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "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-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "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", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "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/dagre-d3-es": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", - "dependencies": { - "d3": "^7.8.2", - "lodash-es": "^4.17.21" - } - }, - "node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "engines": { - "node": "*" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" - }, - "node_modules/dc-polyfill": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/dc-polyfill/-/dc-polyfill-0.1.6.tgz", - "integrity": "sha512-UV33cugmCC49a5uWAApM+6Ev9ZdvIUMTrtCO9fj96TPGOQiea54oeO3tiEVdVeo3J9N2UdJEmbS4zOkkEA35uQ==", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/dd-trace": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-5.28.0.tgz", - "integrity": "sha512-jyF7JLx2Yw16MHcD97sYKXbVd7ZT1hKJ5/NkRRGeG9cgen5+d/ilIvfzgh2qRjeow+9a5ligoZoUOYJ3nYn9hw==", - "hasInstallScript": true, - "dependencies": { - "@datadog/libdatadog": "^0.2.2", - "@datadog/native-appsec": "8.3.0", - "@datadog/native-iast-rewriter": "2.5.0", - "@datadog/native-iast-taint-tracking": "3.2.0", - "@datadog/native-metrics": "^3.0.1", - "@datadog/pprof": "5.4.1", - "@datadog/sketches-js": "^2.1.0", - "@isaacs/ttlcache": "^1.4.1", - "@opentelemetry/api": ">=1.0.0 <1.9.0", - "@opentelemetry/core": "^1.14.0", - "crypto-randomuuid": "^1.0.0", - "dc-polyfill": "^0.1.4", - "ignore": "^5.2.4", - "import-in-the-middle": "1.11.2", - "int64-buffer": "^0.1.9", - "istanbul-lib-coverage": "3.2.0", - "jest-docblock": "^29.7.0", - "koalas": "^1.0.2", - "limiter": "1.1.5", - "lodash.sortby": "^4.7.0", - "lru-cache": "^7.14.0", - "module-details-from-path": "^1.0.3", - "msgpack-lite": "^0.1.26", - "opentracing": ">=0.12.1", - "path-to-regexp": "^0.1.10", - "pprof-format": "^2.1.0", - "protobufjs": "^7.2.5", - "retry": "^0.13.1", - "rfdc": "^1.3.1", - "semver": "^7.5.4", - "shell-quote": "^1.8.1", - "tlhunter-sorted-set": "^0.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/dd-trace/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dompurify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", - "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" - }, - "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==", - "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", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "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==" - }, - "node_modules/elkjs": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", - "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==" - }, - "node_modules/emoji-mart": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", - "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=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==", - "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==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "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==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-lite": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.3.tgz", - "integrity": "sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==" - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "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.13.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/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/fast-copy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", - "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "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.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-redact": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", - "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "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==", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "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/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "2.16.9", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.9.tgz", - "integrity": "sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==", - "peer": true - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "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, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "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==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "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, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-dom": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", - "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", - "dependencies": { - "@types/hast": "^3.0.0", - "hastscript": "^9.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-dom/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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-from-dom/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==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-dom/node_modules/hastscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", - "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", - "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-dom": "^5.0.0", - "hast-util-from-html": "^2.0.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-from-html/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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-from-html/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/hast-util-from-html/node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", - "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5/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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-from-parse5/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/hast-util-from-parse5/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==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5/node_modules/hastscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", - "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5/node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element/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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text/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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-to-text/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript/node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/hastscript/node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/hastscript/node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/help-me": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "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==" - }, - "node_modules/hot-shots": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-10.2.1.tgz", - "integrity": "sha512-tmjcyZkG/qADhcdC7UjAp8D7v7W2DOYFgaZ48fYMuayMQmVVUg8fntKmrjes/b40ef6yZ+qt1lB8kuEDfLC4zw==", - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "unix-dgram": "2.x" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-in-the-middle": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz", - "integrity": "sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/int64-buffer": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", - "integrity": "sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/io-ts": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.22.tgz", - "integrity": "sha512-FHCCztTkHoV9mdBsHpocLpdTAfh956ZQcIkWQxxS0U5HT53vtrcuYdQneEJKH6xILaLNzXVl2Cvwtoy8XNN0AA==", - "peerDependencies": { - "fp-ts": "^2.5.0" - } - }, - "node_modules/io-ts-reporters": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/io-ts-reporters/-/io-ts-reporters-2.0.1.tgz", - "integrity": "sha512-RVpLstYBsmTGgCW9wJ5KVyN/eRnRUDp87Flt4D1O3aJ7oAnd8csq8aXuu7ZeNK8qEDKmjUl9oUuzfwikaNAMKQ==", - "dependencies": { - "@scarf/scarf": "^1.1.1" - }, - "peerDependencies": { - "fp-ts": "^2.10.5", - "io-ts": "^2.2.16" - } - }, - "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==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-core-module": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", - "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "engines": { - "node": ">=10" - } - }, - "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==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/katex": { - "version": "0.16.15", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.15.tgz", - "integrity": "sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/koalas": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", - "integrity": "sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "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==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lottie-react": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.0.tgz", - "integrity": "sha512-pDJGj+AQlnlyHvOHFK7vLdsDcvbuqvwPZdMlJ360wrzGFurXeKPr8SiRCjLf3LrNYKANQtSsh5dz9UYQHuqx4w==", - "dependencies": { - "lottie-web": "^5.10.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/lottie-web": { - "version": "5.12.2", - "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz", - "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==" - }, - "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==", - "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/math-intrinsics": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", - "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "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-definitions/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "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/mdast-util-definitions/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-directive": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-2.2.4.tgz", - "integrity": "sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-from-markdown": "^1.3.0", - "mdast-util-to-markdown": "^1.5.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^5.1.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-directive/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==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-directive/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==", - "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/mdast-util-directive/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "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", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "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", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "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", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "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", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "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", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "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", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "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", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "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-math": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", - "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "longest-streak": "^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", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "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", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "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-hast/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "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/mdast-util-to-hast/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "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-markdown/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "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/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "10.9.3", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.3.tgz", - "integrity": "sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==", - "dependencies": { - "@braintree/sanitize-url": "^6.0.1", - "@types/d3-scale": "^4.0.3", - "@types/d3-scale-chromatic": "^3.0.0", - "cytoscape": "^3.28.1", - "cytoscape-cose-bilkent": "^4.1.0", - "d3": "^7.4.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.10", - "dayjs": "^1.11.7", - "dompurify": "^3.0.5 <3.1.7", - "elkjs": "^0.9.0", - "katex": "^0.16.9", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "mdast-util-from-markdown": "^1.3.0", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.3", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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-directive": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-2.2.1.tgz", - "integrity": "sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "parse-entities": "^4.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/micromark-extension-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/micromark-extension-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/micromark-extension-directive/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==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/micromark-extension-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/micromark-extension-directive/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/micromark-extension-directive/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==", - "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/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", - "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", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", - "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", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "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", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", - "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", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "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", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", - "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", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", - "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-math": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz", - "integrity": "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==", - "dependencies": { - "@types/katex": "^0.16.0", - "katex": "^0.16.0", - "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", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "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", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/micromark/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/msgpack-lite": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", - "integrity": "sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==", - "dependencies": { - "event-lite": "^0.1.1", - "ieee754": "^1.1.8", - "int64-buffer": "^0.1.9", - "isarray": "^1.0.0" - }, - "bin": { - "msgpack": "bin/msgpack" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", - "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.20.tgz", - "integrity": "sha512-yPvIiWsiyVYqJlSQxwmzMIReXn5HxFNq4+tlVQ812N1FbvhmE+fDpIAD7bcS2mGYQwPJ5vAsQouyme2eKsxaug==", - "dependencies": { - "@next/env": "14.2.20", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.20", - "@next/swc-darwin-x64": "14.2.20", - "@next/swc-linux-arm64-gnu": "14.2.20", - "@next/swc-linux-arm64-musl": "14.2.20", - "@next/swc-linux-x64-gnu": "14.2.20", - "@next/swc-linux-x64-musl": "14.2.20", - "@next/swc-win32-arm64-msvc": "14.2.20", - "@next/swc-win32-ia32-msvc": "14.2.20", - "@next/swc-win32-x64-msvc": "14.2.20" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, - "node_modules/node-gyp-build": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", - "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/non-layered-tidy-tree-layout": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "engines": { - "node": ">=14.0.0" - } - }, - "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==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/opentracing": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", - "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "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-entities/node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "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==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "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-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pino": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", - "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.2.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^3.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.6.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/pino-pretty": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.3.1.tgz", - "integrity": "sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==", - "dependencies": { - "colorette": "^2.0.7", - "dateformat": "^4.6.3", - "fast-copy": "^3.0.0", - "fast-safe-stringify": "^2.1.1", - "help-me": "^5.0.0", - "joycon": "^3.1.1", - "minimist": "^1.2.6", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.0.0", - "pump": "^3.0.0", - "readable-stream": "^4.0.0", - "secure-json-parse": "^2.4.0", - "sonic-boom": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "pino-pretty": "bin.js" - } - }, - "node_modules/pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/pprof-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pprof-format/-/pprof-format-2.1.0.tgz", - "integrity": "sha512-0+G5bHH0RNr8E5hoZo/zJYsL92MhkZjwrHp3O2IxmY8RJL9ooKeuZ8Tm0ZNBw5sGZ9TiM71sthTjWoR2Vf5/xw==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "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==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "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", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "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/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-confetti": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", - "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==", - "dependencies": { - "tween-functions": "^1.2.0" - }, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.1 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dropdown-menu": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/react-dropdown-menu/-/react-dropdown-menu-0.0.2.tgz", - "integrity": "sha512-MMUqzm0ICLgNPCq2mmvIKPLCvWzSk9pxVKRH2wGNBtW9/Agnc+jbPQ9RQehZsqmy6IKcW0mYU8TopZPCbFKr6g==" - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-katex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-katex/-/react-katex-3.0.1.tgz", - "integrity": "sha512-wIUW1fU5dHlkKvq4POfDkHruQsYp3fM8xNb/jnc8dnQ+nNCnaj0sx5pw7E6UyuEdLRyFKK0HZjmXBo+AtXXy0A==", - "dependencies": { - "katex": "^0.16.0" - }, - "peerDependencies": { - "prop-types": "^15.8.1", - "react": ">=15.3.2 <=18" - } - }, - "node_modules/react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", - "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", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/react-markdown/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "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/react-markdown/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.1.tgz", - "integrity": "sha512-jWEvWQidZ/C/FnFlUIB1mDLpY3r7uEb22WZ3uVeKj520caKDiaBsNDEB9J1gHJgpiLo+eTdPl2MVi0JitFTiFg==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-syntax-highlighter": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", - "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.4.1", - "highlightjs-vue": "^1.0.0", - "lowlight": "^1.17.0", - "prismjs": "^1.27.0", - "refractor": "^3.6.0" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "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/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", - "dependencies": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/rehype-katex": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", - "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/katex": "^0.16.0", - "hast-util-from-html-isomorphic": "^2.0.0", - "hast-util-to-text": "^4.0.0", - "katex": "^0.16.0", - "unist-util-visit-parents": "^6.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/rehype-katex/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/rehype-katex/node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-directive": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-2.0.1.tgz", - "integrity": "sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-directive": "^2.0.0", - "micromark-extension-directive": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "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-math": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz", - "integrity": "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-math": "^2.0.0", - "micromark-extension-math": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "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", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "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/resolve": { - "version": "1.22.9", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", - "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "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/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "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/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "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==", - "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==", - "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==", - "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": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sonic-boom": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", - "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.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==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "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/string-width-cjs": { - "name": "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==", - "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/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==" - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-entities/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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/stylis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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, - "dependencies": { - "has-flag": "^4.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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.5.tgz", - "integrity": "sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwind-scrollbar-hide": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-1.1.7.tgz", - "integrity": "sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==" - }, - "node_modules/tailwindcss": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", - "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/thread-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", - "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/tlhunter-sorted-set": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz", - "integrity": "sha512-eGYW4bjf1DtrHzUYxYfAcSytpOkA44zsr7G2n3PV7yOUR23vmkGe3LL4R+1jL9OsXtbsFOwe8XtbCrabeaEFnw==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/tsx": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", - "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", - "dev": true, - "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tween-functions": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", - "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "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-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/unist-util-find-after/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/unist-util-visit/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unix-dgram": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.6.tgz", - "integrity": "sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.16.0" - }, - "engines": { - "node": ">=0.10.48" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "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==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "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/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "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-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/vfile-location/node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/vfile-message/node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-worker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", - "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "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/wrap-ansi-cjs": { - "name": "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==", - "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/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==" - }, - "node_modules/wrap-ansi-cjs/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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/resolver/src/components/Layout.tsx b/resolver/src/components/Layout.tsx deleted file mode 100644 index 1f7f3bc4db3f..000000000000 --- a/resolver/src/components/Layout.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { SparkleContext } from "@dust-tt/sparkle"; -import type { UrlObject } from "url"; -import Link from "next/link"; -import React, { useMemo } from "react"; - -function NextLinkWrapper({ - href, - className, - children, - ariaCurrent, - ariaLabel, - onClick, - replace = false, - shallow = false, - target = "_self", - rel, -}: { - ariaCurrent?: - | boolean - | "time" - | "false" - | "true" - | "page" - | "step" - | "location" - | "date"; - ariaLabel?: string; - children: React.ReactNode; - className?: string; - href: string | UrlObject; - // @ts-ignore - onClick?: (event: MouseEvent) => void; - rel?: string; - replace?: boolean; - shallow?: boolean; - target?: string; -}) { - return ( - - {children} - - ); -} - -export default function AppLayout({ children }: { children: React.ReactNode }) { - const contextValue = useMemo( - () => ({ - components: { link: NextLinkWrapper }, - }), - [], - ); - - return ( - - {children} - - ); -} diff --git a/resolver/src/lib/config.ts b/resolver/src/lib/config.ts deleted file mode 100644 index 94f49695fb3b..000000000000 --- a/resolver/src/lib/config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { EnvironmentConfig } from "@dust-tt/types"; - -const CLUSTER_REGIONS = ["europe-west1", "us-central1"] as const; -export type ClusterRegionType = (typeof CLUSTER_REGIONS)[number]; - -export function isValidRegion(region: string): region is ClusterRegionType { - return ["europe-west1", "us-central1"].includes(region as ClusterRegionType); -} - -const clusterDomain = { - "europe-west1": "https://eu.dust.tt", - "us-central1": "https://dust.tt", -}; - -export const config = { - getLookupApiSecret: (): string => { - return EnvironmentConfig.getEnvVariable("REGION_RESOLVER_SECRET"); - }, - getRegionDomains: (): Record => { - return clusterDomain; - }, - getRegionDomain: (region: ClusterRegionType) => { - return clusterDomain[region]; - }, -}; diff --git a/resolver/src/lib/lookup_api.ts b/resolver/src/lib/lookup_api.ts deleted file mode 100644 index d00ae6aaa11c..000000000000 --- a/resolver/src/lib/lookup_api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ClusterRegionType } from "@app/src/lib/config"; - -type Resource = "user"; - -type ExternalUser = { - email: string; - email_verified: boolean; - sub: string; -}; - -export type UserLookupResponse = { - user: { - email: string; - } | null; -}; - -export class RegionLookupClient { - private readonly secret: string; - private readonly endpoints: Record; - - constructor(secret: string, endpoints: Record) { - this.secret = secret; - this.endpoints = endpoints; - } - - async lookupUser( - user: ExternalUser, - ): Promise> { - return this.lookup("user", { user }); - } - - private async lookup( - resource: Resource, - body: object, - ): Promise> { - const results = await Promise.all( - Object.entries(this.endpoints).map(async ([region, url]) => { - const response = await fetch(`${url}/api/lookup/${resource}`, { - method: "POST", - headers: this.getDefaultHeaders(), - body: JSON.stringify(body), - }); - - const data = await response.json(); - if ("error" in data) { - throw new Error(`${region} lookup failed: ${data.error.message}`); - } - - return [region, data] as const; - }), - ); - - return Object.fromEntries(results) as Record; - } - - getDefaultHeaders() { - return { - "Content-Type": "application/json", - Authorization: `Bearer ${this.secret}`, - }; - } -} diff --git a/resolver/src/pages/_app.tsx b/resolver/src/pages/_app.tsx deleted file mode 100644 index e09a6d2d0aa1..000000000000 --- a/resolver/src/pages/_app.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import type { NextPage } from "next"; -import type { AppProps } from "next/app"; -import AppLayout from "@app/src/components/Layout"; -import React from "react"; - -export type NextPageWithLayout

= NextPage & { - getLayout?: (page: React.ReactElement, pageProps: P) => React.ReactNode; -}; - -export type AppPropsWithLayout = AppProps & { - Component: NextPageWithLayout; -}; - -export default function App({ Component, pageProps }: AppPropsWithLayout) { - if (Component.getLayout) { - return Component.getLayout(, pageProps); - } - return ( - - - - ); -} diff --git a/resolver/src/pages/index.tsx b/resolver/src/pages/index.tsx deleted file mode 100644 index f945532db906..000000000000 --- a/resolver/src/pages/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import type { ReactElement } from "react"; -import { Page } from "@dust-tt/sparkle"; -import { NextPageWithLayout } from "./_app"; -import AppLayout from "@app/src/components/Layout"; - -const Home: NextPageWithLayout = () => { - return ( - - - Service is up and running - - ); -}; - -Home.getLayout = (page: ReactElement) => { - return {page}; -}; - -export default Home; diff --git a/resolver/tsconfig.json b/resolver/tsconfig.json deleted file mode 100644 index c84c361ed42f..000000000000 --- a/resolver/tsconfig.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@app/*": ["./*"] - } - }, - "include": [ - "global.d.ts", - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - "**/*.jsx", - "**/*.js", - "./.eslintrc.js" - ], - "exclude": ["node_modules"] -} From 872ea87060eb2687e5fbae3aac4d42e967031efc Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Fri, 20 Dec 2024 10:28:48 +0100 Subject: [PATCH 34/78] [connectors] Add cli command to set permissions in connectors (#9564) --- connectors/src/lib/cli.ts | 26 ++++++++++++++++++++++++++ types/src/connectors/admin/cli.ts | 1 + 2 files changed, 27 insertions(+) diff --git a/connectors/src/lib/cli.ts b/connectors/src/lib/cli.ts index 49b71f8ac833..40a226b2cd10 100644 --- a/connectors/src/lib/cli.ts +++ b/connectors/src/lib/cli.ts @@ -3,6 +3,7 @@ import type { AdminSuccessResponseType, BatchAllResponseType, BatchCommandType, + ConnectorPermission, ConnectorsCommandType, GetParentsResponseType, Result, @@ -196,6 +197,31 @@ export const connectors = async ({ return { parents: parents.value }; } + case "set-permission": { + const { permissionKey, permissionValue } = args; + if (!permissionKey) { + throw new Error("Missing --permissionKey argument"); + } + if (!permissionValue) { + throw new Error("Missing --permissionValue argument"); + } + if (!["read", "write", "read_write", "none"].includes(permissionValue)) { + throw new Error("Invalid permissionValue argument"); + } + + const setPermissionsRes = await manager.setPermissions({ + permissions: { + [permissionKey as string]: permissionValue as ConnectorPermission, + }, + }); + + if (setPermissionsRes.isErr()) { + throw new Error(`Cannot set permissions: ${setPermissionsRes.error}`); + } + + return { success: true }; + } + default: throw new Error(`Unknown workspace command: ${command}`); } diff --git a/types/src/connectors/admin/cli.ts b/types/src/connectors/admin/cli.ts index 8484f6b17094..e47ac80db8b0 100644 --- a/types/src/connectors/admin/cli.ts +++ b/types/src/connectors/admin/cli.ts @@ -14,6 +14,7 @@ export const ConnectorsCommandSchema = t.type({ t.literal("set-error"), t.literal("restart"), t.literal("get-parents"), + t.literal("set-permission"), ]), args: t.record( t.string, From 0cf65301e03a3b8e8ff3ffc8fd5c1d12887e44bb Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:46:56 +0100 Subject: [PATCH 35/78] github - add new workflows with the folders upsert (#9562) * add new workflows that are duplicates of the old ones with the new upsert activities * fix backfill script * rename workflows with v2 * :memo: --- .../20241219_backfill_github_folders.ts | 2 +- .../src/connectors/github/temporal/client.ts | 10 +- .../connectors/github/temporal/workflows.ts | 363 ++++++++++++++++++ 3 files changed, 369 insertions(+), 6 deletions(-) diff --git a/connectors/migrations/20241219_backfill_github_folders.ts b/connectors/migrations/20241219_backfill_github_folders.ts index 403502e7eba5..a8ee24170d11 100644 --- a/connectors/migrations/20241219_backfill_github_folders.ts +++ b/connectors/migrations/20241219_backfill_github_folders.ts @@ -139,7 +139,7 @@ async function upsertFoldersForConnector( } } makeScript({}, async ({ execute }, logger) => { - const connectors = await ConnectorResource.listByType("zendesk", {}); + const connectors = await ConnectorResource.listByType("github", {}); for (const connector of connectors) { logger.info(`Upserting folders for connector ${connector.id}`); diff --git a/connectors/src/connectors/github/temporal/client.ts b/connectors/src/connectors/github/temporal/client.ts index 3ad80d072a9e..78a0b26441f6 100644 --- a/connectors/src/connectors/github/temporal/client.ts +++ b/connectors/src/connectors/github/temporal/client.ts @@ -23,11 +23,11 @@ import { githubCodeSyncWorkflow, githubDiscussionGarbageCollectWorkflow, githubDiscussionSyncWorkflow, - githubFullSyncWorkflow, + githubFullSyncWorkflowV2, githubIssueGarbageCollectWorkflow, githubIssueSyncWorkflow, githubRepoGarbageCollectWorkflow, - githubReposSyncWorkflow, + githubReposSyncWorkflowV2, } from "@connectors/connectors/github/temporal/workflows"; import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; import { getTemporalClient } from "@connectors/lib/temporal"; @@ -68,7 +68,7 @@ export async function launchGithubFullSyncWorkflow({ return; } - await client.workflow.start(githubFullSyncWorkflow, { + await client.workflow.start(githubFullSyncWorkflowV2, { args: [dataSourceConfig, connectorId, syncCodeOnly, forceCodeResync], taskQueue: QUEUE_NAME, workflowId: getFullSyncWorkflowId(connectorId), @@ -87,7 +87,7 @@ export async function getGithubFullSyncWorkflow(connectorId: ModelId): Promise<{ } | null> { const client = await getTemporalClient(); - const handle: WorkflowHandle = + const handle: WorkflowHandle = client.workflow.getHandle(getFullSyncWorkflowId(connectorId)); try { @@ -116,7 +116,7 @@ export async function launchGithubReposSyncWorkflow( } const dataSourceConfig = dataSourceConfigFromConnector(connector); - await client.workflow.start(githubReposSyncWorkflow, { + await client.workflow.start(githubReposSyncWorkflowV2, { args: [dataSourceConfig, connectorId, orgLogin, repos], taskQueue: QUEUE_NAME, workflowId: getReposSyncWorkflowId(connectorId), diff --git a/connectors/src/connectors/github/temporal/workflows.ts b/connectors/src/connectors/github/temporal/workflows.ts index 5e79a411b0b4..1c839de56a83 100644 --- a/connectors/src/connectors/github/temporal/workflows.ts +++ b/connectors/src/connectors/github/temporal/workflows.ts @@ -29,6 +29,9 @@ const { githubGetRepoDiscussionsResultPageActivity, githubIssueGarbageCollectActivity, githubDiscussionGarbageCollectActivity, + githubUpsertDiscussionsFolderActivity, + githubUpsertIssuesFolderActivity, + githubUpsertRepositoryFolderActivity, } = proxyActivities({ startToCloseTimeout: "5 minute", }); @@ -58,6 +61,10 @@ const { githubCodeSyncActivity } = proxyActivities({ const MAX_CONCURRENT_REPO_SYNC_WORKFLOWS = 3; const MAX_CONCURRENT_ISSUE_SYNC_ACTIVITIES_PER_WORKFLOW = 8; +/** + * Duplicate of the one belows apart from the child workflow (githubSyncRepoWorkflow vs githubRepoSyncWorkflow). + * Kept for backwards compatibility (to avoid non-deterministic errors). + */ export async function githubFullSyncWorkflow( dataSourceConfig: DataSourceConfig, connectorId: ModelId, @@ -118,6 +125,74 @@ export async function githubFullSyncWorkflow( await githubSaveSuccessSyncActivity(dataSourceConfig); } +/** + * This workflow is used to fetch and sync all the repositories of a GitHub connector. + * It's called v2 because we had to add it when there was already a workflow without the v2 to avoid non-deterministic errors. + */ +export async function githubFullSyncWorkflowV2( + dataSourceConfig: DataSourceConfig, + connectorId: ModelId, + // Used to re-trigger a code-only full-sync after code syncing is enabled/disabled. + syncCodeOnly: boolean, + forceCodeResync = false +) { + await githubSaveStartSyncActivity(dataSourceConfig); + + const queue = new PQueue({ concurrency: MAX_CONCURRENT_REPO_SYNC_WORKFLOWS }); + const promises: Promise[] = []; + + let pageNumber = 1; // 1-indexed + + for (;;) { + const resultsPage = await githubGetReposResultPageActivity( + connectorId, + pageNumber, + { syncCodeOnly: syncCodeOnly.toString() } + ); + if (!resultsPage.length) { + break; + } + pageNumber += 1; + + for (const repo of resultsPage) { + const fullSyncWorkflowId = getFullSyncWorkflowId(connectorId); + const childWorkflowId = `${fullSyncWorkflowId}-repo-${repo.id}-syncCodeOnly-${syncCodeOnly}`; + promises.push( + queue.add(() => + executeChild(githubRepoSyncWorkflowV2, { + workflowId: childWorkflowId, + searchAttributes: { + connectorId: [connectorId], + }, + args: [ + { + dataSourceConfig, + connectorId, + repoName: repo.name, + repoId: repo.id, + repoLogin: repo.login, + syncCodeOnly, + isFullSync: true, + forceCodeResync, + }, + ], + parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_TERMINATE, + memo: workflowInfo().memo, + }) + ) + ); + } + } + + await Promise.all(promises); + + await githubSaveSuccessSyncActivity(dataSourceConfig); +} + +/** + * Duplicate of the one belows apart from the child workflow (githubSyncRepoWorkflow vs githubRepoSyncWorkflow). + * Kept for backwards compatibility (to avoid non-deterministic errors). + */ export async function githubReposSyncWorkflow( dataSourceConfig: DataSourceConfig, connectorId: ModelId, @@ -159,6 +234,55 @@ export async function githubReposSyncWorkflow( await githubSaveSuccessSyncActivity(dataSourceConfig); } +/** + * This workflow is used to sync the given repositories of a GitHub connector. + * It's called v2 because we had to add it when there was already a workflow without the v2 to avoid non-deterministic errors. + */ +export async function githubReposSyncWorkflowV2( + dataSourceConfig: DataSourceConfig, + connectorId: ModelId, + orgLogin: string, + repos: { name: string; id: number }[] +) { + const queue = new PQueue({ concurrency: MAX_CONCURRENT_REPO_SYNC_WORKFLOWS }); + const promises: Promise[] = []; + + for (const repo of repos) { + const reposSyncWorkflowId = getReposSyncWorkflowId(connectorId); + const childWorkflowId = `${reposSyncWorkflowId}-repo-${repo.id}`; + promises.push( + queue.add(() => + executeChild(githubRepoSyncWorkflowV2, { + workflowId: childWorkflowId, + searchAttributes: { + connectorId: [connectorId], + }, + args: [ + { + dataSourceConfig, + connectorId, + repoName: repo.name, + repoId: repo.id, + repoLogin: orgLogin, + syncCodeOnly: false, + isFullSync: false, + }, + ], + parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_TERMINATE, + memo: workflowInfo().memo, + }) + ) + ); + } + + await Promise.all(promises); + await githubSaveSuccessSyncActivity(dataSourceConfig); +} + +/** + * Duplicate of the one belows apart from the missing activity githubUpsertIssuesFolderActivity. + * Kept for backwards compatibility (to avoid non-deterministic errors). + */ export async function githubRepoIssuesSyncWorkflow({ dataSourceConfig, connectorId, @@ -213,6 +337,71 @@ export async function githubRepoIssuesSyncWorkflow({ return true; } +/** + * This workflow is used to sync all the issues of a GitHub connector. + * It's called v2 because we had to add it when there was already a workflow without the v2 to avoid non-deterministic errors. + */ +export async function githubRepoIssuesSyncWorkflowV2({ + dataSourceConfig, + connectorId, + repoName, + repoId, + repoLogin, + pageNumber, +}: { + dataSourceConfig: DataSourceConfig; + connectorId: ModelId; + repoName: string; + repoId: number; + repoLogin: string; + pageNumber: number; +}): Promise { + // upserting the folder with all the issues + await githubUpsertIssuesFolderActivity({ connectorId, repoId }); + + const queue = new PQueue({ + concurrency: MAX_CONCURRENT_ISSUE_SYNC_ACTIVITIES_PER_WORKFLOW, + }); + const promises: Promise[] = []; + + const resultsPage = await githubGetRepoIssuesResultPageActivity( + connectorId, + repoName, + repoLogin, + pageNumber, + { repoId } + ); + + if (!resultsPage.length) { + return false; + } + + for (const issueNumber of resultsPage) { + promises.push( + queue.add(() => + githubUpsertIssueActivity( + connectorId, + repoName, + repoId, + repoLogin, + issueNumber, + dataSourceConfig, + {}, + true // isBatchSync + ) + ) + ); + } + + await Promise.all(promises); + + return true; +} + +/** + * Duplicate of the one belows apart from the missing activity githubUpsertDiscussionsFolderActivity. + * Kept for backwards compatibility (to avoid non-deterministic errors). + */ export async function githubRepoDiscussionsSyncWorkflow({ dataSourceConfig, connectorId, @@ -264,6 +453,69 @@ export async function githubRepoDiscussionsSyncWorkflow({ return cursor; } +/** + * This workflow is used to sync all the discussions of a GitHub connector. + * It's called v2 because we had to add it when there was already a workflow without the v2 to avoid non-deterministic errors. + */ +export async function githubRepoDiscussionsSyncWorkflowV2({ + dataSourceConfig, + connectorId, + repoName, + repoId, + repoLogin, + nextCursor, +}: { + dataSourceConfig: DataSourceConfig; + connectorId: ModelId; + repoName: string; + repoId: number; + repoLogin: string; + nextCursor: string | null; +}): Promise { + // upserting the folder with all the discussions + await githubUpsertDiscussionsFolderActivity({ connectorId, repoId }); + + const queue = new PQueue({ + concurrency: MAX_CONCURRENT_ISSUE_SYNC_ACTIVITIES_PER_WORKFLOW, + }); + const promises: Promise[] = []; + + const { cursor, discussionNumbers } = + await githubGetRepoDiscussionsResultPageActivity( + connectorId, + repoName, + repoLogin, + nextCursor, + { repoId } + ); + + for (const discussionNumber of discussionNumbers) { + promises.push( + queue.add(() => + githubUpsertDiscussionActivity( + connectorId, + repoName, + repoId, + repoLogin, + discussionNumber, + dataSourceConfig, + {}, + true // isBatchSync + ) + ) + ); + } + + await Promise.all(promises); + + return cursor; +} + +/** + * Duplicate of the one belows apart from the missing activity githubUpsertRepositoryFolderActivity and the fact + * that this one calls the old workflows githubRepoIssuesSyncWorkflow and githubRepoDiscussionsSyncWorkflow. + * Kept for backwards compatibility (to avoid non-deterministic errors). + */ export async function githubRepoSyncWorkflow({ dataSourceConfig, connectorId, @@ -365,6 +617,117 @@ export async function githubRepoSyncWorkflow({ }); } +/** + * This workflow is used to sync all the issues, discussions and code of a GitHub connector. + * It's called v2 because we had to add it when there was already a workflow without the v2 to avoid non-deterministic errors. + */ +export async function githubRepoSyncWorkflowV2({ + dataSourceConfig, + connectorId, + repoName, + repoId, + repoLogin, + syncCodeOnly, + isFullSync, + forceCodeResync = false, +}: { + dataSourceConfig: DataSourceConfig; + connectorId: ModelId; + repoName: string; + repoId: number; + repoLogin: string; + syncCodeOnly: boolean; + isFullSync: boolean; + forceCodeResync?: boolean; +}) { + // upserting the root folder for the repository + await githubUpsertRepositoryFolderActivity({ connectorId, repoId, repoName }); + + if (!syncCodeOnly) { + let pageNumber = 1; // 1-indexed + for (;;) { + const childWorkflowId = `${ + isFullSync + ? getFullSyncWorkflowId(connectorId) + : getReposSyncWorkflowId(connectorId) + }-repo-${repoId}-issues-page-${pageNumber}`; + + const shouldContinue = await executeChild( + githubRepoIssuesSyncWorkflowV2, + { + workflowId: childWorkflowId, + searchAttributes: { + connectorId: [connectorId], + }, + args: [ + { + dataSourceConfig, + connectorId, + repoName, + repoId, + repoLogin, + pageNumber, + }, + ], + parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_TERMINATE, + memo: workflowInfo().memo, + } + ); + + if (!shouldContinue) { + break; + } + pageNumber += 1; + } + + let nextCursor: string | null = null; + let cursorIteration = 0; + for (;;) { + const childWorkflowId = `${ + isFullSync + ? getFullSyncWorkflowId(connectorId) + : getReposSyncWorkflowId(connectorId) + }-repo-${repoId}-issues-page-${cursorIteration}`; + + nextCursor = await executeChild(githubRepoDiscussionsSyncWorkflowV2, { + workflowId: childWorkflowId, + searchAttributes: { + connectorId: [connectorId], + }, + args: [ + { + dataSourceConfig, + connectorId, + repoName, + repoId, + repoLogin, + nextCursor, + }, + ], + parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_TERMINATE, + memo: workflowInfo().memo, + }); + + if (!nextCursor) { + break; + } + cursorIteration += 1; + } + } + + // Start code syncing activity. + await githubCodeSyncActivity({ + dataSourceConfig, + connectorId, + repoLogin, + repoName, + repoId, + loggerArgs: { syncCodeOnly: syncCodeOnly ? "true" : "false" }, + isBatchSync: true, + forceResync: forceCodeResync, + }); +} + export async function githubCodeSyncWorkflow( dataSourceConfig: DataSourceConfig, connectorId: ModelId, From 3a882a9c24ff3631a2e5736ed7fe7ecc3bf85370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Fri, 20 Dec 2024 12:02:47 +0100 Subject: [PATCH 36/78] User Menu: use router.push over href (#9568) * User Menu: use navigate over href * Fixed logout link --------- Co-authored-by: Thomas Draier --- front/components/UserMenu.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/front/components/UserMenu.tsx b/front/components/UserMenu.tsx index fabbc3dd187f..1cee8476854f 100644 --- a/front/components/UserMenu.tsx +++ b/front/components/UserMenu.tsx @@ -90,14 +90,20 @@ export function UserMenu({ { + void router.push( + `/w/${owner.sId}/assistant/labs/transcripts` + ); + }} /> )} {featureFlags.includes("labs_trackers") && ( { + void router.push(`/w/${owner.sId}/assistant/labs/trackers`); + }} /> )} @@ -147,7 +153,9 @@ export function UserMenu({ { + void router.push("/api/auth/logout"); + }} icon={LogoutIcon} label="Sign out" /> From 656955e28b09913a1224a018fbbab3f58047f7b8 Mon Sep 17 00:00:00 2001 From: Lucas Massemin Date: Fri, 20 Dec 2024 12:16:14 +0100 Subject: [PATCH 37/78] toggle save display when file changes (#9569) Co-authored-by: Lucas --- front/components/data_source/TableUploadOrEditModal.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/front/components/data_source/TableUploadOrEditModal.tsx b/front/components/data_source/TableUploadOrEditModal.tsx index d3397c983acd..1a0b1d34ba8a 100644 --- a/front/components/data_source/TableUploadOrEditModal.tsx +++ b/front/components/data_source/TableUploadOrEditModal.tsx @@ -364,7 +364,8 @@ export const TableUploadOrEditModal = ({ hasChanged={ table ? table.description !== tableState.description || - table.name !== tableState.name + table.name !== tableState.name || + !!tableState.content : tableState.description.trim() !== "" || tableState.name.trim() !== "" || !!tableState.content From 31d6d8725b5b90afb8e09cb4d56eb2e1f25ffd18 Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Fri, 20 Dec 2024 13:29:49 +0100 Subject: [PATCH 38/78] [front] Returns 200 instead of 404 (#9567) --- front/pages/api/w/[wId]/labs/transcripts/default.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/front/pages/api/w/[wId]/labs/transcripts/default.ts b/front/pages/api/w/[wId]/labs/transcripts/default.ts index 768328bf074f..60d9593b51ba 100644 --- a/front/pages/api/w/[wId]/labs/transcripts/default.ts +++ b/front/pages/api/w/[wId]/labs/transcripts/default.ts @@ -61,12 +61,8 @@ async function handler( }); if (!transcriptsConfiguration) { - return apiError(req, res, { - status_code: 404, - api_error: { - type: "transcripts_configuration_not_found", - message: "The transcripts configuration was not found.", - }, + return res.status(200).json({ + configuration: null, }); } From 30374916222173fc2c2a9dc455bdd6ffed1d7f8f Mon Sep 17 00:00:00 2001 From: Lucas Massemin Date: Fri, 20 Dec 2024 14:35:22 +0100 Subject: [PATCH 39/78] Adding folder nodes mapping the Intercom hierarchy (#9469) * Handling most folder node creations, need to figure out what to do on revoke and strategy.detroy * rebased on main, now with mimetypes and latest api * Created backfill script * oversights * slightly faster team sync * Moved db calls after core calls, refactored util function * moved upserts to activities * linter * fixed activity import * Fixed backfill collection parents, added dry run option * Teams renamed into Conversation, catching null connector * revert microsoft renaming --------- Co-authored-by: Lucas --- ...9_backfill_intercom_data_source_folders.ts | 144 ++++++++++++++++++ .../src/connectors/intercom/lib/utils.ts | 88 +++++++++++ .../intercom/temporal/activities.ts | 48 ++++++ .../intercom/temporal/sync_conversation.ts | 7 + .../intercom/temporal/sync_help_center.ts | 87 +++++------ .../connectors/intercom/temporal/workflows.ts | 16 +- 6 files changed, 337 insertions(+), 53 deletions(-) create mode 100644 connectors/migrations/20241219_backfill_intercom_data_source_folders.ts diff --git a/connectors/migrations/20241219_backfill_intercom_data_source_folders.ts b/connectors/migrations/20241219_backfill_intercom_data_source_folders.ts new file mode 100644 index 000000000000..c54c3e088da0 --- /dev/null +++ b/connectors/migrations/20241219_backfill_intercom_data_source_folders.ts @@ -0,0 +1,144 @@ +import { makeScript } from "scripts/helpers"; + +import { + getDataSourceNodeMimeType, + getHelpCenterCollectionInternalId, + getHelpCenterInternalId, + getParentIdsForCollection, + getTeamInternalId, + getTeamsInternalId, +} from "@connectors/connectors/intercom/lib/utils"; +import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; +import { concurrentExecutor } from "@connectors/lib/async_utils"; +import { upsertDataSourceFolder } from "@connectors/lib/data_sources"; +import { + IntercomCollection, + IntercomHelpCenter, + IntercomTeam, + IntercomWorkspace, +} from "@connectors/lib/models/intercom"; +import { ConnectorResource } from "@connectors/resources/connector_resource"; + +async function createFolderNodes(execute: boolean) { + const connectors = await ConnectorResource.listByType("intercom", {}); + + for (const connector of connectors) { + const dataSourceConfig = dataSourceConfigFromConnector(connector); + + // Create Teams folder + console.log( + `[${connector.id}] -> ${JSON.stringify({ folderId: getTeamsInternalId(connector.id), parents: [getTeamsInternalId(connector.id)] })}` + ); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: getTeamsInternalId(connector.id), + parents: [getTeamsInternalId(connector.id)], + title: "Conversations", + mimeType: getDataSourceNodeMimeType("CONVERSATIONS_FOLDER"), + }); + } + + const teams = await IntercomTeam.findAll({ + where: { + connectorId: connector.id, + }, + }); + // Create a team folder for each team + await concurrentExecutor( + teams, + async (team) => { + const teamInternalId = getTeamInternalId(connector.id, team.teamId); + console.log( + `[${connector.id}] -> ${JSON.stringify({ folderId: teamInternalId, parents: [teamInternalId, getTeamsInternalId(connector.id)] })}` + ); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: teamInternalId, + parents: [teamInternalId, getTeamsInternalId(connector.id)], + title: team.name, + mimeType: getDataSourceNodeMimeType("TEAM"), + }); + } + }, + { concurrency: 16 } + ); + + // Length = 1, for loop just in case + const workspaces = await IntercomWorkspace.findAll({ + where: { + connectorId: connector.id, + }, + }); + + for (const workspace of workspaces) { + // Length mostly 1 + const helpCenters = await IntercomHelpCenter.findAll({ + where: { + connectorId: connector.id, + intercomWorkspaceId: workspace.intercomWorkspaceId, + }, + }); + + for (const helpCenter of helpCenters) { + // Create Help Center folder + const helpCenterInternalId = getHelpCenterInternalId( + connector.id, + helpCenter.helpCenterId + ); + console.log( + `[${connector.id}] -> ${JSON.stringify({ folderId: helpCenterInternalId, parents: [helpCenterInternalId] })}` + ); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: helpCenterInternalId, + parents: [helpCenterInternalId], + title: helpCenter.name, + mimeType: getDataSourceNodeMimeType("HELP_CENTER"), + }); + } + + const collections = await IntercomCollection.findAll({ + where: { + connectorId: connector.id, + helpCenterId: helpCenter.helpCenterId, + }, + }); + + // Create a collection folder for each collection + await concurrentExecutor( + collections, + async (collection) => { + const collectionInternalId = getHelpCenterCollectionInternalId( + connector.id, + collection.collectionId + ); + const collectionParents = await getParentIdsForCollection({ + connectorId: connector.id, + collectionId: collection.collectionId, + helpCenterId: helpCenter.helpCenterId, + }); + console.log( + `[${connector.id}] -> ${JSON.stringify({ folderId: collectionInternalId, parents: collectionParents })}` + ); + if (execute) { + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: collectionInternalId, + parents: collectionParents, + title: collection.name, + mimeType: getDataSourceNodeMimeType("COLLECTION"), + }); + } + }, + { concurrency: 16 } + ); + } + } + } +} +makeScript({}, async ({ execute }) => { + await createFolderNodes(execute); +}); diff --git a/connectors/src/connectors/intercom/lib/utils.ts b/connectors/src/connectors/intercom/lib/utils.ts index 9395a0942364..2db0c96a85ad 100644 --- a/connectors/src/connectors/intercom/lib/utils.ts +++ b/connectors/src/connectors/intercom/lib/utils.ts @@ -4,6 +4,29 @@ import type { IntercomArticleType, IntercomCollectionType, } from "@connectors/connectors/intercom/lib/types"; +import { IntercomCollection } from "@connectors/lib/models/intercom"; + +/** + * Mimetypes + */ +export function getDataSourceNodeMimeType( + intercomNodeType: + | "COLLECTION" + | "TEAM" + | "CONVERSATIONS_FOLDER" + | "HELP_CENTER" +): string { + switch (intercomNodeType) { + case "COLLECTION": + return "application/vnd.dust.intercom.collection"; + case "CONVERSATIONS_FOLDER": + return "application/vnd.dust.intercom.teams-folder"; + case "TEAM": + return "application/vnd.dust.intercom.team"; + case "HELP_CENTER": + return "application/vnd.dust.intercom.help-center"; + } +} /** * From id to internalId @@ -113,3 +136,68 @@ export function getConversationInAppUrl( const domain = getIntercomDomain(region); return `${domain}/a/inbox/${workspaceId}/inbox/conversation/${conversationId}`; } + +// Parents in the Core datasource should map the internal ids that we use in the permission modal +// Order is important: We want the id of the article, then all parents collection in order, then the help center +export async function getParentIdsForArticle({ + documentId, + connectorId, + parentCollectionId, + helpCenterId, +}: { + documentId: string; + connectorId: number; + parentCollectionId: string; + helpCenterId: string; +}) { + // Get collection parents + const collectionParents = await getParentIdsForCollection({ + connectorId, + collectionId: parentCollectionId, + helpCenterId, + }); + + return [documentId, ...collectionParents]; +} + +export async function getParentIdsForCollection({ + connectorId, + collectionId, + helpCenterId, +}: { + connectorId: number; + collectionId: string; + helpCenterId: string; +}) { + // Initialize the internal IDs array with the collection ID. + const parentIds = [ + getHelpCenterCollectionInternalId(connectorId, collectionId), + ]; + + // Fetch and add any parent collection Ids. + let currentParentId = collectionId; + + // There's max 2-levels on Intercom. + for (let i = 0; i < 2; i++) { + const currentParent = await IntercomCollection.findOne({ + where: { + connectorId, + collectionId: currentParentId, + }, + }); + + if (!currentParent || !currentParent.parentId) { + break; + } + + currentParentId = currentParent.parentId; + parentIds.push( + getHelpCenterCollectionInternalId(connectorId, currentParentId) + ); + } + + // Add the help center internal ID. + parentIds.push(getHelpCenterInternalId(connectorId, helpCenterId)); + + return parentIds; +} diff --git a/connectors/src/connectors/intercom/temporal/activities.ts b/connectors/src/connectors/intercom/temporal/activities.ts index c1a0fff20aa0..c1b27952385b 100644 --- a/connectors/src/connectors/intercom/temporal/activities.ts +++ b/connectors/src/connectors/intercom/temporal/activities.ts @@ -10,6 +10,12 @@ import { fetchIntercomTeam, } from "@connectors/connectors/intercom/lib/intercom_api"; import type { IntercomSyncAllConversationsStatus } from "@connectors/connectors/intercom/lib/types"; +import { + getDataSourceNodeMimeType, + getHelpCenterInternalId, + getTeamInternalId, + getTeamsInternalId, +} from "@connectors/connectors/intercom/lib/utils"; import { deleteConversation, deleteTeamAndConversations, @@ -23,6 +29,7 @@ import { } from "@connectors/connectors/intercom/temporal/sync_help_center"; import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; import { concurrentExecutor } from "@connectors/lib/async_utils"; +import { upsertDataSourceFolder } from "@connectors/lib/data_sources"; import { IntercomConversation, IntercomWorkspace, @@ -160,6 +167,19 @@ export async function syncHelpCenterOnlyActivity({ return false; } + // Create datasource folder node + const helpCenterInternalId = getHelpCenterInternalId( + connectorId, + helpCenterOnIntercom.id + ); + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: helpCenterInternalId, + title: helpCenterOnIntercom.display_name || "Help Center", + parents: [helpCenterInternalId], + mimeType: getDataSourceNodeMimeType("HELP_CENTER"), + }); + // If all children collections are not allowed anymore we delete the Help Center data const collectionsWithReadPermission = await IntercomCollection.findAll({ where: { @@ -481,6 +501,17 @@ export async function syncTeamOnlyActivity({ name: teamOnIntercom.name, lastUpsertedTs: new Date(currentSyncMs), }); + + // Also make sure a datasource folder node is created for the team + const teamInternalId = getTeamInternalId(connectorId, teamOnDB.teamId); + await upsertDataSourceFolder({ + dataSourceConfig: dataSourceConfigFromConnector(connector), + folderId: teamInternalId, + title: teamOnIntercom.name, + parents: [teamInternalId, getTeamsInternalId(connectorId)], + mimeType: getDataSourceNodeMimeType("TEAM"), + }); + return true; } @@ -698,3 +729,20 @@ export async function getSyncAllConversationsStatusActivity({ return intercomWorkspace.syncAllConversations; } + +export async function upsertIntercomTeamsFolderActivity({ + connectorId, +}: { + connectorId: ModelId; +}) { + const connector = await _getIntercomConnectorOrRaise(connectorId); + const dataSourceConfig = dataSourceConfigFromConnector(connector); + + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: getTeamsInternalId(connectorId), + title: "Conversations", + parents: [getTeamsInternalId(connectorId)], + mimeType: getDataSourceNodeMimeType("CONVERSATIONS_FOLDER"), + }); +} diff --git a/connectors/src/connectors/intercom/temporal/sync_conversation.ts b/connectors/src/connectors/intercom/temporal/sync_conversation.ts index 17638b0b7fb6..b68b03f9b6ac 100644 --- a/connectors/src/connectors/intercom/temporal/sync_conversation.ts +++ b/connectors/src/connectors/intercom/temporal/sync_conversation.ts @@ -17,6 +17,7 @@ import { import { concurrentExecutor } from "@connectors/lib/async_utils"; import { deleteDataSourceDocument, + deleteDataSourceFolder, renderDocumentTitleAndContent, renderMarkdownSection, upsertDataSourceDocument, @@ -58,6 +59,12 @@ export async function deleteTeamAndConversations({ { concurrency: 10 } ); + // Delete datasource team node + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getTeamInternalId(connectorId, team.teamId), + }); + await team.destroy(); } diff --git a/connectors/src/connectors/intercom/temporal/sync_help_center.ts b/connectors/src/connectors/intercom/temporal/sync_help_center.ts index a93710e06941..db50d4e0ca49 100644 --- a/connectors/src/connectors/intercom/temporal/sync_help_center.ts +++ b/connectors/src/connectors/intercom/temporal/sync_help_center.ts @@ -10,15 +10,21 @@ import type { import { getArticleInAppUrl, getCollectionInAppUrl, + getDataSourceNodeMimeType, getHelpCenterArticleInternalId, getHelpCenterCollectionInternalId, getHelpCenterInternalId, + getParentIdsForArticle, + getParentIdsForCollection, } from "@connectors/connectors/intercom/lib/utils"; +import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; import { deleteDataSourceDocument, + deleteDataSourceFolder, renderDocumentTitleAndContent, renderMarkdownSection, upsertDataSourceDocument, + upsertDataSourceFolder, } from "@connectors/lib/data_sources"; import type { IntercomHelpCenter } from "@connectors/lib/models/intercom"; import { @@ -26,6 +32,7 @@ import { IntercomCollection, } from "@connectors/lib/models/intercom"; import logger from "@connectors/logger/logger"; +import { ConnectorResource } from "@connectors/resources/connector_resource"; import type { DataSourceConfig } from "@connectors/types/data_source_config"; const turndownService = new TurndownService(); @@ -61,6 +68,10 @@ export async function removeHelpCenter({ }); }) ); + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getHelpCenterInternalId(connectorId, helpCenter.helpCenterId), + }); await helpCenter.destroy(); } @@ -109,6 +120,10 @@ export async function deleteCollectionWithChildren({ ); // Then we delete the collection + await deleteDataSourceFolder({ + dataSourceConfig, + folderId: getHelpCenterCollectionInternalId(connectorId, collectionId), + }); await collection.destroy(); logger.info( { ...loggerArgs, collectionId }, @@ -193,6 +208,29 @@ export async function upsertCollectionWithChildren({ lastUpsertedTs: new Date(currentSyncMs), }); } + // Update datasource folder node + const connector = await ConnectorResource.fetchById(connectorId); + if (connector === null) { + throw new Error("Unexpected: connector not found"); + } + const dataSourceConfig = dataSourceConfigFromConnector(connector); + const internalCollectionId = getHelpCenterCollectionInternalId( + connectorId, + collectionId + ); + const collectionParents = await getParentIdsForCollection({ + connectorId, + collectionId, + helpCenterId, + }); + await upsertDataSourceFolder({ + dataSourceConfig, + folderId: internalCollectionId, + title: collection.name, + parents: collectionParents, + parentId: collectionParents.length > 2 ? collectionParents[1] : null, + mimeType: getDataSourceNodeMimeType("COLLECTION"), + }); // Then we call ourself recursively on the children collections const accessToken = await getIntercomAccessToken(connectionId); @@ -403,52 +441,3 @@ export async function upsertArticle({ ); } } - -// Parents in the Core datasource should map the internal ids that we use in the permission modal -// Order is important: We want the id of the article, then all parents collection in order, then the help center -async function getParentIdsForArticle({ - documentId, - connectorId, - parentCollectionId, - helpCenterId, -}: { - documentId: string; - connectorId: number; - parentCollectionId: string; - helpCenterId: string; -}) { - // Initialize the internal IDs array with the article ID. - const parentIds = [documentId]; - - // Add the parent collection ID. - parentIds.push( - getHelpCenterCollectionInternalId(connectorId, parentCollectionId) - ); - - // Fetch and add any grandparent collection IDs. - let currentParentId = parentCollectionId; - - // There's max 2-levels on Intercom. - for (let i = 0; i < 2; i++) { - const currentParent = await IntercomCollection.findOne({ - where: { - connectorId, - collectionId: currentParentId, - }, - }); - - if (currentParent && currentParent.parentId) { - currentParentId = currentParent.parentId; - parentIds.push( - getHelpCenterCollectionInternalId(connectorId, currentParentId) - ); - } else { - break; - } - } - - // Add the help center internal ID. - parentIds.push(getHelpCenterInternalId(connectorId, helpCenterId)); - - return parentIds; -} diff --git a/connectors/src/connectors/intercom/temporal/workflows.ts b/connectors/src/connectors/intercom/temporal/workflows.ts index bb0f96c73cb8..77815c65c862 100644 --- a/connectors/src/connectors/intercom/temporal/workflows.ts +++ b/connectors/src/connectors/intercom/temporal/workflows.ts @@ -34,10 +34,13 @@ const { startToCloseTimeout: "5 minutes", }); -const { saveIntercomConnectorStartSync, saveIntercomConnectorSuccessSync } = - proxyActivities({ - startToCloseTimeout: "1 minute", - }); +const { + saveIntercomConnectorStartSync, + saveIntercomConnectorSuccessSync, + upsertIntercomTeamsFolderActivity, +} = proxyActivities({ + startToCloseTimeout: "1 minute", +}); /** * Sync Workflow for Intercom. @@ -52,6 +55,11 @@ export async function intercomSyncWorkflow({ }) { await saveIntercomConnectorStartSync({ connectorId }); + // Add folder node for teams + await upsertIntercomTeamsFolderActivity({ + connectorId, + }); + const uniqueHelpCenterIds = new Set(); const uniqueTeamIds = new Set(); const signaledHelpCenters: IntercomUpdateSignal[] = []; From 21439c9e669e39334753b16c329c348683e21fb2 Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Fri, 20 Dec 2024 14:52:50 +0100 Subject: [PATCH 40/78] [sparkle] Add prefetch prop for next/link (#9573) --- sparkle/src/components/Dropdown.tsx | 2 ++ sparkle/src/components/LinkWrapper.tsx | 4 +++- sparkle/src/context.tsx | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sparkle/src/components/Dropdown.tsx b/sparkle/src/components/Dropdown.tsx index b57c5091e3e6..c298a0c3c122 100644 --- a/sparkle/src/components/Dropdown.tsx +++ b/sparkle/src/components/Dropdown.tsx @@ -199,6 +199,7 @@ const DropdownMenuItem = React.forwardRef< asChild, replace, shallow, + prefetch, ...props }, ref @@ -220,6 +221,7 @@ const DropdownMenuItem = React.forwardRef< rel={rel} replace={replace} shallow={shallow} + prefetch={prefetch} > (({ children, href, rel, replace, shallow, target }, ref) => { +>(({ children, href, rel, replace, shallow, target, prefetch }, ref) => { const { components } = React.useContext(SparkleContext); if (href) { @@ -26,6 +27,7 @@ export const LinkWrapper = React.forwardRef< rel={rel} replace={replace} shallow={shallow} + prefetch={prefetch} > {children} diff --git a/sparkle/src/context.tsx b/sparkle/src/context.tsx index d7b18cda7b7f..c5224682f057 100644 --- a/sparkle/src/context.tsx +++ b/sparkle/src/context.tsx @@ -21,6 +21,7 @@ type SparkleLinkProps = { shallow?: boolean; target?: string; rel?: string; + prefetch?: boolean; }; export type SparkleContextLinkType = ComponentType< From 99bc9584cd9417917f71e45fa666379260800261 Mon Sep 17 00:00:00 2001 From: Henry Fontanier Date: Fri, 20 Dec 2024 15:12:26 +0100 Subject: [PATCH 41/78] enh(target document tokens): return offsets of chunks that were appended / prepended (#9571) Co-authored-by: Henry Fontanier --- core/src/data_sources/data_source.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/data_sources/data_source.rs b/core/src/data_sources/data_source.rs index f7085e029bcb..c74ac1834566 100644 --- a/core/src/data_sources/data_source.rs +++ b/core/src/data_sources/data_source.rs @@ -68,6 +68,11 @@ pub struct Chunk { pub offset: usize, pub vector: Option>, pub score: Option, + // Empty unless search was ran with `target_document_tokens` + // and the chunk's `text` was expanded with content from other chunks. + // In this case, this field will contain the offsets of the chunks that + // were included to produce the chunk's `text`. + pub expanded_offsets: Vec, } /// Document is used as a data-strucutre for insertion into the SQL store (no @@ -953,6 +958,7 @@ impl DataSource { offset: i, vector: Some(v.vector.clone()), score: None, + expanded_offsets: vec![], } }) .collect::>(); @@ -1432,6 +1438,8 @@ impl DataSource { == chunk.offset { let c_offset = parsed_results[counter].1; + chunk.expanded_offsets.push(c_offset); + if chunk.offset < c_offset { chunk.text.push_str( &(" ".to_owned() @@ -2228,6 +2236,7 @@ fn parse_points_into_chunks( offset: chunk_offset as usize, vector: None, score: maybe_score, + expanded_offsets: vec![], }, )) }) From fd6dbefe63e7974c17d9499afa0064113f0d7052 Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Fri, 20 Dec 2024 15:49:17 +0100 Subject: [PATCH 42/78] [sparkle] bump sparkle version (#9576) --- sparkle/package-lock.json | 4 ++-- sparkle/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sparkle/package-lock.json b/sparkle/package-lock.json index 68c156963886..fdc578eefd3f 100644 --- a/sparkle/package-lock.json +++ b/sparkle/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dust-tt/sparkle", - "version": "0.2.346", + "version": "0.2.347", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@dust-tt/sparkle", - "version": "0.2.346", + "version": "0.2.347", "license": "ISC", "dependencies": { "@emoji-mart/data": "^1.1.2", diff --git a/sparkle/package.json b/sparkle/package.json index 7b11e5f28283..de05f1ed6afc 100644 --- a/sparkle/package.json +++ b/sparkle/package.json @@ -1,6 +1,6 @@ { "name": "@dust-tt/sparkle", - "version": "0.2.346", + "version": "0.2.347", "scripts": { "build": "rm -rf dist && npm run tailwind && npm run build:esm && npm run build:cjs", "tailwind": "tailwindcss -i ./src/styles/tailwind.css -o dist/sparkle.css", From 12eb485c0a03668e43ab7d6dbb85dd3d8a92d5ff Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:02:00 +0100 Subject: [PATCH 43/78] improve error handling (#9578) --- .../src/connectors/zendesk/lib/errors.ts | 9 +++++ .../src/connectors/zendesk/lib/zendesk_api.ts | 34 +++++++++++++------ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/connectors/src/connectors/zendesk/lib/errors.ts b/connectors/src/connectors/zendesk/lib/errors.ts index d80a9bc2d8eb..6bb17d7bf404 100644 --- a/connectors/src/connectors/zendesk/lib/errors.ts +++ b/connectors/src/connectors/zendesk/lib/errors.ts @@ -46,6 +46,15 @@ export function isZendeskExpiredCursorError( ); } +/** + * Catches 404 errors that were already caught in fetchFromZendeskWithRetries and rethrown as ZendeskApiErrors. + * The idea is that we only try/catch the part where we call the API, without wrapping any of our code and from then + * only certain functions can actually handle 404 by returning a null. + */ +export function isZendeskNotFoundError(err: unknown): boolean { + return err instanceof ZendeskApiError && err.status === 404; +} + export function isNodeZendeskEpipeError(err: unknown): err is NodeZendeskError { return ( typeof err === "object" && diff --git a/connectors/src/connectors/zendesk/lib/zendesk_api.ts b/connectors/src/connectors/zendesk/lib/zendesk_api.ts index f7b043c4fc4b..7dba68f1851f 100644 --- a/connectors/src/connectors/zendesk/lib/zendesk_api.ts +++ b/connectors/src/connectors/zendesk/lib/zendesk_api.ts @@ -9,7 +9,10 @@ import type { ZendeskFetchedTicket, ZendeskFetchedUser, } from "@connectors/@types/node-zendesk"; -import { ZendeskApiError } from "@connectors/connectors/zendesk/lib/errors"; +import { + isZendeskNotFoundError, + ZendeskApiError, +} from "@connectors/connectors/zendesk/lib/errors"; import { setTimeoutAsync } from "@connectors/lib/async_utils"; import logger from "@connectors/logger/logger"; import type { ZendeskCategoryResource } from "@connectors/resources/zendesk_resources"; @@ -118,6 +121,7 @@ async function handleZendeskRateLimit(response: Response): Promise { /** * Runs a GET request to the Zendesk API with a maximum number of retries before throwing. + * TODO(2024-12-20): add some basic io-ts validation here (pass a codec as argument and decode with it) */ async function fetchFromZendeskWithRetries({ url, @@ -155,9 +159,6 @@ async function fetchFromZendeskWithRetries({ try { response = await rawResponse.json(); } catch (e) { - if (rawResponse.status === 404) { - return null; - } throw new ZendeskApiError( "Error parsing Zendesk API response", rawResponse.status, @@ -165,9 +166,6 @@ async function fetchFromZendeskWithRetries({ ); } if (!rawResponse.ok) { - if (rawResponse.status === 404) { - return null; - } throw new ZendeskApiError( "Zendesk API error.", rawResponse.status, @@ -191,8 +189,15 @@ export async function fetchZendeskBrand({ brandId: number; }): Promise { const url = `https://${subdomain}.zendesk.com/api/v2/brands/${brandId}`; - const response = await fetchFromZendeskWithRetries({ url, accessToken }); - return response?.brand ?? null; + try { + const response = await fetchFromZendeskWithRetries({ url, accessToken }); + return response?.brand ?? null; + } catch (e) { + if (isZendeskNotFoundError(e)) { + return null; + } + throw e; + } } /** @@ -208,8 +213,15 @@ export async function fetchZendeskArticle({ articleId: number; }): Promise { const url = `https://${brandSubdomain}.zendesk.com/api/v2/help_center/articles/${articleId}`; - const response = await fetchFromZendeskWithRetries({ url, accessToken }); - return response?.article ?? null; + try { + const response = await fetchFromZendeskWithRetries({ url, accessToken }); + return response?.article ?? null; + } catch (e) { + if (isZendeskNotFoundError(e)) { + return null; + } + throw e; + } } /** From 3cc06b6379172b196ca2936fdcd74754c94d6361 Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Fri, 20 Dec 2024 16:02:26 +0100 Subject: [PATCH 44/78] [connectors] Set panic log (#9572) --- connectors/src/connectors/microsoft/temporal/activities.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/connectors/src/connectors/microsoft/temporal/activities.ts b/connectors/src/connectors/microsoft/temporal/activities.ts index 9684629da143..d95c7b802624 100644 --- a/connectors/src/connectors/microsoft/temporal/activities.ts +++ b/connectors/src/connectors/microsoft/temporal/activities.ts @@ -107,6 +107,7 @@ export async function getRootNodesToSyncFromResources( connectorId, error, id: resource.internalId, + panic: true, }, "Failed to get item" ); From aa7b14dd2d3ecfaafd75514e8358dcabfd629277 Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Fri, 20 Dec 2024 16:19:59 +0100 Subject: [PATCH 45/78] [front] use href prefetch (#9577) --- front/components/UserMenu.tsx | 17 ++++++----------- front/components/app/RootLayout.tsx | 3 +++ front/package-lock.json | 8 ++++---- front/package.json | 2 +- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/front/components/UserMenu.tsx b/front/components/UserMenu.tsx index 1cee8476854f..dd52c380acb2 100644 --- a/front/components/UserMenu.tsx +++ b/front/components/UserMenu.tsx @@ -90,20 +90,16 @@ export function UserMenu({ { - void router.push( - `/w/${owner.sId}/assistant/labs/transcripts` - ); - }} + href={`/w/${owner.sId}/assistant/labs/transcripts`} + prefetch={false} /> )} {featureFlags.includes("labs_trackers") && ( { - void router.push(`/w/${owner.sId}/assistant/labs/trackers`); - }} + href={`/w/${owner.sId}/assistant/labs/trackers`} + prefetch={false} /> )} @@ -153,11 +149,10 @@ export function UserMenu({ { - void router.push("/api/auth/logout"); - }} + href="/api/auth/logout" icon={LogoutIcon} label="Sign out" + prefetch={false} /> diff --git a/front/components/app/RootLayout.tsx b/front/components/app/RootLayout.tsx index b22bbcfe2589..5767e92b1003 100644 --- a/front/components/app/RootLayout.tsx +++ b/front/components/app/RootLayout.tsx @@ -20,6 +20,7 @@ function NextLinkWrapper({ onClick, replace = false, shallow = false, + prefetch, target = "_self", rel, }: { @@ -39,6 +40,7 @@ function NextLinkWrapper({ onClick?: (event: MouseEvent) => void; replace?: boolean; shallow?: boolean; + prefetch?: boolean; target?: string; rel?: string; }) { @@ -53,6 +55,7 @@ function NextLinkWrapper({ rel={rel} shallow={shallow} replace={replace} + prefetch={prefetch} > {children} diff --git a/front/package-lock.json b/front/package-lock.json index fe208e1d9d4d..82d8122c4433 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -7,7 +7,7 @@ "dependencies": { "@auth0/nextjs-auth0": "^3.5.0", "@dust-tt/client": "file:../sdks/js", - "@dust-tt/sparkle": "0.2.346", + "@dust-tt/sparkle": "^0.2.347", "@dust-tt/types": "file:../types", "@headlessui/react": "^1.7.7", "@heroicons/react": "^2.0.11", @@ -11453,9 +11453,9 @@ "link": true }, "node_modules/@dust-tt/sparkle": { - "version": "0.2.346", - "resolved": "https://registry.npmjs.org/@dust-tt/sparkle/-/sparkle-0.2.346.tgz", - "integrity": "sha512-wNOGHTcf/usi9mZMvIeMGxvvIydAh9YUhz9Sdp99KV68953wCyzSuIp5LVlHeYf8IoISJxqS9Hp3RCIgv0rLxg==", + "version": "0.2.347", + "resolved": "https://registry.npmjs.org/@dust-tt/sparkle/-/sparkle-0.2.347.tgz", + "integrity": "sha512-hSZVIjyfoyWdyDRaN32rlbbljH+cMnh1KLCknlYjGPZVTMuPrIR8QLTZO1Kg1H8RiZee79kjFxSHTRPfgRJcLA==", "dependencies": { "@emoji-mart/data": "^1.1.2", "@emoji-mart/react": "^1.1.1", diff --git a/front/package.json b/front/package.json index 061926a49b0e..21c28fb08263 100644 --- a/front/package.json +++ b/front/package.json @@ -20,7 +20,7 @@ "dependencies": { "@auth0/nextjs-auth0": "^3.5.0", "@dust-tt/client": "file:../sdks/js", - "@dust-tt/sparkle": "0.2.346", + "@dust-tt/sparkle": "^0.2.347", "@dust-tt/types": "file:../types", "@headlessui/react": "^1.7.7", "@heroicons/react": "^2.0.11", From 4d298bf3634dbe355c82e9a55127906a0ec1a98f Mon Sep 17 00:00:00 2001 From: Henry Fontanier Date: Fri, 20 Dec 2024 16:36:47 +0100 Subject: [PATCH 46/78] fix: slack connector getParents should return parents for threads (#9579) * fix: slack connector getParents should return parents for threads * Panik --------- Co-authored-by: Henry Fontanier --- .../20241218_backfill_slack_folders.ts | 4 +- connectors/src/connectors/slack/index.ts | 43 +++++++++-- connectors/src/connectors/slack/lib/utils.ts | 75 ++++++++++++++++++- .../connectors/slack/temporal/activities.ts | 32 +++++--- 4 files changed, 132 insertions(+), 22 deletions(-) diff --git a/connectors/migrations/20241218_backfill_slack_folders.ts b/connectors/migrations/20241218_backfill_slack_folders.ts index 3b120473e50d..63b070237bad 100644 --- a/connectors/migrations/20241218_backfill_slack_folders.ts +++ b/connectors/migrations/20241218_backfill_slack_folders.ts @@ -1,7 +1,7 @@ import { makeScript } from "scripts/helpers"; import { Op } from "sequelize"; -import { internalIdFromSlackChannelId } from "@connectors/connectors/slack/lib/utils"; +import { slackChannelInternalIdFromSlackChannelId } from "@connectors/connectors/slack/lib/utils"; import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; import { concurrentExecutor } from "@connectors/lib/async_utils"; import { upsertDataSourceFolder } from "@connectors/lib/data_sources"; @@ -30,7 +30,7 @@ makeScript({}, async ({ execute }, logger) => { await concurrentExecutor( channels, async (channel) => { - const internalId = internalIdFromSlackChannelId( + const internalId = slackChannelInternalIdFromSlackChannelId( channel.slackChannelId ); await upsertDataSourceFolder({ diff --git a/connectors/src/connectors/slack/index.ts b/connectors/src/connectors/slack/index.ts index 9dcf78e46e00..10281d7a86a3 100644 --- a/connectors/src/connectors/slack/index.ts +++ b/connectors/src/connectors/slack/index.ts @@ -24,8 +24,13 @@ import { getSlackClient, } from "@connectors/connectors/slack/lib/slack_client"; import { - internalIdFromSlackChannelId, + isSlackChannelInternalId, + isSlackNonThreadedMessagesInternalId, + isSlackThreadInternalId, slackChannelIdFromInternalId, + slackChannelIdFromSlackNonThreadedMessagesInternalId, + slackChannelInternalIdFromSlackChannelId, + slackThreadIdentifierFromSlackThreadInternalId, } from "@connectors/connectors/slack/lib/utils"; import { launchSlackSyncWorkflow } from "@connectors/connectors/slack/temporal/client.js"; import { @@ -381,7 +386,7 @@ export class SlackConnectorManager extends BaseConnectorManager ({ provider: "slack", - internalId: internalIdFromSlackChannelId(ch.slackChannelId), + internalId: slackChannelInternalIdFromSlackChannelId(ch.slackChannelId), parentInternalId: null, type: "channel", title: `#${ch.slackChannelName}`, @@ -596,7 +601,7 @@ export class SlackConnectorManager extends BaseConnectorManager ({ provider: "slack", - internalId: internalIdFromSlackChannelId(ch.slackChannelId), + internalId: slackChannelInternalIdFromSlackChannelId(ch.slackChannelId), parentInternalId: null, type: "channel", title: `#${ch.slackChannelName}`, @@ -617,9 +622,35 @@ export class SlackConnectorManager extends BaseConnectorManager> { - // We only ever return permissions at the slack channel level so the parents are always the - // internalId itself. - return new Ok([internalId]); + // If the internal ID is a Slack channel ID, it has no other parent + if (isSlackChannelInternalId(internalId)) { + return new Ok([internalId]); + } + // If it is a slack thread, or a slack "non-threaded" message document, it also + // needs the channel internal ID as parent + else if (isSlackThreadInternalId(internalId)) { + const { channelId } = + slackThreadIdentifierFromSlackThreadInternalId(internalId); + return new Ok([ + internalId, + slackChannelInternalIdFromSlackChannelId(channelId), + ]); + } else if (isSlackNonThreadedMessagesInternalId(internalId)) { + const channelId = + slackChannelIdFromSlackNonThreadedMessagesInternalId(internalId); + return new Ok([ + internalId, + slackChannelInternalIdFromSlackChannelId(channelId), + ]); + } + // This in theory shouldn't happen + else { + logger.error( + { internalId, panic: true }, + "Unknown internal ID for Slack connector" + ); + return new Ok([internalId]); + } } async setConfigurationKey({ diff --git a/connectors/src/connectors/slack/lib/utils.ts b/connectors/src/connectors/slack/lib/utils.ts index 3134a2c1d020..45e0ce2602a6 100644 --- a/connectors/src/connectors/slack/lib/utils.ts +++ b/connectors/src/connectors/slack/lib/utils.ts @@ -51,10 +51,81 @@ export const timeAgoFrom = (millisSinceEpoch: number) => { return seconds + "s"; }; -export function internalIdFromSlackChannelId(channel: string) { +export type SlackChannelInternalId = string; +export type SlackThreadInternalId = string; +export type SlackNonThreadedMessagesInternalId = string; + +export function isSlackChannelInternalId( + internalId: string +): internalId is SlackChannelInternalId { + return internalId.startsWith("slack-channel-"); +} + +export function isSlackThreadInternalId( + internalId: string +): internalId is SlackThreadInternalId { + return internalId.startsWith("slack-") && internalId.includes("-thread-"); +} + +export function isSlackNonThreadedMessagesInternalId( + internalId: string +): internalId is SlackNonThreadedMessagesInternalId { + return internalId.startsWith("slack-") && internalId.includes("-messages-"); +} + +export function slackChannelInternalIdFromSlackChannelId( + channel: string +): SlackChannelInternalId { return `slack-channel-${_.last(channel.split("slack-channel-"))!}`; } -export function slackChannelIdFromInternalId(nodeId: string) { +export function slackChannelIdFromInternalId(nodeId: SlackChannelInternalId) { return _.last(nodeId.split("slack-channel-"))!; } + +export type SlackThreadIdentifier = { + channelId: string; + threadTs: string; +}; + +export function slackThreadInternalIdFromSlackThreadIdentifier({ + channelId, + threadTs, +}: SlackThreadIdentifier): SlackThreadInternalId { + return `slack-${channelId}-thread-${threadTs}`; +} + +export function slackThreadIdentifierFromSlackThreadInternalId( + internalId: SlackThreadInternalId +): SlackThreadIdentifier { + const parts = internalId.split("-thread-"); + const channelId = _.last(parts[0]!.split("slack-"))!; + const threadTs = parts[1]; + return { + channelId, + threadTs: threadTs!, + }; +} + +export type SlackNonThreadedMessagesIdentifier = { + channelId: string; + startDate: Date; + endDate: Date; +}; + +export function slackNonThreadedMessagesInternalIdFromSlackNonThreadedMessagesIdentifier({ + channelId, + startDate, + endDate, +}: SlackNonThreadedMessagesIdentifier): SlackNonThreadedMessagesInternalId { + const startDateStr = `${startDate.getFullYear()}-${startDate.getMonth()}-${startDate.getDate()}`; + const endDateStr = `${endDate.getFullYear()}-${endDate.getMonth()}-${endDate.getDate()}`; + return `slack-${channelId}-messages-${startDateStr}-${endDateStr}`; +} + +export function slackChannelIdFromSlackNonThreadedMessagesInternalId( + internalId: SlackNonThreadedMessagesInternalId +): string { + const parts = internalId.split("-messages-"); + return _.last(parts[0]!.split("slack-"))!; +} diff --git a/connectors/src/connectors/slack/temporal/activities.ts b/connectors/src/connectors/slack/temporal/activities.ts index 65f179078988..d9a2a1c0ab28 100644 --- a/connectors/src/connectors/slack/temporal/activities.ts +++ b/connectors/src/connectors/slack/temporal/activities.ts @@ -27,7 +27,9 @@ import { getRepliesFromThread } from "@connectors/connectors/slack/lib/thread"; import { getWeekEnd, getWeekStart, - internalIdFromSlackChannelId, + slackChannelInternalIdFromSlackChannelId, + slackNonThreadedMessagesInternalIdFromSlackNonThreadedMessagesIdentifier, + slackThreadInternalIdFromSlackThreadIdentifier, } from "@connectors/connectors/slack/lib/utils"; import { dataSourceConfigFromConnector } from "@connectors/lib/api/data_source_config"; import { cacheGet, cacheSet } from "@connectors/lib/cache"; @@ -248,10 +250,10 @@ export async function syncChannel( if (!messagesCursor) { await upsertDataSourceFolder({ dataSourceConfig, - folderId: internalIdFromSlackChannelId(channelId), + folderId: slackChannelInternalIdFromSlackChannelId(channelId), title: `#${channel.name}`, parentId: null, - parents: [internalIdFromSlackChannelId(channelId)], + parents: [slackChannelInternalIdFromSlackChannelId(channelId)], mimeType: "application/vnd.dust.slack.channel", }); } @@ -561,9 +563,12 @@ export async function syncNonThreaded( const startDate = new Date(startTsMs); const endDate = new Date(endTsMs); - const startDateStr = `${startDate.getFullYear()}-${startDate.getMonth()}-${startDate.getDate()}`; - const endDateStr = `${endDate.getFullYear()}-${endDate.getMonth()}-${endDate.getDate()}`; - const documentId = `slack-${channelId}-messages-${startDateStr}-${endDateStr}`; + const documentId = + slackNonThreadedMessagesInternalIdFromSlackNonThreadedMessagesIdentifier({ + channelId, + startDate, + endDate, + }); const firstMessage = messages[0]; let sourceUrl: string | undefined = undefined; @@ -621,8 +626,8 @@ export async function syncNonThreaded( documentUrl: sourceUrl, timestampMs: updatedAt, tags, - parentId: internalIdFromSlackChannelId(channelId), - parents: [documentId, internalIdFromSlackChannelId(channelId)], + parentId: slackChannelInternalIdFromSlackChannelId(channelId), + parents: [documentId, slackChannelInternalIdFromSlackChannelId(channelId)], upsertContext: { sync_type: isBatchSync ? "batch" : "incremental", }, @@ -752,7 +757,10 @@ export async function syncThread( "syncThread.getRepliesFromThread.done" ); - const documentId = `slack-${channelId}-thread-${threadTs}`; + const documentId = slackThreadInternalIdFromSlackThreadIdentifier({ + channelId, + threadTs, + }); const botUserId = await getBotUserIdMemoized(connectorId); allMessages = allMessages.filter((m) => m.user !== botUserId); @@ -832,8 +840,8 @@ export async function syncThread( documentUrl: sourceUrl, timestampMs: updatedAt, tags, - parentId: internalIdFromSlackChannelId(channelId), - parents: [documentId, internalIdFromSlackChannelId(channelId)], + parentId: slackChannelInternalIdFromSlackChannelId(channelId), + parents: [documentId, slackChannelInternalIdFromSlackChannelId(channelId)], upsertContext: { sync_type: isBatchSync ? "batch" : "incremental", }, @@ -1191,7 +1199,7 @@ export async function deleteChannel(channelId: string, connectorId: ModelId) { await deleteDataSourceFolder({ dataSourceConfig, - folderId: internalIdFromSlackChannelId(channelId), + folderId: slackChannelInternalIdFromSlackChannelId(channelId), }); logger.info( From 480424d41982a418724899e40d2027594204121b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Fri, 20 Dec 2024 16:38:11 +0100 Subject: [PATCH 47/78] Tracker: Option to skip empty emails (#9581) --- front/components/trackers/TrackerBuilder.tsx | 28 +++++++++++++++++++ front/lib/api/tracker.ts | 16 ++++++----- front/lib/models/doc_tracker.ts | 6 ++++ front/lib/resources/tracker_resource.ts | 1 + front/migrations/db/migration_135.sql | 1 + .../spaces/[spaceId]/trackers/[tId]/index.ts | 1 + .../[wId]/spaces/[spaceId]/trackers/index.ts | 2 ++ .../assistant/labs/trackers/[tId]/index.tsx | 1 + types/src/front/tracker.ts | 2 ++ 9 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 front/migrations/db/migration_135.sql diff --git a/front/components/trackers/TrackerBuilder.tsx b/front/components/trackers/TrackerBuilder.tsx index 51db7e1fa8c5..5400501d092c 100644 --- a/front/components/trackers/TrackerBuilder.tsx +++ b/front/components/trackers/TrackerBuilder.tsx @@ -1,5 +1,6 @@ import { Button, + Checkbox, Chip, DropdownMenu, DropdownMenuContent, @@ -79,6 +80,7 @@ export const TrackerBuilder = ({ promptError: null, frequency: TRACKER_FREQUENCIES[0].value, frequencyError: null, + skipEmptyEmails: true, recipients: "", recipientsError: null, modelId: CLAUDE_3_5_SONNET_DEFAULT_MODEL_CONFIG.modelId, @@ -178,6 +180,7 @@ export const TrackerBuilder = ({ providerId: tracker.providerId, temperature: tracker.temperature, frequency: tracker.frequency, + skipEmptyEmails: tracker.skipEmptyEmails, recipients: tracker.recipients ? extractEmails(tracker.recipients) : [], maintainedDataSources: Object.values(tracker.maintainedDataSources).map( (ds) => dataSourceToPayload(ds, owner.sId) @@ -536,6 +539,31 @@ export const TrackerBuilder = ({ /> +

+
+
+
+
+
+ { + setTracker((t) => ({ + ...t, + skipEmptyEmails: !t.skipEmptyEmails, + })); + if (!edited) { + setEdited(true); + } + }} + /> +
+ Don't send emails when there are no updates. +
+
+
+
{/* DataSource Configurations Settings */} diff --git a/front/lib/api/tracker.ts b/front/lib/api/tracker.ts index 4d7aa182c5f8..38627bf4f6c6 100644 --- a/front/lib/api/tracker.ts +++ b/front/lib/api/tracker.ts @@ -45,12 +45,14 @@ export const processTrackerNotification = async ({ // Send the tracker email(s). const generations = tracker.generations || []; - await sendTrackerEmail({ - name: tracker.name, - recipients: tracker.recipients, - generations, - localLogger, - }); + if (generations.length > 0 || !tracker.skipEmptyEmails) { + await sendTrackerEmail({ + name: tracker.name, + recipients: tracker.recipients, + generations, + localLogger, + }); + } // Consume the tracker & associated generations. await TrackerConfigurationResource.consumeGenerations({ @@ -108,7 +110,7 @@ const _sendTrackerDefaultEmail = async ({ subject: `[Dust] Tracker ${name} check complete: No updates required.`, body: `

Tracker: ${name}.

-

No changes detected in watched documents. All maintained documents are current

+

No changes detected in watched documents. All maintained documents are up to date.

`, }); }; diff --git a/front/lib/models/doc_tracker.ts b/front/lib/models/doc_tracker.ts index 21caf78da2cc..0fb1e7e37a08 100644 --- a/front/lib/models/doc_tracker.ts +++ b/front/lib/models/doc_tracker.ts @@ -27,6 +27,7 @@ export class TrackerConfigurationModel extends SoftDeletableModel Date: Fri, 20 Dec 2024 16:40:00 +0100 Subject: [PATCH 48/78] Remove query string parsing in multi-region login redirect for the time beeing (#9583) --- front/pages/api/login.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/front/pages/api/login.ts b/front/pages/api/login.ts index 39fd6412853a..fce5c8a18cf3 100644 --- a/front/pages/api/login.ts +++ b/front/pages/api/login.ts @@ -361,11 +361,8 @@ async function handler( r.forEach((result, region) => { if (result.reponse.user?.email) { if (!result.isCurrentRegion) { - const reqUrl = req.url; - const { searchParams } = new URL(reqUrl ?? ""); - res.redirect( - `${result.regionUrl}/api/login?${searchParams.toString()}` - ); + //TODO(multi-regions): keep the querystring when redirecting + res.redirect(`${result.regionUrl}/api/login`); return; } else { console.log( From 9707c2f03707b3d80a41738c9110df5c6ac36d64 Mon Sep 17 00:00:00 2001 From: Jules Belveze <32683010+JulesBelveze@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:44:10 +0100 Subject: [PATCH 49/78] [.github] - feature: enhance deploy-core workflow with regional deployment capabilities (#9584) - Add input option to select specific regions or 'all' for deployment - Implement job to notify start of deployment with slack message - Introduce matrix strategy for building image per region - Rearrange deployment triggering to support dynamic regions from inputs - Streamline environment variables and steps for build and deployment process --- .github/workflows/deploy-core.yml | 74 +++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/.github/workflows/deploy-core.yml b/.github/workflows/deploy-core.yml index e3eeb1da5ae3..005875c87676 100644 --- a/.github/workflows/deploy-core.yml +++ b/.github/workflows/deploy-core.yml @@ -3,6 +3,15 @@ name: Deploy Core on: workflow_dispatch: inputs: + regions: + description: "Regions to deploy to" + required: true + default: "us-central1" + type: choice + options: + - "us-central1" + - "europe-west1" + - "all" check_deployment_blocked: description: "Check #deployment locks or force deploy" required: true @@ -18,17 +27,15 @@ concurrency: env: GCLOUD_PROJECT_ID: ${{ secrets.GCLOUD_PROJECT_ID }} + IMAGE_NAME: core jobs: - build-and-deploy: + notify-start: runs-on: ubuntu-latest - - if: github.ref == 'refs/heads/main' - + outputs: + thread_ts: ${{ steps.build_message.outputs.thread_ts }} steps: - - name: Checkout code - uses: actions/checkout@v3 - + - uses: actions/checkout@v3 - name: Get short sha id: short_sha run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT @@ -52,23 +59,54 @@ jobs: channel: ${{ secrets.SLACK_CHANNEL_ID }} slack_token: ${{ secrets.SLACK_BOT_TOKEN }} + create-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - id: set-matrix + run: | + if [ "${{ github.event.inputs.regions }}" = "all" ]; then + echo "matrix=[\"us-central1\",\"europe-west1\"]" >> $GITHUB_OUTPUT + else + echo "matrix=[\"${{ github.event.inputs.regions }}\"]" >> $GITHUB_OUTPUT + fi + + build: + needs: [notify-start, create-matrix] + runs-on: ubuntu-latest + strategy: + matrix: + region: ${{ fromJson(needs.create-matrix.outputs.matrix) }} + fail-fast: true + + steps: + - uses: actions/checkout@v3 + - name: Get short sha + id: short_sha + run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - name: "Authenticate with Google Cloud" uses: "google-github-actions/auth@v1" with: credentials_json: "${{ secrets.GCLOUD_SA_KEY }}" - - name: "Set up Cloud SDK" - uses: "google-github-actions/setup-gcloud@v1" - - - name: Build the image on Cloud Build + - name: Build image for ${{ matrix.region }} run: | chmod +x ./k8s/cloud-build.sh ./k8s/cloud-build.sh \ - --image-name=core \ - --dockerfile-path=./Dockerfile \ - --working-dir=./core/ \ - --region=us-central1 + --image-name=$IMAGE_NAME \ + --dockerfile-path=./core/Dockerfile \ + --working-dir=./ \ + --region=${{ matrix.region }} + deploy: + needs: [notify-start, build] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Get short sha + id: short_sha + run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - name: Generate a token id: generate-token uses: actions/create-github-app-token@v1 @@ -89,10 +127,10 @@ jobs: repo: 'dust-infra', event_type: 'trigger-component-deploy', client_payload: { - regions: 'us-central1', + regions: '${{ github.event.inputs.regions }}', component: 'core', image_tag: '${{ steps.short_sha.outputs.short_sha }}', - slack_thread_ts: "${{ steps.build_message.outputs.thread_ts }}", + slack_thread_ts: "${{ needs.notify-start.outputs.thread_ts }}", slack_channel: '${{ secrets.SLACK_CHANNEL_ID }}' } }); @@ -107,4 +145,4 @@ jobs: image_tag: ${{ steps.short_sha.outputs.short_sha }} channel: ${{ secrets.SLACK_CHANNEL_ID }} slack_token: ${{ secrets.SLACK_BOT_TOKEN }} - thread_ts: "${{ steps.build_message.outputs.thread_ts }}" + thread_ts: "${{ needs.notify-start.outputs.thread_ts }}" From ed262e5ad1063466f2773db4a934ae134e35612a Mon Sep 17 00:00:00 2001 From: Jules Belveze <32683010+JulesBelveze@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:04:54 +0100 Subject: [PATCH 50/78] [.github] - fix: update docker build paths in deployment workflow (#9587) - Change the Dockerfile path to point to the project root - Set the working directory to `./core/` for consistency in the build process --- .github/workflows/deploy-core.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-core.yml b/.github/workflows/deploy-core.yml index 005875c87676..789e9b9b4aad 100644 --- a/.github/workflows/deploy-core.yml +++ b/.github/workflows/deploy-core.yml @@ -95,8 +95,8 @@ jobs: chmod +x ./k8s/cloud-build.sh ./k8s/cloud-build.sh \ --image-name=$IMAGE_NAME \ - --dockerfile-path=./core/Dockerfile \ - --working-dir=./ \ + --dockerfile-path=./Dockerfile \ + --working-dir=./core/ \ --region=${{ matrix.region }} deploy: From b857e27156c495ba4ad367df6143bf925ffbc2f1 Mon Sep 17 00:00:00 2001 From: Sebastien Flory Date: Fri, 20 Dec 2024 17:31:53 +0100 Subject: [PATCH 51/78] Fix exit handler when redirecting (#9589) --- front/pages/api/login.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/front/pages/api/login.ts b/front/pages/api/login.ts index fce5c8a18cf3..79010505b89b 100644 --- a/front/pages/api/login.ts +++ b/front/pages/api/login.ts @@ -358,11 +358,12 @@ async function handler( // Check if the user should be redirect to another region. const regionLookupClient = new RegionLookupClient(); const r = await regionLookupClient.lookupUser(session.user); - r.forEach((result, region) => { + for (const [region, result] of r) { if (result.reponse.user?.email) { if (!result.isCurrentRegion) { //TODO(multi-regions): keep the querystring when redirecting res.redirect(`${result.regionUrl}/api/login`); + // Skip the rest of the handler return; } else { console.log( @@ -370,7 +371,7 @@ async function handler( ); } } - }); + } } const { inviteToken, wId } = req.query; From a2480fe939b89cc24ac405e9b7a64e834b853fe2 Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:41:12 +0100 Subject: [PATCH 52/78] [core] add a log on `parents[1] == parentId` (#9588) * add a log on parents[1] == parentId that we need to get to 0 * update the logs * reformulate the TODO --- core/bin/core_api.rs | 134 ++++++++++++++++++++++++++++++------------- 1 file changed, 94 insertions(+), 40 deletions(-) diff --git a/core/bin/core_api.rs b/core/bin/core_api.rs index d59dae3b78b7..3a8156f2fe54 100644 --- a/core/bin/core_api.rs +++ b/core/bin/core_api.rs @@ -1507,14 +1507,23 @@ async fn data_sources_documents_update_parents( } } None => { - info!( - data_source_id = data_source_id, - node_id = document_id, - parents = ?payload.parents, - node_type = "document", - operation = "update_parents", - "[KWSEARCH] invariant_parent_id_not_none" - ); + if payload.parents.len() > 1 { + // TODO(aubin) - re-enable this check when the log below does not pop + // return error_response( + // StatusCode::BAD_REQUEST, + // "invalid_parent_id", + // "Failed to update document parents - parent_id should not be null if parents[1] is defined", + // None, + // ); + info!( + data_source_id = data_source_id, + node_id = document_id, + parents = ?payload.parents, + node_type = "document", + operation = "update_parents", + "[KWSEARCH] invariant_parent_id_incorrectly_none" + ); + } } } @@ -1681,6 +1690,15 @@ async fn data_sources_documents_upsert( match &payload.parent_id { Some(parent_id) => { if payload.parents.get(1) != Some(parent_id) { + info!( + data_source_id = data_source_id, + node_id = payload.document_id, + parent_id = parent_id, + parents = ?payload.parents, + node_type = "document", + operation = "upsert", + "[KWSEARCH] invariant_parent_id_equal_parent_1" + ); // TODO(fontanierh): Temporary, as we need to let some jobs go through. // return error_response( // StatusCode::BAD_REQUEST, @@ -1691,14 +1709,23 @@ async fn data_sources_documents_upsert( } } None => { - info!( - data_source_id = data_source_id, - node_id = payload.document_id, - parents = ?payload.parents, - node_type = "document", - operation = "upsert", - "[KWSEARCH] invariant_parent_id_not_none" - ); + if payload.parents.len() > 1 { + // TODO(aubin) - re-enable this check when the log below does not pop + // return error_response( + // StatusCode::BAD_REQUEST, + // "invalid_parent_id", + // "Failed to upsert document - parent_id should not be null if parents[1] is defined", + // None, + // ); + info!( + data_source_id = data_source_id, + node_id = payload.document_id, + parents = ?payload.parents, + node_type = "document", + operation = "upsert", + "[KWSEARCH] invariant_parent_id_incorrectly_none" + ); + } } } @@ -2173,14 +2200,23 @@ async fn tables_upsert( } } None => { - info!( - data_source_id = data_source_id, - node_id = payload.table_id, - parents = ?payload.parents, - node_type = "table", - operation = "upsert", - "[KWSEARCH] invariant_parent_id_not_none" - ); + if payload.parents.len() > 1 { + // TODO(aubin) - re-enable this check when the log below does not pop + // return error_response( + // StatusCode::BAD_REQUEST, + // "invalid_parent_id", + // "Failed to upsert table - parent_id should not be null if parents[1] is defined", + // None, + // ); + info!( + data_source_id = data_source_id, + node_id = payload.table_id, + parents = ?payload.parents, + node_type = "table", + operation = "upsert", + "[KWSEARCH] invariant_parent_id_incorrectly_none" + ); + } } } @@ -2457,14 +2493,23 @@ async fn tables_update_parents( } } None => { - info!( - data_source_id = data_source_id, - node_id = table_id, - parents = ?payload.parents, - node_type = "table", - operation = "update_parents", - "[KWSEARCH] invariant_parent_id_not_none" - ); + if payload.parents.len() > 1 { + // TODO(aubin) - re-enable this check when the log below does not pop + // return error_response( + // StatusCode::BAD_REQUEST, + // "invalid_parent_id", + // "Failed to update table parents - parent_id should not be null if parents[1] is defined", + // None, + // ); + info!( + data_source_id = data_source_id, + node_id = table_id, + parents = ?payload.parents, + node_type = "table", + operation = "update_parents", + "[KWSEARCH] invariant_parent_id_incorrectly_none" + ); + } } } @@ -2878,14 +2923,23 @@ async fn folders_upsert( } } None => { - info!( - data_source_id = data_source_id, - node_id = payload.folder_id, - parents = ?payload.parents, - node_type = "folder", - operation = "upsert", - "[KWSEARCH] invariant_parent_id_not_none" - ); + if payload.parents.len() > 1 { + // TODO(aubin) - re-enable this check when the log below does not pop + // return error_response( + // StatusCode::BAD_REQUEST, + // "invalid_parent_id", + // "Failed to upsert folder - parent_id should not be null if parents[1] is defined", + // None, + // ); + info!( + data_source_id = data_source_id, + node_id = payload.folder_id, + parents = ?payload.parents, + node_type = "folder", + operation = "upsert", + "[KWSEARCH] invariant_parent_id_incorrectly_none" + ); + } } } From aad80171d89ff95d806443c99e63f7282fa92577 Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:42:02 +0100 Subject: [PATCH 53/78] add the endpoint to the error data to enrich the logs (#9586) --- .../src/connectors/zendesk/lib/zendesk_api.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/connectors/src/connectors/zendesk/lib/zendesk_api.ts b/connectors/src/connectors/zendesk/lib/zendesk_api.ts index 7dba68f1851f..8800e5c0c84e 100644 --- a/connectors/src/connectors/zendesk/lib/zendesk_api.ts +++ b/connectors/src/connectors/zendesk/lib/zendesk_api.ts @@ -21,6 +21,10 @@ import { ZendeskBrandResource } from "@connectors/resources/zendesk_resources"; const ZENDESK_RATE_LIMIT_MAX_RETRIES = 5; const ZENDESK_RATE_LIMIT_TIMEOUT_SECONDS = 60; +function getEndpointFromZendeskUrl(url: string): string { + return url.replace(/^https?:\/\/(.*)\.zendesk\.com(.*)/, "$2"); +} + export function createZendeskClient({ accessToken, subdomain, @@ -162,15 +166,15 @@ async function fetchFromZendeskWithRetries({ throw new ZendeskApiError( "Error parsing Zendesk API response", rawResponse.status, - rawResponse + { rawResponse, endpoint: getEndpointFromZendeskUrl(url) } ); } if (!rawResponse.ok) { - throw new ZendeskApiError( - "Zendesk API error.", - rawResponse.status, - response - ); + throw new ZendeskApiError("Zendesk API error.", rawResponse.status, { + response, + rawResponse, + endpoint: getEndpointFromZendeskUrl(url), + }); } return response; From c78d4b454eee4807b185c5da4ae7efbaca20ab1a Mon Sep 17 00:00:00 2001 From: Aubin <60398825+aubin-tchoi@users.noreply.github.com> Date: Sat, 21 Dec 2024 01:14:00 +0100 Subject: [PATCH 54/78] fix an off-by-one error in the directory parents (#9591) --- .../src/connectors/github/lib/github_api.ts | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/connectors/src/connectors/github/lib/github_api.ts b/connectors/src/connectors/github/lib/github_api.ts index 5c88f4ed97de..84e852de2513 100644 --- a/connectors/src/connectors/github/lib/github_api.ts +++ b/connectors/src/connectors/github/lib/github_api.ts @@ -850,13 +850,13 @@ export async function processRepository({ const fileName = basename(file); const parents = []; - for (let i = 0; i < path.length; i++) { - const pathInternalId = getCodeDirInternalId( - repoId, - path.slice(0, i + 1).join("/") - ); + // we order parents bottom to top, so we take paths in the opposite order + for (let i = path.length - 1; i >= 0; i--) { parents.push({ - internalId: pathInternalId, + internalId: getCodeDirInternalId( + repoId, + path.slice(0, i + 1).join("/") + ), dirName: path[i] as string, dirPath: path.slice(0, i), }); @@ -867,10 +867,7 @@ export async function processRepository({ `${path.join("/")}/${fileName}` ); - const parentInternalId = - parents.length === 0 - ? null - : (parents[parents.length - 1]?.internalId as string); + const parentInternalId = parents[0]?.internalId ?? null; // Files files.push({ @@ -883,8 +880,7 @@ export async function processRepository({ sizeBytes: size, documentId, parentInternalId, - /// we reverse the parents here since the convention is bottom to top - parents: [documentId, ...parents.map((p) => p.internalId).reverse()], + parents: [documentId, ...parents.map((p) => p.internalId)], localFilePath: file, }); @@ -894,7 +890,7 @@ export async function processRepository({ if (p && !seenDirs[p.internalId]) { seenDirs[p.internalId] = true; - const dirParent = parents[i - 1]; + const dirParent = parents[i + 1]; const dirParentInternalId = dirParent ? dirParent.internalId : null; directories.push({ @@ -906,7 +902,7 @@ export async function processRepository({ )}`, internalId: p.internalId, parentInternalId: dirParentInternalId, - parents: parents.slice(0, i).map((p) => p.internalId), + parents: parents.slice(i).map((p) => p.internalId), }); } } From ef479bbd6e78c24d18db3dd3c15ccb1e3775a2ce Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Sat, 21 Dec 2024 10:13:17 +0100 Subject: [PATCH 55/78] [front] Handle backpressure manually to avoid getting stuck (#9575) --- front/lib/api/files/upload.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/front/lib/api/files/upload.ts b/front/lib/api/files/upload.ts index 54cbd264a1ef..298f2439bd23 100644 --- a/front/lib/api/files/upload.ts +++ b/front/lib/api/files/upload.ts @@ -133,7 +133,32 @@ const extractTextFromFileAndUpload: ProcessingFunction = async ( config.getTextExtractionUrl() ).fromStream(readStream, file.contentType); - await pipeline(processedStream, writeStream); + processedStream.on("data", (chunk) => { + // Handle backpressure + const canWrite = writeStream.write(chunk); + if (!canWrite) { + readStream.pause(); + writeStream.once("drain", () => readStream.resume()); + } + }); + + processedStream.on("end", () => { + writeStream.end(); + }); + + processedStream.on("error", (err) => { + throw err; + }); + + writeStream.on("error", (err) => { + throw err; + }); + + // Await the completion of the writeStream + await new Promise((resolve, reject) => { + writeStream.on("finish", resolve); + writeStream.on("error", reject); + }); return new Ok(undefined); } catch (err) { From 08bac813847bca5ef3413856b3dcc221343508cd Mon Sep 17 00:00:00 2001 From: Thomas Draier Date: Sat, 21 Dec 2024 10:30:30 +0100 Subject: [PATCH 56/78] [front] Check permission before redirecting to stored space (#9593) --- front/pages/w/[wId]/spaces/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/pages/w/[wId]/spaces/index.tsx b/front/pages/w/[wId]/spaces/index.tsx index 4aa898a129db..6996c1e16988 100644 --- a/front/pages/w/[wId]/spaces/index.tsx +++ b/front/pages/w/[wId]/spaces/index.tsx @@ -20,7 +20,7 @@ export const getServerSideProps = withDefaultUserAuthRequirements( ); if (selection.lastSpaceId) { const space = await SpaceResource.fetchById(auth, selection.lastSpaceId); - if (space) { + if (space && space.canList(auth)) { return { redirect: { destination: `/w/${owner.sId}/spaces/${space.sId}`, From 61582c3b1ed0ef0a7754720056be5a5c4f217157 Mon Sep 17 00:00:00 2001 From: thib-martin <168569391+thib-martin@users.noreply.github.com> Date: Sat, 21 Dec 2024 12:32:46 +0100 Subject: [PATCH 57/78] Updating Banner Menu (#9570) * fixing menu * linting * fixing mobile layout * incoporating gab feedback on pricing page * linting * fixing height --- front/components/home/ContentBlocks.tsx | 2 +- front/components/home/LandingLayout.tsx | 1 + front/components/home/menu/config.ts | 211 ++++++++++++------ front/components/plans/PlansTables.tsx | 4 +- front/pages/home/security.tsx | 2 +- .../pages/home/solutions/customer-support.tsx | 4 +- 6 files changed, 151 insertions(+), 73 deletions(-) diff --git a/front/components/home/ContentBlocks.tsx b/front/components/home/ContentBlocks.tsx index 2cd88d677631..a3a2ab6bba9d 100644 --- a/front/components/home/ContentBlocks.tsx +++ b/front/components/home/ContentBlocks.tsx @@ -83,7 +83,7 @@ export const BlogBlock: React.FC = ({ target="_blank" className={classNames( className, - "flex w-full flex-col overflow-hidden rounded-2xl bg-slate-200 drop-shadow-xl", + "flex h-full w-full flex-col overflow-hidden rounded-2xl bg-slate-200 drop-shadow-xl", "group transition duration-300 ease-out", "hover:bg-white" )} diff --git a/front/components/home/LandingLayout.tsx b/front/components/home/LandingLayout.tsx index 0c5b968f85c2..899727b0a36b 100644 --- a/front/components/home/LandingLayout.tsx +++ b/front/components/home/LandingLayout.tsx @@ -100,6 +100,7 @@ export default function LandingLayout({