diff --git a/CHANGELOG.md b/CHANGELOG.md index b9b94a6a..5415abeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,13 @@ This project uses [CalVer](https://calver.org/) (YY.MM.Micro) for product versio ## [Unreleased] ### Added +- (beta) Web sources crawling +- (beta) Re-crawl a website from its action menu to refresh content and re-index all pages ### Changed ### Fixed +- (beta) Re-crawl now works correctly for renamed web sources ### Security diff --git a/apps/api/package.json b/apps/api/package.json index 5dd22a36..49c400d5 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -43,10 +43,10 @@ "@ai-sdk/google": "^3.0.13", "@ai-sdk/google-vertex": "^4.0.28", "@ai-sdk/mcp": "^1.0.30", - "@bull-board/api": "^6.21.2", - "@bull-board/express": "^6.21.2", - "@bull-board/nestjs": "^6.21.2", - "@bull-board/ui": "^6.21.2", + "@bull-board/api": "^6.21.3", + "@bull-board/express": "^6.21.3", + "@bull-board/nestjs": "^6.21.3", + "@bull-board/ui": "^6.21.3", "@caseai-connect/api-contracts": "*", "@google-cloud/aiplatform": "^6.5.0", "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.21.0", @@ -67,12 +67,13 @@ "@opentelemetry/sdk-metrics": "^2.6.1", "@opentelemetry/sdk-node": "^0.214.0", "@opentelemetry/sdk-trace-base": "^2.6.1", + "@spider-cloud/spider-client": "^0.2.0", "ai": "^6.0.87", "axios": "^1.12.2", "bullmq": "^5.70.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.3", - "express-openid-connect": "^2.20.1", + "express-openid-connect": "^2.20.2", "jwks-rsa": "^3.2.0", "langfuse": "^3.38.6", "langfuse-core-v2": "npm:langfuse-core@3.16.2", diff --git a/apps/api/src/domains/agents/shared/agent-session-messages/streaming/master-promts/helpers.ts b/apps/api/src/domains/agents/shared/agent-session-messages/streaming/master-promts/helpers.ts index 967d8010..9134c513 100644 --- a/apps/api/src/domains/agents/shared/agent-session-messages/streaming/master-promts/helpers.ts +++ b/apps/api/src/domains/agents/shared/agent-session-messages/streaming/master-promts/helpers.ts @@ -17,7 +17,7 @@ ${names return `[${name}]: When the user asks about information that may exist in project documents, call the ${name} tool before answering. Use the returned chunks as primary context and avoid inventing facts not present in those chunks.` case ToolName.Sources: - return `[${name}]: After using ${ToolName.RetrieveProjectDocumentChunks} tool, call the ${name} tool to provide the user with the sources of the information you used to answer their question. This will help build trust and allow the user to verify the information.` + return `[${name}]: You MUST call the ${name} tool whenever you use information from the ${ToolName.RetrieveProjectDocumentChunks} tool to answer the user, regardless of whether the chunks come from uploaded documents (documentSourceType="project") or crawled web pages (documentSourceType="webCrawl"). Include EVERY document whose chunks you actually used — do not omit web-crawled pages. For each source, copy the documentId, documentTitle, and documentSourceType verbatim from the retrieved chunks. Do NOT cite sources inline in your text response; the ${name} tool is the only way to show sources to the user.` case ToolName.FillForm: return `[${name}]: You can use the ${name} tool to fill out the form fields. Just fill out the information you have and ask the user for the missing information. You can also update previously filled information if the user changes their answer. Pass undefined for fields that are not filled yet.` diff --git a/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/retrieve-project-document-chunks.tool.ts b/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/retrieve-project-document-chunks.tool.ts index d080a943..a693c39d 100644 --- a/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/retrieve-project-document-chunks.tool.ts +++ b/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/retrieve-project-document-chunks.tool.ts @@ -30,6 +30,7 @@ const retrievedChunkSchema = z.object({ documentId: z.string(), documentTitle: z.string(), documentFileName: z.string().nullable(), + documentSourceType: z.enum(["project", "webCrawl"]), chunkIndex: z.number().int(), content: z.string(), distance: z.number(), diff --git a/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/sources.tool.ts b/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/sources.tool.ts index 174f4a82..f2d91657 100644 --- a/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/sources.tool.ts +++ b/apps/api/src/domains/agents/shared/agent-session-messages/streaming/tools/sources.tool.ts @@ -14,6 +14,16 @@ export function sourcesTool({ sources: z.array( z.object({ documentId: z.string().describe("The ID of the document to retrieve sources from."), + documentTitle: z + .string() + .optional() + .describe("The title of the source document (copy from retrieved chunks)."), + documentSourceType: z + .string() + .optional() + .describe( + "The source type of the document, e.g. 'project' for an uploaded file or 'webCrawl' for a crawled web page (copy from retrieved chunks).", + ), chunks: z .array( z.object({ diff --git a/apps/api/src/domains/documents/crawling/bull-mq-url-crawling-batch.service.ts b/apps/api/src/domains/documents/crawling/bull-mq-url-crawling-batch.service.ts new file mode 100644 index 00000000..50bfd19d --- /dev/null +++ b/apps/api/src/domains/documents/crawling/bull-mq-url-crawling-batch.service.ts @@ -0,0 +1,20 @@ +import { InjectQueue } from "@nestjs/bullmq" +import { Injectable, Logger } from "@nestjs/common" +import type { Queue } from "bullmq" +import { URL_CRAWLING_JOB_NAME, URL_CRAWLING_QUEUE_NAME } from "./url-crawling.constants" +import type { CrawlUrlJobPayload } from "./url-crawling.types" + +@Injectable() +export class BullMqUrlCrawlingBatchService { + private readonly logger = new Logger(BullMqUrlCrawlingBatchService.name) + + constructor( + @InjectQueue(URL_CRAWLING_QUEUE_NAME) + private readonly urlCrawlingQueue: Queue, + ) {} + + async enqueueCrawlUrl(payload: CrawlUrlJobPayload): Promise { + this.logger.log(`Enqueuing URL crawl job ${JSON.stringify(payload)}`) + await this.urlCrawlingQueue.add(URL_CRAWLING_JOB_NAME, payload) + } +} diff --git a/apps/api/src/domains/documents/crawling/bull-mq-web-source-embeddings-batch.service.ts b/apps/api/src/domains/documents/crawling/bull-mq-web-source-embeddings-batch.service.ts new file mode 100644 index 00000000..075718ba --- /dev/null +++ b/apps/api/src/domains/documents/crawling/bull-mq-web-source-embeddings-batch.service.ts @@ -0,0 +1,25 @@ +import { InjectQueue } from "@nestjs/bullmq" +import { Injectable, Logger } from "@nestjs/common" +import type { Queue } from "bullmq" +import type { CreateDocumentEmbeddingsJobPayload } from "../embeddings/document-embeddings.types" +import { + WEB_SOURCE_EMBEDDINGS_JOB_NAME, + WEB_SOURCE_EMBEDDINGS_QUEUE_NAME, +} from "./web-source-embeddings.constants" + +@Injectable() +export class BullMqWebSourceEmbeddingsBatchService { + private readonly logger = new Logger(BullMqWebSourceEmbeddingsBatchService.name) + + constructor( + @InjectQueue(WEB_SOURCE_EMBEDDINGS_QUEUE_NAME) + private readonly webSourceEmbeddingsQueue: Queue, + ) {} + + async enqueueCreateEmbeddingsForDocument( + payload: CreateDocumentEmbeddingsJobPayload, + ): Promise { + this.logger.log(`Enqueuing web source embeddings job ${JSON.stringify(payload)}`) + await this.webSourceEmbeddingsQueue.add(WEB_SOURCE_EMBEDDINGS_JOB_NAME, payload) + } +} diff --git a/apps/api/src/domains/documents/crawling/document-crawl-progress-notifier.service.ts b/apps/api/src/domains/documents/crawling/document-crawl-progress-notifier.service.ts new file mode 100644 index 00000000..cd21c1e9 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/document-crawl-progress-notifier.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from "@nestjs/common" +import { InjectDataSource } from "@nestjs/typeorm" +import type { DataSource } from "typeorm" +import { PostgresStatusNotifierService } from "@/common/sse/postgres-status-notifier.service" +import { DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL } from "./document-crawl-progress.constants" + +@Injectable() +export class DocumentCrawlProgressNotifierService extends PostgresStatusNotifierService { + constructor(@InjectDataSource() dataSource: DataSource) { + super(dataSource, DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL) + } + + async notifyCrawlProgress(params: { + documentId: string + organizationId: string + projectId: string + pagesCrawled: number + updatedAt: number + }): Promise { + await this.notify({ + type: DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL, + documentId: params.documentId, + organizationId: params.organizationId, + projectId: params.projectId, + pagesCrawled: params.pagesCrawled, + updatedAt: params.updatedAt, + }) + } +} diff --git a/apps/api/src/domains/documents/crawling/document-crawl-progress-stream.service.ts b/apps/api/src/domains/documents/crawling/document-crawl-progress-stream.service.ts new file mode 100644 index 00000000..e635fc6c --- /dev/null +++ b/apps/api/src/domains/documents/crawling/document-crawl-progress-stream.service.ts @@ -0,0 +1,16 @@ +import type { DocumentCrawlProgressChangedEventDto } from "@caseai-connect/api-contracts" +import { Injectable } from "@nestjs/common" +import { PostgresStatusStreamService } from "@/common/sse/postgres-status-stream.service" +import { DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL } from "./document-crawl-progress.constants" + +@Injectable() +export class DocumentCrawlProgressStreamService extends PostgresStatusStreamService { + constructor() { + super({ + channel: DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL, + expectedType: DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL, + serviceName: DocumentCrawlProgressStreamService.name, + isExpectedEvent: (payload) => payload.type === DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL, + }) + } +} diff --git a/apps/api/src/domains/documents/crawling/document-crawl-progress.constants.ts b/apps/api/src/domains/documents/crawling/document-crawl-progress.constants.ts new file mode 100644 index 00000000..99ec4109 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/document-crawl-progress.constants.ts @@ -0,0 +1,3 @@ +import { DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL_DTO } from "@caseai-connect/api-contracts" + +export const DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL = DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL_DTO diff --git a/apps/api/src/domains/documents/crawling/e2e-tests/auth.spec.ts b/apps/api/src/domains/documents/crawling/e2e-tests/auth.spec.ts new file mode 100644 index 00000000..59e8e031 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/e2e-tests/auth.spec.ts @@ -0,0 +1,182 @@ +import { randomUUID } from "node:crypto" +import { DocumentsRoutes } from "@caseai-connect/api-contracts" +import type { INestApplication } from "@nestjs/common" +import type { App } from "supertest/types" +import { AUTH_ERRORS } from "@/common/errors/auth-errors" +import { + type AllRepositories, + clearTestDatabase, + setupE2eTestDatabase, + teardownE2eTestDatabase, +} from "@/common/test/test-database" +import { removeNullish } from "@/common/utils/remove-nullish" +import { createOrganizationWithDocument } from "@/domains/organizations/organization.factory" +import { projectFactory } from "@/domains/projects/project.factory" +import { mockForeignAuth0Id } from "../../../../../test/e2e.helpers" +import { expectResponse, type Requester, testRequester } from "../../../../../test/request" +import { DocumentsModule } from "../../documents.module" +import { withCrawlingAndAuthMocks } from "../../test-overrides" + +describe("Documents Crawling - Auth", () => { + let app: INestApplication + let request: Requester + let setup: Awaited> + let repositories: AllRepositories + + let organizationId: string | null = "random-organization-id" + let projectId: string | null = "random-project-id" + let documentId: string | null = "random-document-id" + let accessToken: string | null = "token" + let auth0Id = `auth0|${randomUUID()}` + + beforeAll(async () => { + setup = await setupE2eTestDatabase({ + additionalImports: [DocumentsModule], + applyOverrides: (moduleBuilder) => withCrawlingAndAuthMocks(moduleBuilder, () => auth0Id), + }) + repositories = setup.getAllRepositories() + app = setup.module.createNestApplication() + await app.init() + request = testRequester(app) + }) + + beforeEach(async () => { + await clearTestDatabase(setup.dataSource) + organizationId = "random-organization-id" + projectId = "random-project-id" + documentId = "random-document-id" + accessToken = "token" + auth0Id = `auth0|${randomUUID()}` + }) + + afterAll(async () => { + await teardownE2eTestDatabase(setup) + await app.close() + }) + + const createContextForRole = async (role: "owner" | "admin" | "member" = "owner") => { + const { organization, project, document } = await createOrganizationWithDocument(repositories, { + user: { auth0Id }, + projectMembership: { role }, + document: { sourceType: "webCrawl", sourceUrl: "https://example.com" }, + }) + organizationId = organization.id + projectId = project.id + documentId = document.id + accessToken = "token" + return { organization, project, document } + } + + describe("DocumentsRoutes.crawlUrl", () => { + const subject = async () => + request({ + route: DocumentsRoutes.crawlUrl, + pathParams: removeNullish({ organizationId, projectId }), + token: accessToken ?? undefined, + request: { payload: { url: "https://example.com" } }, + }) + + it("requires an authentication token", async () => { + accessToken = null + expectResponse(await subject(), 401, AUTH_ERRORS.NO_ACCESS_TOKEN) + }) + it("requires a valid organization ID", async () => { + organizationId = null + expectResponse(await subject(), 400, AUTH_ERRORS.NO_ORGANIZATION_ID) + }) + it("requires a valid project ID", async () => { + await createContextForRole("owner") + projectId = randomUUID() + expectResponse(await subject(), 404) + }) + it("requires the user to be a member of the organization", async () => { + await createContextForRole("owner") + auth0Id = mockForeignAuth0Id() + expectResponse(await subject(), 401, AUTH_ERRORS.NOT_MEMBER_OF_ORG) + }) + it("doesn't allow a simple member to crawl a URL", async () => { + await createContextForRole("member") + expectResponse(await subject(), 403, AUTH_ERRORS.UNAUTHORIZED_RESOURCE) + }) + it("allows an admin to crawl a URL", async () => { + await createContextForRole("admin") + expectResponse(await subject(), 202) + }) + }) + + describe("DocumentsRoutes.reCrawlUrl", () => { + const subject = async () => + request({ + route: DocumentsRoutes.reCrawlUrl, + pathParams: removeNullish({ organizationId, projectId, documentId }), + token: accessToken ?? undefined, + }) + + it("requires an authentication token", async () => { + accessToken = null + expectResponse(await subject(), 401, AUTH_ERRORS.NO_ACCESS_TOKEN) + }) + it("requires a valid organization ID", async () => { + organizationId = null + expectResponse(await subject(), 400, AUTH_ERRORS.NO_ORGANIZATION_ID) + }) + it("requires a valid project ID", async () => { + await createContextForRole("owner") + projectId = randomUUID() + expectResponse(await subject(), 404) + }) + it("requires the user to be a member of the organization", async () => { + await createContextForRole("owner") + auth0Id = mockForeignAuth0Id() + expectResponse(await subject(), 401, AUTH_ERRORS.NOT_MEMBER_OF_ORG) + }) + it("requires the document to be part of the project", async () => { + const { organization } = await createContextForRole("owner") + const project2 = await repositories.projectRepository.save( + projectFactory.transient({ organization }).build(), + ) + projectId = project2.id + expectResponse(await subject(), 404) + }) + it("doesn't allow a simple member to recrawl a document", async () => { + await createContextForRole("member") + expectResponse(await subject(), 403, AUTH_ERRORS.UNAUTHORIZED_RESOURCE) + }) + it("allows an admin to recrawl a document", async () => { + await createContextForRole("admin") + expectResponse(await subject(), 202) + }) + }) + + describe("DocumentsRoutes.streamCrawlProgress", () => { + const subject = async () => + request({ + route: DocumentsRoutes.streamCrawlProgress, + pathParams: removeNullish({ organizationId, projectId }), + token: accessToken ?? undefined, + }) + + it("requires an authentication token", async () => { + accessToken = null + expectResponse(await subject(), 401, AUTH_ERRORS.NO_ACCESS_TOKEN) + }) + it("requires a valid organization ID", async () => { + organizationId = null + expectResponse(await subject(), 400, AUTH_ERRORS.NO_ORGANIZATION_ID) + }) + it("requires a valid project ID", async () => { + await createContextForRole("owner") + projectId = randomUUID() + expectResponse(await subject(), 404) + }) + it("requires the user to be a member of the organization", async () => { + await createContextForRole("owner") + auth0Id = mockForeignAuth0Id() + expectResponse(await subject(), 401, AUTH_ERRORS.NOT_MEMBER_OF_ORG) + }) + it("doesn't allow a simple member to stream crawl progress", async () => { + await createContextForRole("member") + expectResponse(await subject(), 403, AUTH_ERRORS.UNAUTHORIZED_RESOURCE) + }) + }) +}) diff --git a/apps/api/src/domains/documents/crawling/e2e-tests/crawl-url.spec.ts b/apps/api/src/domains/documents/crawling/e2e-tests/crawl-url.spec.ts new file mode 100644 index 00000000..bc52c429 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/e2e-tests/crawl-url.spec.ts @@ -0,0 +1,125 @@ +import { DocumentsRoutes } from "@caseai-connect/api-contracts" +import type { INestApplication } from "@nestjs/common" +import type { App } from "supertest/types" +import { + type AllRepositories, + clearTestDatabase, + setupE2eTestDatabase, + teardownE2eTestDatabase, +} from "@/common/test/test-database" +import { removeNullish } from "@/common/utils/remove-nullish" +import { createOrganizationWithProject } from "@/domains/organizations/organization.factory" +import { expectResponse, type Requester, testRequester } from "../../../../../test/request" +import { Document } from "../../document.entity" +import { DocumentsModule } from "../../documents.module" +import { withCrawlingAndAuthMocks } from "../../test-overrides" +import { URL_CRAWLING_BATCH_SERVICE, type UrlCrawlingBatchService } from "../url-crawling-batch.interface" + +describe("Documents - crawlUrl", () => { + let app: INestApplication + let request: Requester + let setup: Awaited> + let repositories: AllRepositories + + let organizationId: string + let projectId: string + let userId: string + let accessToken: string | undefined = "token" + let auth0Id = "auth0|123" + let crawlingBatchServiceMock: { enqueueCrawlUrl: jest.MockedFunction } + + beforeAll(async () => { + setup = await setupE2eTestDatabase({ + additionalImports: [DocumentsModule], + applyOverrides: (moduleBuilder) => withCrawlingAndAuthMocks(moduleBuilder, () => auth0Id), + }) + repositories = setup.getAllRepositories() + crawlingBatchServiceMock = setup.module.get(URL_CRAWLING_BATCH_SERVICE) + app = setup.module.createNestApplication() + await app.init() + request = testRequester(app) + }) + + beforeEach(async () => { + await clearTestDatabase(setup.dataSource) + accessToken = "token" + auth0Id = "auth0|123" + crawlingBatchServiceMock.enqueueCrawlUrl.mockClear() + }) + + afterAll(async () => { + await teardownE2eTestDatabase(setup) + await app.close() + }) + + const createContext = async () => { + const { user, organization, project } = await createOrganizationWithProject(repositories, { + user: { auth0Id }, + }) + userId = user.id + organizationId = organization.id + projectId = project.id + } + + const subject = async (payload: { url: string; name?: string }) => + request({ + route: DocumentsRoutes.crawlUrl, + pathParams: removeNullish({ organizationId, projectId }), + token: accessToken, + request: { payload }, + }) + + it("creates a webCrawl document and enqueues the crawl job", async () => { + await createContext() + + const url = "https://example.com" + const response = await subject({ url }) + + expectResponse(response, 202) + expect(response.body.data.message).toContain(url) + + const documents = await repositories.documentRepository.find({ + where: { projectId, sourceType: "webCrawl" }, + }) + expect(documents).toHaveLength(1) + const document = documents[0] as Document + expect(document.sourceType).toBe("webCrawl") + expect(document.sourceUrl).toBe(url) + expect(document.title).toBe(url) + expect(document.mimeType).toBe("text/html") + expect(document.embeddingStatus).toBe("pending") + + expect(crawlingBatchServiceMock.enqueueCrawlUrl).toHaveBeenCalledWith( + expect.objectContaining({ + documentId: document.id, + url, + organizationId, + projectId, + requestedByUserId: userId, + }), + ) + }) + + it("uses the optional name as the document title", async () => { + await createContext() + + const url = "https://example.com" + const name = "My Documentation Site" + await subject({ url, name }) + + const documents = await repositories.documentRepository.find({ + where: { projectId, sourceType: "webCrawl" }, + }) + expect(documents[0]?.title).toBe(name) + expect(documents[0]?.sourceUrl).toBe(url) + }) + + it("rejects an invalid URL with 422", async () => { + await createContext() + + const response = await subject({ url: "not-a-valid-url" }) + + expectResponse(response, 422, "Invalid URL.") + expect(crawlingBatchServiceMock.enqueueCrawlUrl).not.toHaveBeenCalled() + }) +}) diff --git a/apps/api/src/domains/documents/crawling/e2e-tests/recrawl-url.spec.ts b/apps/api/src/domains/documents/crawling/e2e-tests/recrawl-url.spec.ts new file mode 100644 index 00000000..b03e703c --- /dev/null +++ b/apps/api/src/domains/documents/crawling/e2e-tests/recrawl-url.spec.ts @@ -0,0 +1,155 @@ +import { DocumentsRoutes } from "@caseai-connect/api-contracts" +import type { INestApplication } from "@nestjs/common" +import type { App } from "supertest/types" +import { + type AllRepositories, + clearTestDatabase, + setupE2eTestDatabase, + teardownE2eTestDatabase, +} from "@/common/test/test-database" +import { removeNullish } from "@/common/utils/remove-nullish" +import { createOrganizationWithDocument } from "@/domains/organizations/organization.factory" +import { expectResponse, type Requester, testRequester } from "../../../../../test/request" +import { DocumentsModule } from "../../documents.module" +import { DocumentEmbeddingStatusNotifierService } from "../../embeddings/document-embedding-status-notifier.service" +import { withCrawlingAndAuthMocks } from "../../test-overrides" +import { URL_CRAWLING_BATCH_SERVICE, type UrlCrawlingBatchService } from "../url-crawling-batch.interface" + +describe("Documents - reCrawlUrl", () => { + let app: INestApplication + let request: Requester + let setup: Awaited> + let repositories: AllRepositories + + let organizationId: string + let projectId: string + let documentId: string + let accessToken: string | undefined = "token" + let auth0Id = "auth0|123" + let crawlingBatchServiceMock: { enqueueCrawlUrl: jest.MockedFunction } + let notifierMock: { notifyEmbeddingStatusChanged: jest.MockedFunction } + + beforeAll(async () => { + setup = await setupE2eTestDatabase({ + additionalImports: [DocumentsModule], + applyOverrides: (moduleBuilder) => withCrawlingAndAuthMocks(moduleBuilder, () => auth0Id), + }) + repositories = setup.getAllRepositories() + crawlingBatchServiceMock = setup.module.get(URL_CRAWLING_BATCH_SERVICE) + notifierMock = setup.module.get(DocumentEmbeddingStatusNotifierService) + app = setup.module.createNestApplication() + await app.init() + request = testRequester(app) + }) + + beforeEach(async () => { + await clearTestDatabase(setup.dataSource) + accessToken = "token" + auth0Id = "auth0|123" + crawlingBatchServiceMock.enqueueCrawlUrl.mockClear() + notifierMock.notifyEmbeddingStatusChanged.mockClear() + }) + + afterAll(async () => { + await teardownE2eTestDatabase(setup) + await app.close() + }) + + const createContext = async (overrides?: Partial<{ sourceUrl: string | null; title: string; content: string | null; embeddingStatus: string }>) => { + const { user, organization, project, document } = await createOrganizationWithDocument( + repositories, + { + user: { auth0Id }, + document: { + sourceType: "webCrawl", + sourceUrl: overrides?.sourceUrl !== undefined ? overrides.sourceUrl : "https://example.com", + title: overrides?.title ?? "https://example.com", + content: overrides?.content !== undefined ? overrides.content : null, + embeddingStatus: (overrides?.embeddingStatus as "completed") ?? "completed", + }, + }, + ) + organizationId = organization.id + projectId = project.id + documentId = document.id + return { user, organization, project, document } + } + + const subject = async () => + request({ + route: DocumentsRoutes.reCrawlUrl, + pathParams: removeNullish({ organizationId, projectId, documentId }), + token: accessToken, + }) + + it("resets the document and re-enqueues the crawl job using sourceUrl", async () => { + await createContext({ sourceUrl: "https://example.com" }) + + const response = await subject() + + expectResponse(response, 202) + expect(response.body.data.message).toContain("https://example.com") + + const document = await repositories.documentRepository.findOne({ where: { id: documentId } }) + expect(document?.embeddingStatus).toBe("pending") + expect(document?.content).toBeNull() + expect(document?.embeddingError).toBeNull() + + expect(crawlingBatchServiceMock.enqueueCrawlUrl).toHaveBeenCalledWith( + expect.objectContaining({ url: "https://example.com", documentId, organizationId, projectId }), + ) + expect(notifierMock.notifyEmbeddingStatusChanged).toHaveBeenCalledWith( + expect.objectContaining({ documentId, embeddingStatus: "pending" }), + ) + }) + + it("falls back to title when sourceUrl is null and title is a valid URL", async () => { + await createContext({ sourceUrl: null, title: "https://fallback.example.com" }) + + const response = await subject() + + expectResponse(response, 202) + expect(crawlingBatchServiceMock.enqueueCrawlUrl).toHaveBeenCalledWith( + expect.objectContaining({ url: "https://fallback.example.com" }), + ) + }) + + it("falls back to shortest URL in content when sourceUrl is null and title is an alias", async () => { + const content = JSON.stringify([ + { url: "https://example.com/page1", markdown: "" }, + { url: "https://example.com", markdown: "" }, + ]) + await createContext({ sourceUrl: null, title: "My Site Alias", content }) + + const response = await subject() + + expectResponse(response, 202) + expect(crawlingBatchServiceMock.enqueueCrawlUrl).toHaveBeenCalledWith( + expect.objectContaining({ url: "https://example.com" }), + ) + }) + + it("rejects documents that are not webCrawl type", async () => { + const { organization, project } = await createOrganizationWithDocument(repositories, { + user: { auth0Id }, + document: { sourceType: "project" }, + }) + organizationId = organization.id + projectId = project.id + documentId = (await repositories.documentRepository.findOne({ where: { projectId } }))!.id + + const response = await subject() + + expectResponse(response, 422, "Document is not a web crawl source.") + expect(crawlingBatchServiceMock.enqueueCrawlUrl).not.toHaveBeenCalled() + }) + + it("rejects when sourceUrl is null, title is not a URL, and content is empty", async () => { + await createContext({ sourceUrl: null, title: "Just a name", content: null }) + + const response = await subject() + + expectResponse(response, 422, "Source URL not available for this document. Please delete it and crawl the website again.") + expect(crawlingBatchServiceMock.enqueueCrawlUrl).not.toHaveBeenCalled() + }) +}) diff --git a/apps/api/src/domains/documents/crawling/url-crawling-batch.interface.ts b/apps/api/src/domains/documents/crawling/url-crawling-batch.interface.ts new file mode 100644 index 00000000..ab95fbd4 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/url-crawling-batch.interface.ts @@ -0,0 +1,7 @@ +import type { CrawlUrlJobPayload } from "./url-crawling.types" + +export const URL_CRAWLING_BATCH_SERVICE = "URL_CRAWLING_BATCH_SERVICE" + +export interface UrlCrawlingBatchService { + enqueueCrawlUrl(payload: CrawlUrlJobPayload): Promise +} diff --git a/apps/api/src/domains/documents/crawling/url-crawling-batch.module.ts b/apps/api/src/domains/documents/crawling/url-crawling-batch.module.ts new file mode 100644 index 00000000..510bf0e9 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/url-crawling-batch.module.ts @@ -0,0 +1,30 @@ +import { BullModule } from "@nestjs/bullmq" +import { Module } from "@nestjs/common" +import { ConfigModule } from "@nestjs/config" +import { getBullMqConnection } from "@/bullmq.config" +import { BullMqUrlCrawlingBatchService } from "./bull-mq-url-crawling-batch.service" +import { URL_CRAWLING_QUEUE_NAME } from "./url-crawling.constants" +import { URL_CRAWLING_BATCH_SERVICE } from "./url-crawling-batch.interface" + +@Module({ + imports: [ + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: () => ({ + connection: getBullMqConnection(), + }), + }), + BullModule.registerQueue({ + name: URL_CRAWLING_QUEUE_NAME, + }), + ], + providers: [ + BullMqUrlCrawlingBatchService, + { + provide: URL_CRAWLING_BATCH_SERVICE, + useExisting: BullMqUrlCrawlingBatchService, + }, + ], + exports: [URL_CRAWLING_BATCH_SERVICE], +}) +export class UrlCrawlingBatchModule {} diff --git a/apps/api/src/domains/documents/crawling/url-crawling-processor.service.ts b/apps/api/src/domains/documents/crawling/url-crawling-processor.service.ts new file mode 100644 index 00000000..64ec3008 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/url-crawling-processor.service.ts @@ -0,0 +1,111 @@ +import { Inject, Injectable, Logger } from "@nestjs/common" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { SpiderClientService } from "@/external/spider/spider-client.service" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { DocumentsService } from "../documents.service" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { DocumentEmbeddingStatusNotifierService } from "../embeddings/document-embedding-status-notifier.service" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { DocumentCrawlProgressNotifierService } from "./document-crawl-progress-notifier.service" +import type { CrawlUrlJobPayload } from "./url-crawling.types" +import { + WEB_SOURCE_EMBEDDINGS_BATCH_SERVICE, + type WebSourceEmbeddingsBatchService, +} from "./web-source-embeddings-batch.interface" + +@Injectable() +export class UrlCrawlingProcessorService { + private readonly logger = new Logger(UrlCrawlingProcessorService.name) + + constructor( + private readonly spiderClientService: SpiderClientService, + private readonly documentsService: DocumentsService, + private readonly embeddingStatusNotifierService: DocumentEmbeddingStatusNotifierService, + private readonly crawlProgressNotifierService: DocumentCrawlProgressNotifierService, + @Inject(WEB_SOURCE_EMBEDDINGS_BATCH_SERVICE) + private readonly embeddingsBatchService: WebSourceEmbeddingsBatchService, + ) {} + + async processCrawlJob(payload: CrawlUrlJobPayload): Promise { + this.logger.log(`Processing full-site crawl job for ${payload.url}`) + + const connectScope = { + organizationId: payload.organizationId, + projectId: payload.projectId, + } + + let pagesCrawled = 0 + + try { + const pages = await this.spiderClientService.crawlUrl({ + url: payload.url, + onPage: () => { + pagesCrawled += 1 + this.crawlProgressNotifierService + .notifyCrawlProgress({ + documentId: payload.documentId, + organizationId: payload.organizationId, + projectId: payload.projectId, + pagesCrawled, + updatedAt: Date.now(), + }) + .catch((error) => { + this.logger.error( + `Failed to emit crawl progress for ${payload.documentId}: ${(error as Error).message}`, + ) + }) + }, + }) + + this.logger.log(`Crawled ${pages.length} pages from ${payload.url}`) + + const contentPages = pages.map((page) => ({ + url: page.url, + markdown: page.markdown, + })) + const contentJson = JSON.stringify(contentPages) + + await this.documentsService.updateContent({ + connectScope, + documentId: payload.documentId, + content: contentJson, + size: Buffer.byteLength(contentJson, "utf-8"), + }) + + await this.embeddingsBatchService.enqueueCreateEmbeddingsForDocument({ + documentId: payload.documentId, + organizationId: payload.organizationId, + projectId: payload.projectId, + uploadedByUserId: payload.requestedByUserId, + origin: "web-crawl", + currentTraceId: payload.currentTraceId, + }) + + this.logger.log( + `Updated document ${payload.documentId} with ${pages.length} pages crawled at ${payload.url}`, + ) + } catch (error) { + this.logger.error(`Crawl failed for ${payload.url}: ${(error as Error).message}`) + try { + await this.documentsService.updateEmbeddingStatus({ + connectScope, + documentId: payload.documentId, + status: "failed", + }) + await this.embeddingStatusNotifierService.notifyEmbeddingStatusChanged({ + documentId: payload.documentId, + organizationId: payload.organizationId, + projectId: payload.projectId, + embeddingStatus: "failed", + embeddingError: null, + updatedAt: Date.now(), + }) + } catch (notifyError) { + this.logger.error( + `Failed to mark document ${payload.documentId} as failed: ${(notifyError as Error).message}`, + ) + } + throw error + } + } +} diff --git a/apps/api/src/domains/documents/crawling/url-crawling-workers.module.ts b/apps/api/src/domains/documents/crawling/url-crawling-workers.module.ts new file mode 100644 index 00000000..7f8e1658 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/url-crawling-workers.module.ts @@ -0,0 +1,41 @@ +import { BullModule } from "@nestjs/bullmq" +import { Module } from "@nestjs/common" +import { ConfigModule } from "@nestjs/config" +import { TypeOrmModule } from "@nestjs/typeorm" +import { getBullMqConnection } from "@/bullmq.config" +import { ALL_ENTITIES } from "@/common/all-entities" +import { SpiderClientService } from "@/external/spider/spider-client.service" +import { DocumentsService } from "../documents.service" +import { DocumentEmbeddingStatusNotifierService } from "../embeddings/document-embedding-status-notifier.service" +import { DocumentTagsService } from "../tags/document-tags.service" +import { DocumentCrawlProgressNotifierService } from "./document-crawl-progress-notifier.service" +import { URL_CRAWLING_QUEUE_NAME } from "./url-crawling.constants" +import { UrlCrawlingWorker } from "./url-crawling.worker" +import { UrlCrawlingProcessorService } from "./url-crawling-processor.service" +import { WebSourceEmbeddingsBatchModule } from "./web-source-embeddings-batch.module" + +@Module({ + imports: [ + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: () => ({ + connection: getBullMqConnection(), + }), + }), + BullModule.registerQueue({ + name: URL_CRAWLING_QUEUE_NAME, + }), + TypeOrmModule.forFeature(ALL_ENTITIES), + WebSourceEmbeddingsBatchModule, + ], + providers: [ + UrlCrawlingWorker, + UrlCrawlingProcessorService, + SpiderClientService, + DocumentsService, + DocumentTagsService, + DocumentEmbeddingStatusNotifierService, + DocumentCrawlProgressNotifierService, + ], +}) +export class UrlCrawlingWorkersModule {} diff --git a/apps/api/src/domains/documents/crawling/url-crawling.constants.ts b/apps/api/src/domains/documents/crawling/url-crawling.constants.ts new file mode 100644 index 00000000..c0b4010a --- /dev/null +++ b/apps/api/src/domains/documents/crawling/url-crawling.constants.ts @@ -0,0 +1,5 @@ +const DEFAULT_URL_CRAWLING_QUEUE_NAME = "url-crawling" + +export const URL_CRAWLING_QUEUE_NAME = + process.env.URL_CRAWLING_QUEUE_NAME ?? DEFAULT_URL_CRAWLING_QUEUE_NAME +export const URL_CRAWLING_JOB_NAME = "crawl-url" diff --git a/apps/api/src/domains/documents/crawling/url-crawling.types.ts b/apps/api/src/domains/documents/crawling/url-crawling.types.ts new file mode 100644 index 00000000..d9b2a1eb --- /dev/null +++ b/apps/api/src/domains/documents/crawling/url-crawling.types.ts @@ -0,0 +1,8 @@ +export type CrawlUrlJobPayload = { + documentId: string + url: string + organizationId: string + projectId: string + requestedByUserId: string + currentTraceId: string +} diff --git a/apps/api/src/domains/documents/crawling/url-crawling.worker.ts b/apps/api/src/domains/documents/crawling/url-crawling.worker.ts new file mode 100644 index 00000000..c5186138 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/url-crawling.worker.ts @@ -0,0 +1,42 @@ +import { OnWorkerEvent, Processor, WorkerHost } from "@nestjs/bullmq" +import { Logger } from "@nestjs/common" +import type { Job } from "bullmq" +import { URL_CRAWLING_JOB_NAME, URL_CRAWLING_QUEUE_NAME } from "./url-crawling.constants" +import type { CrawlUrlJobPayload } from "./url-crawling.types" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { UrlCrawlingProcessorService } from "./url-crawling-processor.service" + +@Processor(URL_CRAWLING_QUEUE_NAME) +export class UrlCrawlingWorker extends WorkerHost { + private readonly logger = new Logger(UrlCrawlingWorker.name) + + constructor(private readonly crawlingProcessorService: UrlCrawlingProcessorService) { + super() + } + + async process(job: Job): Promise { + if (job.name !== URL_CRAWLING_JOB_NAME) { + return + } + + await this.crawlingProcessorService.processCrawlJob(job.data) + } + + @OnWorkerEvent("active") + onActive(job: Job): void { + this.logger.log(`Job active: ${job.name} (${job.id})`) + } + + @OnWorkerEvent("completed") + onCompleted(job: Job): void { + this.logger.log(`Job completed: ${job.name} (${job.id})`) + } + + @OnWorkerEvent("failed") + onFailed(job: Job | undefined, error: Error): void { + this.logger.error( + `Job failed: ${job?.name ?? "unknown"} (${job?.id ?? "unknown"})`, + error.stack, + ) + } +} diff --git a/apps/api/src/domains/documents/crawling/web-source-embeddings-batch.interface.ts b/apps/api/src/domains/documents/crawling/web-source-embeddings-batch.interface.ts new file mode 100644 index 00000000..912c1891 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/web-source-embeddings-batch.interface.ts @@ -0,0 +1,7 @@ +import type { CreateDocumentEmbeddingsJobPayload } from "../embeddings/document-embeddings.types" + +export const WEB_SOURCE_EMBEDDINGS_BATCH_SERVICE = "WEB_SOURCE_EMBEDDINGS_BATCH_SERVICE" + +export interface WebSourceEmbeddingsBatchService { + enqueueCreateEmbeddingsForDocument(payload: CreateDocumentEmbeddingsJobPayload): Promise +} diff --git a/apps/api/src/domains/documents/crawling/web-source-embeddings-batch.module.ts b/apps/api/src/domains/documents/crawling/web-source-embeddings-batch.module.ts new file mode 100644 index 00000000..a8a8449a --- /dev/null +++ b/apps/api/src/domains/documents/crawling/web-source-embeddings-batch.module.ts @@ -0,0 +1,22 @@ +import { BullModule } from "@nestjs/bullmq" +import { Module } from "@nestjs/common" +import { BullMqWebSourceEmbeddingsBatchService } from "./bull-mq-web-source-embeddings-batch.service" +import { WEB_SOURCE_EMBEDDINGS_QUEUE_NAME } from "./web-source-embeddings.constants" +import { WEB_SOURCE_EMBEDDINGS_BATCH_SERVICE } from "./web-source-embeddings-batch.interface" + +@Module({ + imports: [ + BullModule.registerQueue({ + name: WEB_SOURCE_EMBEDDINGS_QUEUE_NAME, + }), + ], + providers: [ + BullMqWebSourceEmbeddingsBatchService, + { + provide: WEB_SOURCE_EMBEDDINGS_BATCH_SERVICE, + useExisting: BullMqWebSourceEmbeddingsBatchService, + }, + ], + exports: [WEB_SOURCE_EMBEDDINGS_BATCH_SERVICE], +}) +export class WebSourceEmbeddingsBatchModule {} diff --git a/apps/api/src/domains/documents/crawling/web-source-embeddings-workers.module.ts b/apps/api/src/domains/documents/crawling/web-source-embeddings-workers.module.ts new file mode 100644 index 00000000..d050c50c --- /dev/null +++ b/apps/api/src/domains/documents/crawling/web-source-embeddings-workers.module.ts @@ -0,0 +1,39 @@ +import { BullModule } from "@nestjs/bullmq" +import { Module } from "@nestjs/common" +import { ConfigModule } from "@nestjs/config" +import { TypeOrmModule } from "@nestjs/typeorm" +import { getBullMqConnection } from "@/bullmq.config" +import { ALL_ENTITIES } from "@/common/all-entities" +import { DocumentsService } from "../documents.service" +import { DocumentEmbeddingStatusNotifierService } from "../embeddings/document-embedding-status-notifier.service" +import { DocumentEmbeddingsProcessorService } from "../embeddings/document-embeddings-processor.service" +import { DocumentTextExtractorService } from "../embeddings/document-text-extractor.service" +import { StorageModule } from "../storage/storage.module" +import { DocumentTagsService } from "../tags/document-tags.service" +import { WEB_SOURCE_EMBEDDINGS_QUEUE_NAME } from "./web-source-embeddings.constants" +import { WebSourceEmbeddingsWorker } from "./web-source-embeddings.worker" + +@Module({ + imports: [ + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: () => ({ + connection: getBullMqConnection(), + }), + }), + BullModule.registerQueue({ + name: WEB_SOURCE_EMBEDDINGS_QUEUE_NAME, + }), + TypeOrmModule.forFeature(ALL_ENTITIES), + StorageModule, + ], + providers: [ + WebSourceEmbeddingsWorker, + DocumentEmbeddingsProcessorService, + DocumentEmbeddingStatusNotifierService, + DocumentTextExtractorService, + DocumentsService, + DocumentTagsService, + ], +}) +export class WebSourceEmbeddingsWorkersModule {} diff --git a/apps/api/src/domains/documents/crawling/web-source-embeddings.constants.ts b/apps/api/src/domains/documents/crawling/web-source-embeddings.constants.ts new file mode 100644 index 00000000..68cdde46 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/web-source-embeddings.constants.ts @@ -0,0 +1,5 @@ +const DEFAULT_WEB_SOURCE_EMBEDDINGS_QUEUE_NAME = "web-source-embeddings" + +export const WEB_SOURCE_EMBEDDINGS_QUEUE_NAME = + process.env.WEB_SOURCE_EMBEDDINGS_QUEUE_NAME ?? DEFAULT_WEB_SOURCE_EMBEDDINGS_QUEUE_NAME +export const WEB_SOURCE_EMBEDDINGS_JOB_NAME = "create-web-source-embeddings" diff --git a/apps/api/src/domains/documents/crawling/web-source-embeddings.worker.ts b/apps/api/src/domains/documents/crawling/web-source-embeddings.worker.ts new file mode 100644 index 00000000..683b0ab7 --- /dev/null +++ b/apps/api/src/domains/documents/crawling/web-source-embeddings.worker.ts @@ -0,0 +1,45 @@ +import { OnWorkerEvent, Processor, WorkerHost } from "@nestjs/bullmq" +import { Logger } from "@nestjs/common" +import type { Job } from "bullmq" +import type { CreateDocumentEmbeddingsJobPayload } from "../embeddings/document-embeddings.types" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { DocumentEmbeddingsProcessorService } from "../embeddings/document-embeddings-processor.service" +import { + WEB_SOURCE_EMBEDDINGS_JOB_NAME, + WEB_SOURCE_EMBEDDINGS_QUEUE_NAME, +} from "./web-source-embeddings.constants" + +@Processor(WEB_SOURCE_EMBEDDINGS_QUEUE_NAME) +export class WebSourceEmbeddingsWorker extends WorkerHost { + private readonly logger = new Logger(WebSourceEmbeddingsWorker.name) + + constructor(private readonly embeddingsProcessorService: DocumentEmbeddingsProcessorService) { + super() + } + + async process(job: Job): Promise { + if (job.name !== WEB_SOURCE_EMBEDDINGS_JOB_NAME) { + return + } + + await this.embeddingsProcessorService.processDocument(job.data) + } + + @OnWorkerEvent("active") + onActive(job: Job): void { + this.logger.log(`Job active: ${job.name} (${job.id})`) + } + + @OnWorkerEvent("completed") + onCompleted(job: Job): void { + this.logger.log(`Job completed: ${job.name} (${job.id})`) + } + + @OnWorkerEvent("failed") + onFailed(job: Job | undefined, error: Error): void { + this.logger.error( + `Job failed: ${job?.name ?? "unknown"} (${job?.id ?? "unknown"})`, + error.stack, + ) + } +} diff --git a/apps/api/src/domains/documents/document.entity.ts b/apps/api/src/domains/documents/document.entity.ts index 2a83d784..37e11a5a 100644 --- a/apps/api/src/domains/documents/document.entity.ts +++ b/apps/api/src/domains/documents/document.entity.ts @@ -34,6 +34,9 @@ export class Document extends ConnectEntityBase { @Column({ name: "storage_relative_path", nullable: true }) storageRelativePath!: string + @Column({ name: "source_url", type: "text", nullable: true }) + sourceUrl!: string | null + @Column({ name: "source_type", nullable: false }) sourceType!: | "project" @@ -41,6 +44,7 @@ export class Document extends ConnectEntityBase { | "extraction" | "evaluationExtractionDataset" | "evaluationExtractionRun" + | "webCrawl" @Column({ name: "embedding_status", nullable: false, default: "pending" }) embeddingStatus!: "pending" | "queued" | "processing" | "completed" | "failed" diff --git a/apps/api/src/domains/documents/document.factory.ts b/apps/api/src/domains/documents/document.factory.ts index 8ba87be4..63bd5cb3 100644 --- a/apps/api/src/domains/documents/document.factory.ts +++ b/apps/api/src/domains/documents/document.factory.ts @@ -37,6 +37,7 @@ export const documentFactory = DocumentFactory.define(({ sequence, params, trans size: params.size || 1024, storageRelativePath: params.storageRelativePath || `documents/file_${sequence}.txt`, sourceType: params.sourceType || "project", + sourceUrl: params.sourceUrl ?? null, embeddingStatus: params.embeddingStatus || "pending", embeddingError: params.embeddingError ?? null, extractionEngine: params.extractionEngine ?? null, diff --git a/apps/api/src/domains/documents/documents.controller.ts b/apps/api/src/domains/documents/documents.controller.ts index d9d9579a..3c1e5383 100644 --- a/apps/api/src/domains/documents/documents.controller.ts +++ b/apps/api/src/domains/documents/documents.controller.ts @@ -1,4 +1,5 @@ import { + type DocumentCrawlProgressChangedEventDto, type DocumentDto, type DocumentEmbeddingStatusChangedEventDto, type DocumentSourceType, @@ -46,6 +47,12 @@ import type { MulterFile } from "@/common/types" import { TrackActivity } from "@/domains/activities/track-activity.decorator" import { JwtAuthGuard } from "@/domains/auth/jwt-auth.guard" import { UserGuard } from "@/domains/users/user.guard" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { DocumentCrawlProgressStreamService } from "./crawling/document-crawl-progress-stream.service" +import { + URL_CRAWLING_BATCH_SERVICE, + type UrlCrawlingBatchService, +} from "./crawling/url-crawling-batch.interface" import type { Document } from "./document.entity" import { DocumentsGuard } from "./documents.guard" import { @@ -56,6 +63,8 @@ import { // biome-ignore lint/style/useImportType: Required at runtime for NestJS DI import { DocumentsService } from "./documents.service" // biome-ignore lint/style/useImportType: Required at runtime for NestJS DI +import { DocumentEmbeddingStatusNotifierService } from "./embeddings/document-embedding-status-notifier.service" +// biome-ignore lint/style/useImportType: Required at runtime for NestJS DI import { DocumentEmbeddingStatusStreamService } from "./embeddings/document-embedding-status-stream.service" import { DOCUMENT_EMBEDDINGS_BATCH_SERVICE, @@ -73,8 +82,12 @@ export class DocumentsController { private readonly fileStorageService: IFileStorage, @Inject(DOCUMENT_EMBEDDINGS_BATCH_SERVICE) private readonly documentEmbeddingsBatchService: DocumentEmbeddingsBatchService, + @Inject(URL_CRAWLING_BATCH_SERVICE) + private readonly urlCrawlingBatchService: UrlCrawlingBatchService, private readonly documentsService: DocumentsService, private readonly documentEmbeddingStatusStreamService: DocumentEmbeddingStatusStreamService, + private readonly documentCrawlProgressStreamService: DocumentCrawlProgressStreamService, + private readonly documentEmbeddingStatusNotifierService: DocumentEmbeddingStatusNotifierService, ) {} @CheckPolicy((policy) => policy.canCreate()) @@ -239,14 +252,19 @@ export class DocumentsController { payload.tagIds !== undefined && payload.tagIds.length > 0 ? payload.tagIds : undefined for (const documentId of payload.documentIds) { - let document = await this.documentsService.markAsUploaded({ connectScope, documentId }) + await this.documentsService.markAsUploaded({ connectScope, documentId }) + let document: Document if (tagIds !== undefined) { document = await this.documentsService.updateDocument({ connectScope, - documentId: document.id, + documentId, fieldsToUpdate: { tagsToAdd: tagIds }, }) + } else { + const found = await this.documentsService.findById({ connectScope, documentId }) + if (!found) throw new NotFoundException(`Document ${documentId} not found`) + document = found } if (document.sourceType === "project") { @@ -300,8 +318,9 @@ export class DocumentsController { @Get(DocumentsRoutes.getAll.path) async getAll( @Request() req: EndpointRequestWithProject, + @Param("sourceType") sourceType: DocumentSourceType, ): Promise { - const documents = await this.documentsService.listDocuments(getRequiredConnectScope(req)) + const documents = await this.documentsService.listDocuments(getRequiredConnectScope(req), sourceType) return { data: documents.map(toDocumentDto) } } @@ -357,6 +376,108 @@ export class DocumentsController { return { data: { url } } } + @CheckPolicy((policy) => policy.canCreate()) + @Post(DocumentsRoutes.crawlUrl.path) + @TrackActivity({ action: "document.crawlUrl" }) + @HttpCode(HttpStatus.ACCEPTED) + async crawlUrl( + @Body() { payload }: typeof DocumentsRoutes.crawlUrl.request, + @Request() req: EndpointRequestWithProject, + ): Promise { + try { + new URL(payload.url) + } catch { + throw new UnprocessableEntityException("Invalid URL.") + } + + const connectScope = getRequiredConnectScope(req) + + const documentId = v4() + await this.documentsService.createDocument({ + connectScope, + documentId, + uploadStatus: "uploaded", + fields: { + title: payload.name ?? payload.url, + mimeType: "text/html", + sourceType: "webCrawl", + sourceUrl: payload.url, + size: 0, + fileName: null as unknown as string, + storageRelativePath: null as unknown as string, + }, + }) + + await this.urlCrawlingBatchService.enqueueCrawlUrl({ + documentId, + url: payload.url, + organizationId: connectScope.organizationId, + projectId: connectScope.projectId, + requestedByUserId: req.user.id, + currentTraceId: v4(), + }) + + return { + data: { + message: `Crawling ${payload.url}. Documents will appear as they are processed.`, + }, + } + } + + @CheckPolicy((policy) => policy.canUpdate()) + @Post(DocumentsRoutes.reCrawlUrl.path) + @TrackActivity({ action: "document.reCrawlUrl", entityFrom: "document" }) + @AddContext("document") + @HttpCode(HttpStatus.ACCEPTED) + async reCrawlUrl( + @Request() req: EndpointRequestWithDocument, + ): Promise { + const document = req.document + + if (document.sourceType !== "webCrawl") { + throw new UnprocessableEntityException("Document is not a web crawl source.") + } + + if (!document.sourceUrl) { + throw new UnprocessableEntityException( + "Source URL not available for this document. Please delete it and crawl the website again.", + ) + } + + const urlToRecrawl = document.sourceUrl + + const connectScope = getRequiredConnectScope(req) + + await this.documentsService.resetForRecrawl({ + connectScope, + documentId: document.id, + }) + + await this.documentEmbeddingStatusNotifierService.notifyEmbeddingStatusChanged({ + documentId: document.id, + organizationId: document.organizationId, + projectId: document.projectId, + embeddingStatus: "pending", + embeddingError: null, + updatedAt: Date.now(), + }) + + await this.urlCrawlingBatchService.enqueueCrawlUrl({ + documentId: document.id, + url: urlToRecrawl, + organizationId: connectScope.organizationId, + projectId: connectScope.projectId, + requestedByUserId: req.user.id, + currentTraceId: v4(), + }) + + return { + data: { + message: `Re-crawling ${urlToRecrawl}. Pages will be updated as they are processed.`, + }, + } + } + @CheckPolicy((policy) => policy.canList()) @Sse(DocumentsRoutes.streamEmbeddingStatus.path, { method: 0 /* GET */ }) streamEmbeddingStatus( @@ -372,14 +493,48 @@ export class DocumentsController { map((event) => ({ ...event, data: JSON.stringify(event) })), ) } + + @CheckPolicy((policy) => policy.canList()) + @Sse(DocumentsRoutes.streamCrawlProgress.path, { method: 0 /* GET */ }) + streamCrawlProgress( + @Request() req: EndpointRequestWithProject, + ): Observable { + const connectScope = getRequiredConnectScope(req) + return this.documentCrawlProgressStreamService.events$.pipe( + filter( + (event) => + event.organizationId === connectScope.organizationId && + event.projectId === connectScope.projectId, + ), + map((event) => ({ ...event, data: JSON.stringify(event) })), + ) + } +} + + +function parseCrawledPages( + content: string | null, +): { url: string; markdown: string }[] | undefined { + if (!content) return undefined + try { + const parsed: unknown = JSON.parse(content) + if (Array.isArray(parsed) && parsed.length > 0 && parsed[0].url && parsed[0].markdown) { + return parsed as { url: string; markdown: string }[] + } + } catch { + // malformed content + } + return undefined } function toDocumentDto(entity: Document): DocumentDto { + const isWebCrawl = entity.sourceType === "webCrawl" return { id: entity.id, projectId: entity.projectId, title: entity.title, - content: entity.content, + content: isWebCrawl ? undefined : entity.content, + pages: isWebCrawl ? parseCrawledPages(entity.content) : undefined, fileName: entity.fileName, createdAt: entity.createdAt.getTime(), updatedAt: entity.updatedAt.getTime(), @@ -388,6 +543,8 @@ function toDocumentDto(entity: Document): DocumentDto { mimeType: entity.mimeType as MimeTypes, size: entity.size, storageRelativePath: entity.storageRelativePath, + sourceType: entity.sourceType, + sourceUrl: entity.sourceUrl ?? null, embeddingStatus: entity.embeddingStatus, embeddingError: entity.embeddingError ?? null, tagIds: entity.tags?.map((tag) => tag.id) || [], diff --git a/apps/api/src/domains/documents/documents.module.ts b/apps/api/src/domains/documents/documents.module.ts index 458917de..e7ea02af 100644 --- a/apps/api/src/domains/documents/documents.module.ts +++ b/apps/api/src/domains/documents/documents.module.ts @@ -14,11 +14,14 @@ import { ProjectMembership } from "@/domains/projects/memberships/project-member import { Project } from "@/domains/projects/project.entity" import { ProjectsModule } from "@/domains/projects/projects.module" import { UsersModule } from "@/domains/users/users.module" +import { DocumentCrawlProgressStreamService } from "./crawling/document-crawl-progress-stream.service" +import { UrlCrawlingBatchModule } from "./crawling/url-crawling-batch.module" import { Document } from "./document.entity" import { DocumentsController } from "./documents.controller" import { DocumentsGuard } from "./documents.guard" import { DocumentsService } from "./documents.service" import { DocumentChunkRetrievalService } from "./embeddings/document-chunk-retrieval.service" +import { DocumentEmbeddingStatusNotifierService } from "./embeddings/document-embedding-status-notifier.service" import { DocumentEmbeddingStatusStreamService } from "./embeddings/document-embedding-status-stream.service" import { DocumentEmbeddingsBatchModule } from "./embeddings/document-embeddings-batch.module" import { LocalPresignUploadController } from "./storage/local-presign-upload.controller" @@ -55,10 +58,13 @@ import { DocumentTagsModule } from "./tags/document-tags.module" AuthModule, StorageModule, DocumentEmbeddingsBatchModule, + UrlCrawlingBatchModule, ], providers: [ DocumentsService, DocumentEmbeddingStatusStreamService, + DocumentEmbeddingStatusNotifierService, + DocumentCrawlProgressStreamService, DocumentChunkRetrievalService, DocumentsGuard, ResourceContextGuard, diff --git a/apps/api/src/domains/documents/documents.service.ts b/apps/api/src/domains/documents/documents.service.ts index 5aae1055..6d44d65e 100644 --- a/apps/api/src/domains/documents/documents.service.ts +++ b/apps/api/src/domains/documents/documents.service.ts @@ -1,6 +1,6 @@ import { Injectable, NotFoundException } from "@nestjs/common" import { InjectRepository } from "@nestjs/typeorm" -import type { Repository } from "typeorm" +import type { Repository, UpdateResult } from "typeorm" import { ConnectRepository } from "@/common/entities/connect-repository" import type { RequiredConnectScope } from "@/common/entities/connect-required-fields" import { Document } from "./document.entity" @@ -11,7 +11,7 @@ import type { DocumentTagsUpdateFields } from "./tags/document-tags.types" @Injectable() export class DocumentsService { constructor( - @InjectRepository(Document) documentRepository: Repository, + @InjectRepository(Document) private readonly documentRepository: Repository, private readonly documentTagsService: DocumentTagsService, ) { this.documentConnectRepository = new ConnectRepository(documentRepository, "documents") @@ -30,7 +30,8 @@ export class DocumentsService { fields: Pick< Document, "fileName" | "mimeType" | "size" | "storageRelativePath" | "title" | "sourceType" - > + > & + Partial> uploadStatus: "pending" | "uploaded" tagIds?: string[] }): Promise { @@ -42,6 +43,8 @@ export class DocumentsService { storageRelativePath: fields.storageRelativePath, title: fields.title ?? fields.fileName, sourceType: fields.sourceType, + sourceUrl: fields.sourceUrl ?? null, + content: fields.content, uploadStatus, }) @@ -63,22 +66,25 @@ export class DocumentsService { }: { connectScope: RequiredConnectScope documentId: string - }): Promise { - const document = await this.documentConnectRepository.getOneById(connectScope, documentId) - if (!document) { + }): Promise { + const result: UpdateResult = await this.documentRepository.update( + { id: documentId, organizationId: connectScope.organizationId, projectId: connectScope.projectId }, + { uploadStatus: "uploaded" }, + ) + if (!result.affected) { throw new NotFoundException(`Document with id ${documentId} not found`) } - document.uploadStatus = "uploaded" - return this.documentConnectRepository.saveOne(document) } private sortNewestFirst = (a: Document, b: Document) => b.createdAt.getTime() - a.createdAt.getTime() - async listDocuments(connectScope: RequiredConnectScope): Promise { + async listDocuments(connectScope: RequiredConnectScope, sourceType: Document["sourceType"]): Promise { return ( await this.documentConnectRepository.find(connectScope, { - where: { sourceType: "project", uploadStatus: "uploaded" }, + where: [ + { sourceType, uploadStatus: "uploaded" } + ], relations: ["tags"], }) )?.sort(this.sortNewestFirst) @@ -151,10 +157,64 @@ export class DocumentsService { return this.documentConnectRepository.saveOne(document) } + async updateContent({ + connectScope, + documentId, + content, + size, + }: { + connectScope: RequiredConnectScope + documentId: string + content: string + size: number + }): Promise { + const result: UpdateResult = await this.documentRepository.update( + { id: documentId, organizationId: connectScope.organizationId, projectId: connectScope.projectId }, + { content, size }, + ) + if (!result.affected) { + throw new NotFoundException(`Document with id ${documentId} not found`) + } + } + async saveOne(document: Document): Promise { return this.documentConnectRepository.saveOne(document) } + async updateEmbeddingStatus({ + connectScope, + documentId, + status, + }: { + connectScope: RequiredConnectScope + documentId: string + status: Document["embeddingStatus"] + }): Promise { + const result: UpdateResult = await this.documentRepository.update( + { id: documentId, organizationId: connectScope.organizationId, projectId: connectScope.projectId }, + { embeddingStatus: status }, + ) + if (!result.affected) { + throw new NotFoundException(`Document with id ${documentId} not found`) + } + } + + async resetForRecrawl({ + connectScope, + documentId, + }: { + connectScope: RequiredConnectScope + documentId: string + }): Promise { + const result: UpdateResult = await this.documentRepository.update( + { id: documentId, organizationId: connectScope.organizationId, projectId: connectScope.projectId }, + { content: null as unknown as string, embeddingStatus: "pending", embeddingError: null }, + ) + if (!result.affected) { + throw new NotFoundException(`Document with id ${documentId} not found`) + } + } + async deleteDocument({ connectScope, documentId, diff --git a/apps/api/src/domains/documents/embeddings/document-chunk-retrieval.service.ts b/apps/api/src/domains/documents/embeddings/document-chunk-retrieval.service.ts index 925f5f2e..80009ce2 100644 --- a/apps/api/src/domains/documents/embeddings/document-chunk-retrieval.service.ts +++ b/apps/api/src/domains/documents/embeddings/document-chunk-retrieval.service.ts @@ -13,6 +13,7 @@ export type RetrievedDocumentChunk = { documentId: string documentTitle: string documentFileName: string | null + documentSourceType: string chunkIndex: number content: string distance: number @@ -97,6 +98,7 @@ export class DocumentChunkRetrievalService { .addSelect("chunk.document_id", "documentId") .addSelect("document.title", "documentTitle") .addSelect("document.file_name", "documentFileName") + .addSelect("document.source_type", "documentSourceType") .addSelect("chunk.chunk_index", "chunkIndex") .addSelect("chunk.content", "content") .addSelect("embedding.model_name", "modelName") @@ -114,7 +116,9 @@ export class DocumentChunkRetrievalService { .andWhere("document.embedding_status = :embeddingStatus", { embeddingStatus: "completed", }) - .andWhere("document.source_type = :projectSourceType", { projectSourceType: "project" }) + .andWhere("document.source_type IN (:...allowedSourceTypes)", { + allowedSourceTypes: ["project", "webCrawl"], + }) .andWhere("chunk.deleted_at IS NULL") .andWhere("embedding.deleted_at IS NULL") .andWhere("document.deleted_at IS NULL") diff --git a/apps/api/src/domains/documents/embeddings/document-embeddings-processor.service.ts b/apps/api/src/domains/documents/embeddings/document-embeddings-processor.service.ts index 3d5369bf..4dc45342 100644 --- a/apps/api/src/domains/documents/embeddings/document-embeddings-processor.service.ts +++ b/apps/api/src/domains/documents/embeddings/document-embeddings-processor.service.ts @@ -93,13 +93,19 @@ export class DocumentEmbeddingsProcessorService { chunks: string[] extractionEngine: DocumentExtractionEngine }> { - const fileBuffer = await this.fileStorage.readFile(document.storageRelativePath) - const extractionResult = await this.textExtractorService.extract(fileBuffer, document.mimeType) - const chunks = extractionResult.chunks ?? this.splitTextForEmbeddings(extractionResult.text) - this.logger.log(`Split document ${document.id} into ${chunks.length} chunks`) - return { - chunks, - extractionEngine: extractionResult.extractionEngine, + switch (document.sourceType) { + case "webCrawl": { + const chunks = this.splitWebCrawlContent(document.content ?? "") + this.logger.log(`Split document ${document.id} (from content) into ${chunks.length} chunks`) + return { chunks, extractionEngine: "web-crawl" } + } + default: { + const fileBuffer = await this.fileStorage.readFile(document.storageRelativePath) + const extractionResult = await this.textExtractorService.extract(fileBuffer, document.mimeType) + const chunks = extractionResult.chunks ?? this.splitTextForEmbeddings(extractionResult.text) + this.logger.log(`Split document ${document.id} into ${chunks.length} chunks`) + return { chunks, extractionEngine: extractionResult.extractionEngine } + } } } @@ -115,6 +121,15 @@ export class DocumentEmbeddingsProcessorService { .filter((chunk) => chunk.length > 0) } + private splitWebCrawlContent(content: string): string[] { + try { + const pages: { url: string; markdown: string }[] = JSON.parse(content) + return pages.flatMap((page) => this.splitTextForEmbeddings(page.markdown)) + } catch { + return this.splitTextForEmbeddings(content) + } + } + private async generateEmbeddingsByModel(chunks: string[]): Promise> { const { project, location } = resolveVertexConfig() const embeddingModelNames = resolveEmbeddingModelNames() diff --git a/apps/api/src/domains/documents/embeddings/document-embeddings.types.ts b/apps/api/src/domains/documents/embeddings/document-embeddings.types.ts index 850f0755..37d50ba5 100644 --- a/apps/api/src/domains/documents/embeddings/document-embeddings.types.ts +++ b/apps/api/src/domains/documents/embeddings/document-embeddings.types.ts @@ -5,7 +5,7 @@ export type CreateDocumentEmbeddingsJobPayload = { organizationId: string projectId: string uploadedByUserId: string - origin: "document-upload" + origin: "document-upload" | "web-crawl" currentTraceId: string } diff --git a/apps/api/src/domains/documents/service-tests/list-documents.spec.ts b/apps/api/src/domains/documents/service-tests/list-documents.spec.ts index 17d58443..ce14134d 100644 --- a/apps/api/src/domains/documents/service-tests/list-documents.spec.ts +++ b/apps/api/src/domains/documents/service-tests/list-documents.spec.ts @@ -25,10 +25,13 @@ describe("listDocuments", () => { }) await repositories.documentRepository.save([document1, document2, deletedDocument]) - const result = await service.listDocuments({ - organizationId: organization.id, - projectId: project.id, - }) + const result = await service.listDocuments( + { + organizationId: organization.id, + projectId: project.id, + }, + "project", + ) expect(result).toHaveLength(2) expect(result.map((r) => r.title)).toContain("Document 1") diff --git a/apps/api/src/domains/documents/test-overrides.ts b/apps/api/src/domains/documents/test-overrides.ts index 6e217c6b..25f04a2d 100644 --- a/apps/api/src/domains/documents/test-overrides.ts +++ b/apps/api/src/domains/documents/test-overrides.ts @@ -1,5 +1,7 @@ import type { TestingModuleBuilder } from "@nestjs/testing" import { setupUserGuardForTesting } from "../../../test/e2e.helpers" +import { URL_CRAWLING_BATCH_SERVICE } from "./crawling/url-crawling-batch.interface" +import { DocumentEmbeddingStatusNotifierService } from "./embeddings/document-embedding-status-notifier.service" import { DOCUMENT_EMBEDDINGS_BATCH_SERVICE } from "./embeddings/document-embeddings-batch.interface" function createDocumentEmbeddingsBatchServiceMock() { @@ -26,3 +28,37 @@ export function withDocumentAuthAndEmbeddingsMocks( ): TestingModuleBuilder { return setupUserGuardForTesting(withDocumentEmbeddingsBatchServiceMock(moduleBuilder), getAuth0Id) } + +function createUrlCrawlingBatchServiceMock() { + return { enqueueCrawlUrl: jest.fn().mockResolvedValue(undefined) } +} + +export function withUrlCrawlingBatchServiceMock( + moduleBuilder: TestingModuleBuilder, +): TestingModuleBuilder { + return moduleBuilder + .overrideProvider(URL_CRAWLING_BATCH_SERVICE) + .useValue(createUrlCrawlingBatchServiceMock()) +} + +export function withDocumentEmbeddingStatusNotifierMock( + moduleBuilder: TestingModuleBuilder, +): TestingModuleBuilder { + return moduleBuilder + .overrideProvider(DocumentEmbeddingStatusNotifierService) + .useValue({ notifyEmbeddingStatusChanged: jest.fn().mockResolvedValue(undefined) }) +} + +export function withCrawlingAndAuthMocks( + moduleBuilder: TestingModuleBuilder, + getAuth0Id: () => string, +): TestingModuleBuilder { + return setupUserGuardForTesting( + withUrlCrawlingBatchServiceMock( + withDocumentEmbeddingsBatchServiceMock( + withDocumentEmbeddingStatusNotifierMock(moduleBuilder), + ), + ), + getAuth0Id, + ) +} diff --git a/apps/api/src/external/spider/spider-client.service.ts b/apps/api/src/external/spider/spider-client.service.ts new file mode 100644 index 00000000..07f91844 --- /dev/null +++ b/apps/api/src/external/spider/spider-client.service.ts @@ -0,0 +1,46 @@ +import { Injectable, Logger } from "@nestjs/common" +import { Spider } from "@spider-cloud/spider-client" +import { resolveSpiderApiKey } from "./spider.constants" + +export type CrawledPage = { + url: string + markdown: string +} + +@Injectable() +export class SpiderClientService { + private readonly logger = new Logger(SpiderClientService.name) + + async crawlUrl(params: { + url: string + onPage?: (page: CrawledPage) => void + }): Promise { + const apiKey = resolveSpiderApiKey() + const spider = new Spider({ apiKey }) + + this.logger.log(`Streaming full-site crawl of ${params.url}`) + + const pages: CrawledPage[] = [] + + await spider.crawlUrl( + params.url, + { limit: 0, return_format: "markdown", metadata: true }, + true, + (chunk) => { + const items = Array.isArray(chunk) ? chunk : [chunk] + for (const item of items) { + if (!item?.content || item.content.trim().length === 0) continue + const page: CrawledPage = { + url: item.url ?? params.url, + markdown: item.content, + } + pages.push(page) + params.onPage?.(page) + } + }, + ) + + this.logger.log(`Crawled ${pages.length} pages from ${params.url}`) + return pages + } +} diff --git a/apps/api/src/external/spider/spider.constants.ts b/apps/api/src/external/spider/spider.constants.ts new file mode 100644 index 00000000..879158d1 --- /dev/null +++ b/apps/api/src/external/spider/spider.constants.ts @@ -0,0 +1,9 @@ +export const SPIDER_API_KEY_ENV = "SPIDER_API_KEY" + +export function resolveSpiderApiKey(): string { + const apiKey = process.env[SPIDER_API_KEY_ENV] + if (!apiKey) { + throw new Error(`${SPIDER_API_KEY_ENV} environment variable is not set`) + } + return apiKey +} diff --git a/apps/api/src/migrations/1777288885700-add-source-url-to-document.ts b/apps/api/src/migrations/1777288885700-add-source-url-to-document.ts new file mode 100644 index 00000000..5fb57cad --- /dev/null +++ b/apps/api/src/migrations/1777288885700-add-source-url-to-document.ts @@ -0,0 +1,13 @@ +import type { MigrationInterface, QueryRunner } from "typeorm" + +export class AddSourceUrlToDocument1777288885700 implements MigrationInterface { + name = "AddSourceUrlToDocument1777288885700" + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "document" ADD "source_url" text`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "document" DROP COLUMN "source_url"`) + } +} diff --git a/apps/api/src/workers-app.module.ts b/apps/api/src/workers-app.module.ts index 0f331e0e..debf6f1f 100644 --- a/apps/api/src/workers-app.module.ts +++ b/apps/api/src/workers-app.module.ts @@ -5,6 +5,8 @@ import { TypeOrmModule } from "@nestjs/typeorm" import { getBullMqConnection } from "./bullmq.config" import { WorkersHealthModule } from "./common/workers-health/workers-health.module" import typeorm from "./config/typeorm" +import { UrlCrawlingWorkersModule } from "./domains/documents/crawling/url-crawling-workers.module" +import { WebSourceEmbeddingsWorkersModule } from "./domains/documents/crawling/web-source-embeddings-workers.module" import { DocumentEmbeddingsWorkersModule } from "./domains/documents/embeddings/document-embeddings-workers.module" import { StorageModule } from "./domains/documents/storage/storage.module" import { EvaluationExtractionRunWorkersModule } from "./domains/evaluations/extraction/runs/evaluation-extraction-run-workers.module" @@ -28,6 +30,8 @@ import { EvaluationExtractionRunWorkersModule } from "./domains/evaluations/extr }), DocumentEmbeddingsWorkersModule, EvaluationExtractionRunWorkersModule, + UrlCrawlingWorkersModule, + WebSourceEmbeddingsWorkersModule, StorageModule, WorkersHealthModule, ], diff --git a/apps/web/src/common/features/agents/agent-sessions/shared/agent-session-messages/components/SourcesTool.tsx b/apps/web/src/common/features/agents/agent-sessions/shared/agent-session-messages/components/SourcesTool.tsx index 9af7beee..b0f46a77 100644 --- a/apps/web/src/common/features/agents/agent-sessions/shared/agent-session-messages/components/SourcesTool.tsx +++ b/apps/web/src/common/features/agents/agent-sessions/shared/agent-session-messages/components/SourcesTool.tsx @@ -2,44 +2,59 @@ import { Button } from "@caseai-connect/ui/shad/button" import { Item, ItemTitle } from "@caseai-connect/ui/shad/item" import { Label } from "@caseai-connect/ui/shad/label" import { Popover, PopoverContent, PopoverTrigger } from "@caseai-connect/ui/shad/popover" +import { FileTextIcon, GlobeIcon } from "lucide-react" import { useTranslation } from "react-i18next" import type { AgentSessionMessage as AgentSessionMessageType } from "@/common/features/agents/agent-sessions/shared/agent-session-messages/agent-session-messages.models" +type Source = { + documentId: string + documentTitle?: string + documentSourceType?: string + chunks: { + chunkId: string + partialContent: string + }[] +} + export function SourcesTool({ toolCall, }: { toolCall: NonNullable[number] }) { const { t } = useTranslation() - const sources = toolCall.arguments.sources as unknown as { - documentId: string - chunks: { - chunkId: string - partialContent: string - }[] - }[] + const sources = toolCall.arguments.sources as unknown as Source[] return ( - - - - {sources.map((source) => ( -
- {source.chunks.map((chunk) => ( - - {chunk.partialContent} - - ))} -
- ))} + + {sources.length > 1 && } + {sources.map((source) => { + const isWebCrawl = source.documentSourceType === "webCrawl" + return ( +
+ {source.documentTitle ? ( +
+ {isWebCrawl ? ( + + ) : ( + + )} + {source.documentTitle} +
+ ) : null} + {source.chunks.map((chunk) => ( + + {chunk.partialContent} + + ))} +
+ ) + })}
) diff --git a/apps/web/src/common/features/agents/locales/agent.en.json b/apps/web/src/common/features/agents/locales/agent.en.json index 29e1c86d..5fffc188 100644 --- a/apps/web/src/common/features/agents/locales/agent.en.json +++ b/apps/web/src/common/features/agents/locales/agent.en.json @@ -98,8 +98,8 @@ "form": "Form", "sources": "Sources" }, - "source_one": "Source", - "source_other": "Sources", + "source_one": "{{count}} source", + "source_other": "{{count}} sources", "source_zero": "No sources" } } diff --git a/apps/web/src/common/features/agents/locales/agent.fr.json b/apps/web/src/common/features/agents/locales/agent.fr.json index 3807303b..059a3e76 100644 --- a/apps/web/src/common/features/agents/locales/agent.fr.json +++ b/apps/web/src/common/features/agents/locales/agent.fr.json @@ -98,8 +98,8 @@ "form": "Formulaire", "sources": "Sources" }, - "source_one": "Source", - "source_other": "Sources", + "source_one": "{{count}} source", + "source_other": "{{count}} sources", "source_zero": "Aucune source" } } diff --git a/apps/web/src/common/hooks/use-feature-flags.ts b/apps/web/src/common/hooks/use-feature-flags.ts index b47abf49..c23d8165 100644 --- a/apps/web/src/common/hooks/use-feature-flags.ts +++ b/apps/web/src/common/hooks/use-feature-flags.ts @@ -13,12 +13,12 @@ export function useFeatureFlags(project?: Project) { const p = useAppSelector(selectCurrentProjectData) if (project) { return { - hasFeature: (feature: FeatureFlagKey): boolean => check(project.featureFlags || [], feature), + hasFeature: (feature: FeatureFlagKey): boolean => check(project.featureFlags || [], feature) } } else { if (!ADS.isFulfilled(p)) return { hasFeature: () => false } return { - hasFeature: (feature: FeatureFlagKey): boolean => check(p.value.featureFlags || [], feature), + hasFeature: (feature: FeatureFlagKey): boolean => check(p.value.featureFlags || [], feature) } } } diff --git a/apps/web/src/studio/features/documents/components/CrawlUrlButton.tsx b/apps/web/src/studio/features/documents/components/CrawlUrlButton.tsx new file mode 100644 index 00000000..d7c12ee8 --- /dev/null +++ b/apps/web/src/studio/features/documents/components/CrawlUrlButton.tsx @@ -0,0 +1,102 @@ +import { Button } from "@caseai-connect/ui/shad/button" +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@caseai-connect/ui/shad/dialog" +import { Field, FieldGroup, FieldLabel } from "@caseai-connect/ui/shad/field" +import { Input } from "@caseai-connect/ui/shad/input" +import { zodResolver } from "@hookform/resolvers/zod" +import { GlobeIcon, Loader2Icon } from "lucide-react" +import { useState } from "react" +import { useForm } from "react-hook-form" +import { useTranslation } from "react-i18next" +import { z } from "zod" +import { useAppDispatch } from "@/common/store/hooks" +import { crawlUrl } from "../documents.thunks" + +const crawlUrlSchema = z.object({ + url: z.string().url(), + name: z.string(), +}) + +type CrawlUrlFormData = z.infer + +export function CrawlUrlButton() { + const [open, setOpen] = useState(false) + + return ( + + + + + + setOpen(false)} /> + + + ) +} + +function CrawlUrlForm({ onSuccess }: { onSuccess: () => void }) { + const dispatch = useAppDispatch() + const { t } = useTranslation("document") + + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + } = useForm({ + resolver: zodResolver(crawlUrlSchema), + defaultValues: { url: "", name: "" }, + }) + + const onSubmit = async (data: CrawlUrlFormData) => { + await dispatch(crawlUrl({ url: data.url, name: data.name.trim() || undefined })).unwrap() + onSuccess() + } + + return ( +
+ + {t("document:crawl.title")} + {t("document:crawl.description")} + +
+ + + {t("document:crawl.urlLabel")} + + {errors.url &&

{errors.url.message}

} +
+ + {t("document:crawl.nameLabel")} + + +
+
+ +
+
+
+ ) +} diff --git a/apps/web/src/studio/features/documents/components/DocumentDetailsSheet.tsx b/apps/web/src/studio/features/documents/components/DocumentDetailsSheet.tsx index 68564c02..c3ed0143 100644 --- a/apps/web/src/studio/features/documents/components/DocumentDetailsSheet.tsx +++ b/apps/web/src/studio/features/documents/components/DocumentDetailsSheet.tsx @@ -9,10 +9,12 @@ import { import { InfoIcon } from "lucide-react" import { useTranslation } from "react-i18next" import { MarkdownWrapper } from "@/common/features/agents/agent-sessions/shared/agent-session-messages/components/MarkdownWrapper" +import { useAppSelector } from "@/common/store/hooks" import { buildDate } from "@/common/utils/build-date" import { DocumentTagItem } from "@/studio/features/document-tags/components/DocumentTagItem" import type { DocumentTag } from "@/studio/features/document-tags/document-tags.models" import type { Document } from "@/studio/features/documents/documents.models" +import { selectCrawlProgressByDocumentId } from "@/studio/features/documents/documents.selectors" import { EmbeddingStatusBadge } from "./EmbeddingStatusBadge" export function DocumentDetailsSheet({ @@ -23,6 +25,7 @@ export function DocumentDetailsSheet({ documentTags: DocumentTag[] }) { const { t } = useTranslation("document", { keyPrefix: "props" }) + const pagesCrawled = useAppSelector(selectCrawlProgressByDocumentId)[document.id] return ( @@ -44,7 +47,11 @@ export function DocumentDetailsSheet({
{t("embeddingStatus")}: - +
{document.embeddingError && ( diff --git a/apps/web/src/studio/features/documents/components/DocumentItem.tsx b/apps/web/src/studio/features/documents/components/DocumentItem.tsx index b96c0590..78ddc333 100644 --- a/apps/web/src/studio/features/documents/components/DocumentItem.tsx +++ b/apps/web/src/studio/features/documents/components/DocumentItem.tsx @@ -1,7 +1,9 @@ import { GridItem } from "@/common/components/grid/Grid" +import { useAppSelector } from "@/common/store/hooks" import { buildSince } from "@/common/utils/build-date" import type { DocumentTag } from "@/studio/features/document-tags/document-tags.models" import type { Document } from "@/studio/features/documents/documents.models" +import { selectCrawlProgressByDocumentId } from "@/studio/features/documents/documents.selectors" import { DocumentDeletor } from "./DocumentDeletor" import { DocumentDetailsSheet } from "./DocumentDetailsSheet" import { DocumentEditor } from "./DocumentEditor" @@ -18,11 +20,18 @@ export function DocumentItem({ documentTags: DocumentTag[] }) { const date = buildSince(document.updatedAt) + const pagesCrawled = useAppSelector(selectCrawlProgressByDocumentId)[document.id] return ( } + badge={ + + } title={
{document.title}
} description={date} action={ diff --git a/apps/web/src/studio/features/documents/components/EmbeddingStatusBadge.tsx b/apps/web/src/studio/features/documents/components/EmbeddingStatusBadge.tsx index 02ae0e73..ade30d70 100644 --- a/apps/web/src/studio/features/documents/components/EmbeddingStatusBadge.tsx +++ b/apps/web/src/studio/features/documents/components/EmbeddingStatusBadge.tsx @@ -3,24 +3,54 @@ import { Loader2Icon } from "lucide-react" import { useTranslation } from "react-i18next" import type { Document } from "@/studio/features/documents/documents.models" -export function EmbeddingStatusBadge({ status }: { status: Document["embeddingStatus"] }) { - const { t } = useTranslation("document", { keyPrefix: "props.embeddingStatuses" }) - const showsProcessingSpinner = - status === "pending" || status === "queued" || status === "processing" - const displayStatus = showsProcessingSpinner ? "processing" : status +type EmbeddingStatus = Document["embeddingStatus"] +type SourceType = Document["sourceType"] + +const WEB_CRAWL_LABEL_KEY: Record = { + pending: "crawling", + queued: "crawling", + processing: "embedding", + completed: "ready", + failed: "failed", +} + +const DEFAULT_LABEL_KEY: Record = { + pending: "processing", + queued: "processing", + processing: "processing", + completed: "completed", + failed: "failed", +} + +const BADGE_VARIANT: Record = { + pending: "outline", + queued: "outline", + processing: "outline", + completed: "success", + failed: "destructive", +} - const statusBadgeVariant: Record = { - pending: "outline", - queued: "outline", - processing: "outline", - completed: "success", - failed: "destructive", - } +export function EmbeddingStatusBadge({ + status, + sourceType, + pagesCrawled, +}: { + status: EmbeddingStatus + sourceType?: SourceType + pagesCrawled?: number +}) { + const { t } = useTranslation("document", { keyPrefix: "props.embeddingStatuses" }) + const isCrawling = sourceType === "webCrawl" && (status === "pending" || status === "queued") + const showSpinner = status === "pending" || status === "queued" || status === "processing" + const label = + isCrawling && typeof pagesCrawled === "number" && pagesCrawled > 0 + ? t("crawlingWithCount", { count: pagesCrawled }) + : t(sourceType === "webCrawl" ? WEB_CRAWL_LABEL_KEY[status] : DEFAULT_LABEL_KEY[status]) return ( - - {displayStatus === "processing" && } - {t(displayStatus)} + + {showSpinner && } + {label} ) } diff --git a/apps/web/src/studio/features/documents/components/UploadDocumentsButton.tsx b/apps/web/src/studio/features/documents/components/UploadDocumentsButton.tsx index 7b51d025..d6506bdb 100644 --- a/apps/web/src/studio/features/documents/components/UploadDocumentsButton.tsx +++ b/apps/web/src/studio/features/documents/components/UploadDocumentsButton.tsx @@ -10,7 +10,8 @@ import { DialogHeader, DialogTitle, } from "@caseai-connect/ui/shad/dialog" -import { FieldLabel } from "@caseai-connect/ui/shad/field" +import { Field, FieldLabel } from "@caseai-connect/ui/shad/field" +import { Input } from "@caseai-connect/ui/shad/input" import { XIcon } from "lucide-react" import { useEffect, useState } from "react" import { useTranslation } from "react-i18next" @@ -38,6 +39,7 @@ export function UploadDocumentsButton({ const [open, setOpen] = useState(false) const [tagIds, setTagIds] = useState([]) const [filesCount, setFilesCount] = useState(0) + const [name, setName] = useState("") const hasAvailableTags = documentTags.length > 0 const [startProcessingFiles, setStartProcessingFiles] = useState(!hasAvailableTags) @@ -63,6 +65,7 @@ export function UploadDocumentsButton({ files, sourceType: "project", tagIds: tagIds.length > 0 ? tagIds : undefined, + name: filesCount === 1 && name.trim() ? name.trim() : undefined, }), ).unwrap() } @@ -80,6 +83,7 @@ export function UploadDocumentsButton({ if (!open) { setTagIds([]) setFilesCount(0) + setName("") setStartProcessingFiles(false) } return () => { @@ -114,6 +118,19 @@ export function UploadDocumentsButton({

{t("document:upload.tagDialog.fileCountSentence", { count: filesCount })}

+ {filesCount === 1 && ( + + + {t("document:upload.tagDialog.nameLabel")} + + setName(event.target.value)} + /> + + )}
{t("document:props.tags")}
diff --git a/apps/web/src/studio/features/documents/documents-stream-events.spec.ts b/apps/web/src/studio/features/documents/documents-stream-events.spec.ts index 99dc8dad..d39c391b 100644 --- a/apps/web/src/studio/features/documents/documents-stream-events.spec.ts +++ b/apps/web/src/studio/features/documents/documents-stream-events.spec.ts @@ -17,6 +17,7 @@ function buildDocument(documentId: string): Document { mimeType: MimeTypes.pdf, size: 123, storageRelativePath: "/documents/file.pdf", + sourceType: "project", embeddingStatus: "processing", embeddingError: null, tagIds: [], diff --git a/apps/web/src/studio/features/documents/documents-stream-status.ts b/apps/web/src/studio/features/documents/documents-stream-status.ts index 6f143056..07b3eca6 100644 --- a/apps/web/src/studio/features/documents/documents-stream-status.ts +++ b/apps/web/src/studio/features/documents/documents-stream-status.ts @@ -1,10 +1,16 @@ import { createStreamStatusManager } from "@/common/sse/stream-status-manager" import type { AppDispatch, RootState } from "@/common/store/types" import { + selectHasDocumentsCrawling, selectHasDocumentsInProgress, + selectIsCrawlProgressStreamActive, selectIsEmbeddingStatusStreamActive, } from "./documents.selectors" -import { listDocuments, streamDocumentEmbeddingStatuses } from "./documents.thunks" +import { + listDocuments, + streamDocumentCrawlProgresses, + streamDocumentEmbeddingStatuses, +} from "./documents.thunks" type AbortableStreamTask = { abort: () => void; unwrap: () => Promise } type StreamListenerApi = { @@ -12,7 +18,7 @@ type StreamListenerApi = { getState: () => RootState } -const manager = createStreamStatusManager({ +const embeddingManager = createStreamStatusManager({ selectIsStreamActive: selectIsEmbeddingStatusStreamActive, selectHasItemsInProgress: selectHasDocumentsInProgress, dispatchStreamThunk: (listenerApi) => @@ -20,14 +26,27 @@ const manager = createStreamStatusManager({ dispatchRefresh: (listenerApi) => listenerApi.dispatch(listDocuments()), }) +const crawlProgressManager = createStreamStatusManager({ + selectIsStreamActive: selectIsCrawlProgressStreamActive, + selectHasItemsInProgress: selectHasDocumentsCrawling, + dispatchStreamThunk: (listenerApi) => + listenerApi.dispatch(streamDocumentCrawlProgresses()) as unknown as AbortableStreamTask, + dispatchRefresh: (listenerApi) => listenerApi.dispatch(listDocuments()), +}) + export function stopDocumentEmbeddingStatusStream() { - manager.stop() + embeddingManager.stop() +} + +export function stopDocumentCrawlProgressStream() { + crawlProgressManager.stop() } export function syncDocumentEmbeddingStatusStreamWithDocuments( listenerApi: StreamListenerApi, ): void { - manager.sync(listenerApi) + embeddingManager.sync(listenerApi) + crawlProgressManager.sync(listenerApi) } export async function handleDocumentsContextChanged(listenerApi: StreamListenerApi): Promise { @@ -38,5 +57,11 @@ export async function handleDocumentsContextChanged(listenerApi: StreamListenerA export async function startDocumentEmbeddingStatusStream( listenerApi: StreamListenerApi, ): Promise { - await manager.start(listenerApi) + await embeddingManager.start(listenerApi) +} + +export async function startDocumentCrawlProgressStream( + listenerApi: StreamListenerApi, +): Promise { + await crawlProgressManager.start(listenerApi) } diff --git a/apps/web/src/studio/features/documents/documents.middleware.ts b/apps/web/src/studio/features/documents/documents.middleware.ts index 9ca2ada7..7ec78203 100644 --- a/apps/web/src/studio/features/documents/documents.middleware.ts +++ b/apps/web/src/studio/features/documents/documents.middleware.ts @@ -1,6 +1,7 @@ import { createListenerMiddleware, isAnyOf } from "@reduxjs/toolkit" import { notificationsActions } from "@/common/features/notifications/notifications.slice" import { hasProjectChanged } from "@/common/features/projects/projects.selectors" +import { ADS } from "@/common/store/async-data-status" import type { AppDispatch, RootState } from "@/common/store/types" import { createDocumentTag, @@ -10,6 +11,7 @@ import { import { selectUploaderState } from "./documents.selectors" import { documentsActions } from "./documents.slice" import { + crawlUrl, deleteDocument, listDocuments, updateDocument, @@ -18,7 +20,9 @@ import { } from "./documents.thunks" import { handleDocumentsContextChanged, + startDocumentCrawlProgressStream, startDocumentEmbeddingStatusStream, + stopDocumentCrawlProgressStream, stopDocumentEmbeddingStatusStream, syncDocumentEmbeddingStatusStreamWithDocuments, } from "./documents-stream-status" @@ -51,9 +55,37 @@ function registerListeners() { }) listenerMiddleware.startListening({ - actionCreator: documentsActions.patchDocumentEmbeddingStatus, + actionCreator: documentsActions.startCrawlProgressStream, effect: async (_, listenerApi) => { + await startDocumentCrawlProgressStream(listenerApi) + }, + }) + + listenerMiddleware.startListening({ + actionCreator: documentsActions.stopCrawlProgressStream, + effect: async () => { + stopDocumentCrawlProgressStream() + }, + }) + + listenerMiddleware.startListening({ + actionCreator: documentsActions.patchDocumentEmbeddingStatus, + effect: async (action, listenerApi) => { syncDocumentEmbeddingStatusStreamWithDocuments(listenerApi) + + // Refetch documents when a webCrawl document finishes embedding + // so the content (crawled pages) is available for the dropdown + if (action.payload.embeddingStatus === "completed") { + const state = listenerApi.getState() + if (ADS.isFulfilled(state.studio.documents.data)) { + const document = state.studio.documents.data.value.find( + (document) => document.id === action.payload.documentId, + ) + if (document?.sourceType === "webCrawl") { + listenerApi.dispatch(listDocuments()) + } + } + } }, }) @@ -70,6 +102,7 @@ function registerListeners() { // Document changes uploadDocument.fulfilled, uploadDocuments.fulfilled, + crawlUrl.fulfilled, updateDocument.fulfilled, deleteDocument.fulfilled, // DocumentTag changes @@ -200,6 +233,29 @@ function registerListeners() { ) }, }) + + listenerMiddleware.startListening({ + actionCreator: crawlUrl.fulfilled, + effect: async (action, listenerApi) => { + listenerApi.dispatch( + notificationsActions.show({ + title: action.payload.message, + type: "success", + }), + ) + }, + }) + listenerMiddleware.startListening({ + actionCreator: crawlUrl.rejected, + effect: async (_, listenerApi) => { + listenerApi.dispatch( + notificationsActions.show({ + title: "Website crawl failed", + type: "error", + }), + ) + }, + }) } export const documentsMiddleware = { listenerMiddleware, registerListeners } diff --git a/apps/web/src/studio/features/documents/documents.models.ts b/apps/web/src/studio/features/documents/documents.models.ts index 42c0a1c8..9f12de87 100644 --- a/apps/web/src/studio/features/documents/documents.models.ts +++ b/apps/web/src/studio/features/documents/documents.models.ts @@ -9,3 +9,9 @@ export type DocumentEmbeddingStatusChangedEvent = { embeddingError: Document["embeddingError"] updatedAt: number } + +export type DocumentCrawlProgressEvent = { + documentId: string + pagesCrawled: number + updatedAt: number +} diff --git a/apps/web/src/studio/features/documents/documents.selectors.ts b/apps/web/src/studio/features/documents/documents.selectors.ts index 18f60cc5..df3e4694 100644 --- a/apps/web/src/studio/features/documents/documents.selectors.ts +++ b/apps/web/src/studio/features/documents/documents.selectors.ts @@ -44,3 +44,18 @@ export const selectHasDocumentsInProgress = createSelector( ) }, ) + +export const selectIsCrawlProgressStreamActive = (state: RootState) => + state.studio.documents.crawlProgressStream.isActive + +export const selectHasDocumentsCrawling = createSelector([selectDocumentsData], (documentsData) => { + if (!ADS.isFulfilled(documentsData)) { + return false + } + return documentsData.value.some( + (document) => document.sourceType === "webCrawl" && document.embeddingStatus === "pending", + ) +}) + +export const selectCrawlProgressByDocumentId = (state: RootState) => + state.studio.documents.crawlProgressByDocumentId diff --git a/apps/web/src/studio/features/documents/documents.slice.ts b/apps/web/src/studio/features/documents/documents.slice.ts index fe808ee0..c7c472b4 100644 --- a/apps/web/src/studio/features/documents/documents.slice.ts +++ b/apps/web/src/studio/features/documents/documents.slice.ts @@ -1,4 +1,5 @@ import { createSlice, type PayloadAction } from "@reduxjs/toolkit" +import type { DocumentSourceType } from "@caseai-connect/api-contracts" import { ADS, type AsyncData, defaultAsyncData } from "@/common/store/async-data-status" import type { Document } from "./documents.models" import { listDocuments, uploadDocuments } from "./documents.thunks" @@ -13,15 +14,22 @@ type UploaderState = { type EmbeddingStatusStreamState = { isActive: boolean } +type CrawlProgressStreamState = { + isActive: boolean +} interface State { currentDocumentId: string | null + currentSourceType: DocumentSourceType | null data: AsyncData uploader: UploaderState embeddingStatusStream: EmbeddingStatusStreamState + crawlProgressStream: CrawlProgressStreamState + crawlProgressByDocumentId: Record } const initialState: State = { currentDocumentId: null, + currentSourceType: null, data: defaultAsyncData, uploader: { status: "idle", @@ -32,6 +40,10 @@ const initialState: State = { embeddingStatusStream: { isActive: false, }, + crawlProgressStream: { + isActive: false, + }, + crawlProgressByDocumentId: {}, } function mergeDocumentsByUpdatedAt({ @@ -87,6 +99,9 @@ const slice = createSlice({ setCurrentDocumentId: (state, action: PayloadAction<{ documentId: string | null }>) => { state.currentDocumentId = action.payload.documentId }, + setCurrentSourceType: (state, action: PayloadAction<{ sourceType: DocumentSourceType | null }>) => { + state.currentSourceType = action.payload.sourceType + }, startEmbeddingStatusStream: (state) => { state.embeddingStatusStream.isActive = true }, @@ -111,6 +126,26 @@ const slice = createSlice({ document.embeddingStatus = action.payload.embeddingStatus document.embeddingError = action.payload.embeddingError document.updatedAt = action.payload.updatedAt + if ( + action.payload.embeddingStatus === "completed" || + action.payload.embeddingStatus === "failed" + ) { + delete state.crawlProgressByDocumentId[action.payload.documentId] + } + }, + startCrawlProgressStream: (state) => { + state.crawlProgressStream.isActive = true + }, + stopCrawlProgressStream: (state) => { + state.crawlProgressStream.isActive = false + }, + patchDocumentCrawlProgress: ( + state, + action: PayloadAction<{ documentId: string; pagesCrawled: number }>, + ) => { + const previous = state.crawlProgressByDocumentId[action.payload.documentId] ?? 0 + if (action.payload.pagesCrawled < previous) return + state.crawlProgressByDocumentId[action.payload.documentId] = action.payload.pagesCrawled }, }, extraReducers: (builder) => { @@ -132,6 +167,20 @@ const slice = createSlice({ error: null, value: mergedDocuments, } + + const stillCrawling = new Set( + mergedDocuments + .filter( + (document) => + document.sourceType === "webCrawl" && document.embeddingStatus === "pending", + ) + .map((document) => document.id), + ) + for (const documentId of Object.keys(state.crawlProgressByDocumentId)) { + if (!stillCrawling.has(documentId)) { + delete state.crawlProgressByDocumentId[documentId] + } + } }) .addCase(listDocuments.rejected, (state, action) => { state.data.status = ADS.Error diff --git a/apps/web/src/studio/features/documents/documents.spi.ts b/apps/web/src/studio/features/documents/documents.spi.ts index f0d45788..7e8f49a7 100644 --- a/apps/web/src/studio/features/documents/documents.spi.ts +++ b/apps/web/src/studio/features/documents/documents.spi.ts @@ -1,9 +1,13 @@ import type { DocumentSourceType } from "@caseai-connect/api-contracts" import type { DocumentTagsUpdateFields } from "@/studio/features/document-tags/document-tags.models" -import type { Document, DocumentEmbeddingStatusChangedEvent } from "./documents.models" +import type { + Document, + DocumentCrawlProgressEvent, + DocumentEmbeddingStatusChangedEvent, +} from "./documents.models" export interface IDocumentsSpi { - getAll(params: { organizationId: string; projectId: string }): Promise + getAll(params: { organizationId: string; projectId: string; sourceType: DocumentSourceType }): Promise uploadOne(params: { organizationId: string projectId: string @@ -17,6 +21,7 @@ export interface IDocumentsSpi { files: File[] sourceType: DocumentSourceType tagIds?: string[] + name?: string onFileProcessed: ( result: | { file: File; status: "success"; document: Document } @@ -50,4 +55,21 @@ export interface IDocumentsSpi { signal?: AbortSignal onStatusChanged: (event: DocumentEmbeddingStatusChangedEvent) => void }): Promise + streamCrawlProgress(params: { + organizationId: string + projectId: string + signal?: AbortSignal + onProgressChanged: (event: DocumentCrawlProgressEvent) => void + }): Promise + crawlUrl(params: { + organizationId: string + projectId: string + url: string + name?: string + }): Promise<{ message: string }> + reCrawlUrl(params: { + organizationId: string + projectId: string + documentId: string + }): Promise<{ message: string }> } diff --git a/apps/web/src/studio/features/documents/documents.thunks.ts b/apps/web/src/studio/features/documents/documents.thunks.ts index eaae3c28..0c7668f6 100644 --- a/apps/web/src/studio/features/documents/documents.thunks.ts +++ b/apps/web/src/studio/features/documents/documents.thunks.ts @@ -19,7 +19,9 @@ export const listDocuments = createAsyncThunk( state, wantedIds: ["organizationId", "projectId"], }) - return await services.documents.getAll({ organizationId, projectId }) + const sourceType = state.studio.documents.currentSourceType + if (!sourceType) throw new Error("sourceType is required to list documents") + return await services.documents.getAll({ organizationId, projectId, sourceType }) }, ) @@ -52,11 +54,11 @@ export const uploadDocument = createAsyncThunk< export const uploadDocuments = createAsyncThunk< void, - { files: File[]; sourceType: DocumentSourceType; tagIds?: string[] }, + { files: File[]; sourceType: DocumentSourceType; tagIds?: string[]; name?: string }, ThunkConfig >( "documents/uploadMany", - async ({ files, sourceType, tagIds }, { extra: { services }, getState, dispatch }) => { + async ({ files, sourceType, tagIds, name }, { extra: { services }, getState, dispatch }) => { const state = getState() const { organizationId, projectId } = getCurrentIds({ state, @@ -68,6 +70,7 @@ export const uploadDocuments = createAsyncThunk< files, sourceType, tagIds, + name, onFileProcessed: (result) => { dispatch(documentsActions.setOneDocumentProcessed()) @@ -155,6 +158,57 @@ export const getDocumentTemporaryUrl = createAsyncThunk< return await services.documents.getTemporaryUrl({ organizationId, projectId, documentId }) }) +export const crawlUrl = createAsyncThunk< + { message: string }, + { url: string; name?: string }, + ThunkConfig +>("documents/crawlUrl", async ({ url, name }, { extra: { services }, getState }) => { + const state = getState() + const { organizationId, projectId } = getCurrentIds({ + state, + wantedIds: ["organizationId", "projectId"], + }) + return await services.documents.crawlUrl({ organizationId, projectId, url, name }) +}) + +export const reCrawlUrl = createAsyncThunk< + { message: string }, + { documentId: string }, + ThunkConfig +>("documents/reCrawlUrl", async ({ documentId }, { extra: { services }, getState }) => { + const state = getState() + const { organizationId, projectId } = getCurrentIds({ + state, + wantedIds: ["organizationId", "projectId"], + }) + return await services.documents.reCrawlUrl({ organizationId, projectId, documentId }) +}) + +export const streamDocumentCrawlProgresses = createAsyncThunk( + "documents/streamCrawlProgress", + async (_, { extra: { services }, getState, dispatch, signal }) => { + const state = getState() + const { organizationId, projectId } = getCurrentIds({ + state, + wantedIds: ["organizationId", "projectId"], + }) + + await services.documents.streamCrawlProgress({ + organizationId, + projectId, + signal, + onProgressChanged: ({ documentId, pagesCrawled }) => { + dispatch( + documentsActions.patchDocumentCrawlProgress({ + documentId, + pagesCrawled, + }), + ) + }, + }) + }, +) + export const streamDocumentEmbeddingStatuses = createAsyncThunk( "documents/streamEmbeddingStatus", async (_, { extra: { services }, getState, dispatch, signal }) => { diff --git a/apps/web/src/studio/features/documents/external/documents-streaming.ts b/apps/web/src/studio/features/documents/external/documents-streaming.ts index 401bf8f9..82b6d0fc 100644 --- a/apps/web/src/studio/features/documents/external/documents-streaming.ts +++ b/apps/web/src/studio/features/documents/external/documents-streaming.ts @@ -1,10 +1,15 @@ import { + DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL_DTO, DOCUMENT_EMBEDDING_STATUS_CHANGED_CHANNEL_DTO, + type DocumentCrawlProgressChangedEventDto, type DocumentEmbeddingStatusChangedEventDto, DocumentsRoutes, } from "@caseai-connect/api-contracts" import { readSSEStream, type SSEStreamConfig } from "@/common/sse/sse-stream-reader" -import type { DocumentEmbeddingStatusChangedEvent } from "../documents.models" +import type { + DocumentCrawlProgressEvent, + DocumentEmbeddingStatusChangedEvent, +} from "../documents.models" const documentEmbeddingSSEConfig: SSEStreamConfig< DocumentEmbeddingStatusChangedEventDto, @@ -39,3 +44,36 @@ export async function streamDocumentEmbeddingStatus(params: { onStatusChanged: params.onStatusChanged, }) } + +const documentCrawlProgressSSEConfig: SSEStreamConfig< + DocumentCrawlProgressChangedEventDto, + DocumentCrawlProgressEvent +> = { + label: "DocumentsCrawlProgress", + getStreamPath: (params) => + DocumentsRoutes.streamCrawlProgress.getPath({ + organizationId: params.organizationId, + projectId: params.projectId, + }), + isExpectedEvent: (dto) => dto.type === DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL_DTO, + fromDto: (dto) => ({ + documentId: dto.documentId, + pagesCrawled: dto.pagesCrawled, + updatedAt: dto.updatedAt, + }), +} + +export async function streamDocumentCrawlProgress(params: { + organizationId: string + projectId: string + signal?: AbortSignal + onProgressChanged: (event: DocumentCrawlProgressEvent) => void +}): Promise { + return readSSEStream({ + config: documentCrawlProgressSSEConfig, + organizationId: params.organizationId, + projectId: params.projectId, + signal: params.signal, + onStatusChanged: params.onProgressChanged, + }) +} diff --git a/apps/web/src/studio/features/documents/external/documents.api.ts b/apps/web/src/studio/features/documents/external/documents.api.ts index eef74cac..d6840dc0 100644 --- a/apps/web/src/studio/features/documents/external/documents.api.ts +++ b/apps/web/src/studio/features/documents/external/documents.api.ts @@ -6,13 +6,13 @@ import { import { getAxiosInstance } from "@/external/axios" import type { Document } from "../documents.models" import type { IDocumentsSpi } from "../documents.spi" -import { streamDocumentEmbeddingStatus } from "./documents-streaming" +import { streamDocumentCrawlProgress, streamDocumentEmbeddingStatus } from "./documents-streaming" export default { - getAll: async ({ organizationId, projectId }) => { + getAll: async ({ organizationId, projectId, sourceType }) => { const axios = getAxiosInstance() const response = await axios.get( - DocumentsRoutes.getAll.getPath({ organizationId, projectId }), + DocumentsRoutes.getAll.getPath({ organizationId, projectId, sourceType }), ) return response.data.data.map(toDocument) }, @@ -32,7 +32,15 @@ export default { ) return toDocument(response.data.data) }, - uploadMany: async ({ organizationId, projectId, files, sourceType, tagIds, onFileProcessed }) => { + uploadMany: async ({ + organizationId, + projectId, + files, + sourceType, + tagIds, + name, + onFileProcessed, + }) => { const axios = getAxiosInstance() for (const file of files) { @@ -44,7 +52,7 @@ export default { payload: { files: [ { - fileName: file.name, + fileName: name && files.length === 1 ? name : file.name, mimeType: file.type as PresignFileRequestItemDto["mimeType"], size: file.size, }, @@ -126,11 +134,35 @@ export default { onStatusChanged, }) }, + streamCrawlProgress: async ({ organizationId, projectId, signal, onProgressChanged }) => { + await streamDocumentCrawlProgress({ + organizationId, + projectId, + signal, + onProgressChanged, + }) + }, + crawlUrl: async ({ organizationId, projectId, url, name }) => { + const axios = getAxiosInstance() + const response = await axios.post( + DocumentsRoutes.crawlUrl.getPath({ organizationId, projectId }), + { payload: { url, name } } satisfies typeof DocumentsRoutes.crawlUrl.request, + ) + return response.data.data + }, + reCrawlUrl: async ({ organizationId, projectId, documentId }) => { + const axios = getAxiosInstance() + const response = await axios.post( + DocumentsRoutes.reCrawlUrl.getPath({ organizationId, projectId, documentId }), + ) + return response.data.data + }, } satisfies IDocumentsSpi function toDocument(dto: DocumentDto): Document { return { content: dto.content, + pages: dto.pages, createdAt: dto.createdAt, deletedAt: dto.deletedAt, fileName: dto.fileName, @@ -140,6 +172,8 @@ function toDocument(dto: DocumentDto): Document { projectId: dto.projectId, size: dto.size, storageRelativePath: dto.storageRelativePath, + sourceType: dto.sourceType, + sourceUrl: dto.sourceUrl, embeddingStatus: dto.embeddingStatus, embeddingError: dto.embeddingError ?? null, title: dto.title, diff --git a/apps/web/src/studio/features/documents/locales/document.en.json b/apps/web/src/studio/features/documents/locales/document.en.json index 7e87d8e6..6ed3ec84 100644 --- a/apps/web/src/studio/features/documents/locales/document.en.json +++ b/apps/web/src/studio/features/documents/locales/document.en.json @@ -2,6 +2,7 @@ "document": { "document": "Document", "documents": "Documents", + "sources": "Sources", "uploading": "Uploading documents... {{processed}} of {{total}}", "props": { "createdAt": "Created At", @@ -19,11 +20,16 @@ "queued": "Queued", "processing": "Processing", "completed": "Ready", - "failed": "Failed" + "failed": "Failed", + "crawling": "Crawling", + "crawlingWithCount": "Crawling — {{count}} pages", + "embedding": "Embedding", + "ready": "Ready" }, "size": "Size", "storageRelativePath": "Storage Relative Path", - "tags": "Tags" + "tags": "Tags", + "pages": "Pages" }, "update": { "title": "Edit {{documentTitle}}" @@ -32,6 +38,16 @@ "title": "Delete {{documentTitle}}", "description": "Are you sure you want to delete this document? This action cannot be undone." }, + "recrawl": "Recrawl website", + "crawl": { + "button": "Crawl Website", + "title": "Crawl a Website", + "description": "Enter a URL to crawl. The entire website will be indexed in the background.", + "urlLabel": "Website URL", + "nameLabel": "Name (optional)", + "namePlaceholder": "e.g. Documentation site", + "submit": "Start Crawling" + }, "reprocess": { "cta": "Reprocess" }, @@ -42,12 +58,18 @@ "description": "Upload your first document to get started." } }, + "filter": { + "all": "All", + "uploaded": "Documents", + "webSources": "Web sources" + }, "upload": { "tagDialog": { "title": "Tags for this upload", "description": "Optional: choose tags to apply to every file in this upload.", "fileCountSentence_one": "You’re about to upload one file.", "fileCountSentence_other": "You’re about to upload {{count}} files.", + "nameLabel": "Name (optional)", "confirm": "Upload" } } diff --git a/apps/web/src/studio/features/documents/locales/document.fr.json b/apps/web/src/studio/features/documents/locales/document.fr.json index 4166581c..29727a93 100644 --- a/apps/web/src/studio/features/documents/locales/document.fr.json +++ b/apps/web/src/studio/features/documents/locales/document.fr.json @@ -2,6 +2,7 @@ "document": { "document": "Document", "documents": "Documents", + "sources": "Sources", "uploading": "Téléversement des documents... {{processed}} sur {{total}}", "props": { "createdAt": "Créé le", @@ -19,11 +20,16 @@ "queued": "En file", "processing": "En cours", "completed": "Prêt", - "failed": "Échoué" + "failed": "Échoué", + "crawling": "Exploration", + "crawlingWithCount": "Exploration — {{count}} pages", + "embedding": "Indexation", + "ready": "Prêt" }, "size": "Taille", "storageRelativePath": "Chemin de stockage relatif", - "tags": "Tags" + "tags": "Tags", + "pages": "Pages" }, "update": { "title": "Modifier {{documentTitle}}" @@ -32,6 +38,16 @@ "title": "Supprimer {{documentTitle}}", "description": "Êtes-vous sûr de vouloir supprimer ce document ? Cette action est irréversible." }, + "recrawl": "Ré-explorer le site", + "crawl": { + "button": "Explorer un site web", + "title": "Explorer un site web", + "description": "Entrez une URL à explorer. L'intégralité du site sera indexée en arrière-plan.", + "urlLabel": "URL du site web", + "nameLabel": "Nom (optionnel)", + "namePlaceholder": "ex : Site de documentation", + "submit": "Lancer l'exploration" + }, "reprocess": { "cta": "Relancer le traitement" }, @@ -42,12 +58,18 @@ "description": "Téléversez votre premier document pour commencer." } }, + "filter": { + "all": "Tous", + "uploaded": "Documents", + "webSources": "Sites web" + }, "upload": { "tagDialog": { "title": "Tags pour cet envoi", "description": "Facultatif : choisissez des tags à appliquer à chaque fichier de cet envoi.", "fileCountSentence_one": "Vous allez téléverser un fichier.", "fileCountSentence_other": "Vous allez téléverser {{count}} fichiers.", + "nameLabel": "Nom (optionnel)", "confirm": "Téléverser" } } diff --git a/apps/web/src/studio/routes/DocumentsRoute.tsx b/apps/web/src/studio/routes/DocumentsRoute.tsx index 622b69f3..9d924628 100644 --- a/apps/web/src/studio/routes/DocumentsRoute.tsx +++ b/apps/web/src/studio/routes/DocumentsRoute.tsx @@ -1,6 +1,7 @@ import { Alert, AlertDescription, AlertTitle } from "@caseai-connect/ui/shad/alert" import { Badge } from "@caseai-connect/ui/shad/badge" import { Button } from "@caseai-connect/ui/shad/button" +import { Collapsible, CollapsibleTrigger } from "@caseai-connect/ui/shad/collapsible" import { Dialog, DialogContent, @@ -28,13 +29,17 @@ import { TableRow, } from "@caseai-connect/ui/shad/table" import { + ChevronDownIcon, ChevronRightIcon, CloudAlertIcon, EllipsisVerticalIcon, + ExternalLinkIcon, FileDownIcon, + GlobeIcon, InfoIcon, Loader2Icon, PencilIcon, + RefreshCwIcon, RotateCcwIcon, Trash2Icon, XIcon, @@ -43,6 +48,7 @@ import { useEffect, useReducer, useState } from "react" import { useTranslation } from "react-i18next" import { useNavigate } from "react-router-dom" import { GridHeader } from "@/common/components/grid/Grid" +import { RestrictedFeature } from "@/common/components/RestrictedFeature" import { MarkdownWrapper } from "@/common/features/agents/agent-sessions/shared/agent-session-messages/components/MarkdownWrapper" import { useAppDispatch, useAppSelector } from "@/common/store/hooks" import { buildDate, buildSince } from "@/common/utils/build-date" @@ -53,12 +59,14 @@ import { } from "@/studio/features/document-tags/document-tags.helpers" import type { DocumentTag } from "@/studio/features/document-tags/document-tags.models" import { selectDocumentTagsData } from "@/studio/features/document-tags/document-tags.selectors" +import { CrawlUrlButton } from "@/studio/features/documents/components/CrawlUrlButton" import { DocumentTagPicker } from "@/studio/features/documents/components/DocumentTagPicker" import { EmbeddingStatusBadge } from "@/studio/features/documents/components/EmbeddingStatusBadge" import { EmptyDocument } from "@/studio/features/documents/components/EmptyDocument" import { UploadDocumentsButton } from "@/studio/features/documents/components/UploadDocumentsButton" import type { Document } from "@/studio/features/documents/documents.models" import { + selectCrawlProgressByDocumentId, selectDocumentsData, selectUploaderState, } from "@/studio/features/documents/documents.selectors" @@ -66,6 +74,7 @@ import { documentsActions } from "@/studio/features/documents/documents.slice" import { deleteDocument, getDocumentTemporaryUrl, + reCrawlUrl, reprocessDocument, updateDocument, } from "@/studio/features/documents/documents.thunks" @@ -73,14 +82,18 @@ import { AsyncRoute } from "../../common/routes/AsyncRoute" import { DocumentTagItem } from "../features/document-tags/components/DocumentTagItem" import { DocumentTagsSheet } from "../features/document-tags/components/DocumentTagsSheet" -export function DocumentsRoute() { - useDocumentEmbeddingStatusStream() +export function DocumentsRoute({ sourceFilter }: { sourceFilter?: "project" | "webCrawl" }) { + useDocumentEmbeddingStatusStream(sourceFilter) const documents = useAppSelector(selectDocumentsData) const documentTags = useAppSelector(selectDocumentTagsData) return ( {([documentsValue, documentTagsValue]) => ( - + )} ) @@ -89,13 +102,19 @@ export function DocumentsRoute() { function WithData({ documents, documentTags, + sourceFilter, }: { documents: Document[] documentTags: DocumentTag[] + sourceFilter?: "project" | "webCrawl" }) { const navigate = useNavigate() const { t } = useTranslation() + const visibleDocuments = sourceFilter + ? documents.filter((document) => document.sourceType === sourceFilter) + : documents + const handleBack = () => { navigate(-1) } @@ -107,8 +126,13 @@ function WithData({ title={t("document:documents")} description={t("document:list.description")} action={ -
- +
+ {sourceFilter !== "project" && ( + + + + )} + {sourceFilter !== "webCrawl" && }
} @@ -116,7 +140,7 @@ function WithData({
- {documents.length === 0 ? ( + {visibleDocuments.length === 0 ? ( ) : ( @@ -125,6 +149,11 @@ function WithData({ {t("document:props.title")} + {sourceFilter === "webCrawl" && ( + + {t("document:props.pages")} + + )} {t("document:props.tags")} {t("document:props.embeddingStatus")} @@ -136,8 +165,13 @@ function WithData({ - {documents.map((document) => ( - + {visibleDocuments.map((document) => ( + ))}
@@ -150,32 +184,88 @@ function WithData({ function DocumentRow({ document, documentTags, + showPages, }: { document: Document documentTags: DocumentTag[] + showPages?: boolean }) { const date = buildSince(document.updatedAt) + const isWebCrawl = document.sourceType === "webCrawl" + const hasPages = document.pages && document.pages.length > 0 + const pagesCrawled = useAppSelector(selectCrawlProgressByDocumentId)[document.id] + + const [isOpen, setIsOpen] = useState(false) return ( - - {document.title} - -
- {document.tagIds.map((tagId) => ( - - {getTagFullPath(documentTags, tagId)} - - ))} -
-
- - - - {date} - - - -
+ <> + + +
+ {hasPages ? ( + + + + + + ) : null} +
+ {isWebCrawl ? : null} + {document.title} +
+
+
+ {showPages && ( + + {hasPages ? document.pages!.length : "—"} + + )} + +
+ {document.tagIds.map((tagId) => ( + + {getTagFullPath(documentTags, tagId)} + + ))} +
+
+ + + + {date} + + + +
+ {document.pages && isOpen + ? document.pages.map((page) => ( + + + + + {page.url} + + + + )) + : null} + ) } @@ -212,6 +302,7 @@ function DocumentActions({ const dispatch = useAppDispatch() const { t } = useTranslation() const [activeAction, setActiveAction] = useState<"delete" | "edit" | "details" | null>(null) + const pagesCrawled = useAppSelector(selectCrawlProgressByDocumentId)[document.id] const handleDownload = async () => { const result = await dispatch(getDocumentTemporaryUrl({ documentId: document.id })).unwrap() @@ -235,6 +326,10 @@ function DocumentActions({ dispatch(reprocessDocument({ documentId: document.id })) } + const handleReCrawl = () => { + dispatch(reCrawlUrl({ documentId: document.id })) + } + return ( <> @@ -244,10 +339,12 @@ function DocumentActions({ - - - {t("actions:downloadDocument")} - + {document.sourceType !== "webCrawl" && ( + + + {t("actions:downloadDocument")} + + )} setActiveAction("details")}> {t("actions:view")} @@ -262,6 +359,12 @@ function DocumentActions({ {t("document:reprocess.cta")} )} + {document.sourceType === "webCrawl" && ( + + + {t("document:recrawl")} + + )} setActiveAction("delete")}> @@ -334,7 +437,11 @@ function DocumentActions({
{t("document:props.embeddingStatus")}: - +
{document.embeddingError && ( { + dispatch(documentsActions.setCurrentSourceType({ sourceType: sourceFilter ?? null })) dispatch(documentsActions.startEmbeddingStatusStream()) + dispatch(documentsActions.startCrawlProgressStream()) return () => { + dispatch(documentsActions.setCurrentSourceType({ sourceType: null })) dispatch(documentsActions.stopEmbeddingStatusStream()) + dispatch(documentsActions.stopCrawlProgressStream()) } - }, [dispatch]) + }, [dispatch, sourceFilter]) } function UploaderStateComp() { diff --git a/apps/web/src/studio/routes/SidebarFooterChildren.tsx b/apps/web/src/studio/routes/SidebarFooterChildren.tsx index 8d42a00a..a6685143 100644 --- a/apps/web/src/studio/routes/SidebarFooterChildren.tsx +++ b/apps/web/src/studio/routes/SidebarFooterChildren.tsx @@ -20,6 +20,8 @@ import { ChevronRightIcon, CloudAlertIcon, DatabaseZapIcon, + FileIcon, + GlobeIcon, ListChecksIcon, Loader2Icon, MegaphoneIcon, @@ -37,6 +39,7 @@ import { buildProjectAnalyticsPath, buildProjectMembershipsPath, buildReviewCampaignsPath, + buildWebSourcesPath, StudioRouteNames, } from "./helpers" @@ -55,7 +58,7 @@ export function SidebarFooterChildren({ project }: { project: Project }) { - + @@ -135,7 +138,32 @@ function NavAnalytics({ ) } -function NavDocuments({ +function NavSources({ organizationId, projectId }: { organizationId: string; projectId: string }) { + const { t } = useTranslation() + return ( + + + + + + {t("document:sources")} + + + + + + + + + + + + + + ) +} + +function NavDocumentsList({ organizationId, projectId, }: { @@ -147,19 +175,38 @@ function NavDocuments({ const isActive = isRoute(StudioRouteNames.DOCUMENTS) const path = buildDocumentsPath({ organizationId, projectId }) return ( - - + + -
- - - {t("document:documents")} - -
+ + {t("document:documents")} -
-
+ + + ) +} + +function NavWebSources({ + organizationId, + projectId, +}: { + organizationId: string + projectId: string +}) { + const { t } = useTranslation() + const { isRoute } = useIsRoute() + const isActive = isRoute(StudioRouteNames.WEB_SOURCES) + const path = buildWebSourcesPath({ organizationId, projectId }) + return ( + + + + + {t("document:filter.webSources")} + + + ) } diff --git a/apps/web/src/studio/routes/StudioRoutes.tsx b/apps/web/src/studio/routes/StudioRoutes.tsx index a6522df4..4f45a9cf 100644 --- a/apps/web/src/studio/routes/StudioRoutes.tsx +++ b/apps/web/src/studio/routes/StudioRoutes.tsx @@ -99,7 +99,15 @@ export const studioRoutes = { }, { path: buildStudioPath(StudioRouteNames.DOCUMENTS), - element: , + element: , + }, + { + path: buildStudioPath(StudioRouteNames.WEB_SOURCES), + element: ( + + + + ), }, { path: buildStudioPath(StudioRouteNames.PROJECT_ANALYTICS), diff --git a/apps/web/src/studio/routes/helpers.ts b/apps/web/src/studio/routes/helpers.ts index b2d99e7c..24a1408f 100644 --- a/apps/web/src/studio/routes/helpers.ts +++ b/apps/web/src/studio/routes/helpers.ts @@ -3,6 +3,7 @@ export enum StudioRouteNames { HOME = "/studio", DOCUMENTS = "/o/:organizationId/p/:projectId/d", DOCUMENT = "/o/:organizationId/p/:projectId/d/:documentId", + WEB_SOURCES = "/o/:organizationId/p/:projectId/web-sources", PROJECT_ANALYTICS = "/o/:organizationId/p/:projectId/analytics", EVALUATION = "/o/:organizationId/p/:projectId/eval", PROJECT_MEMBERSHIPS = "/o/:organizationId/p/:projectId/members", @@ -33,6 +34,21 @@ export const buildDocumentsPath = ({ ) } +export const buildWebSourcesPath = ({ + organizationId, + projectId, +}: { + organizationId: string + projectId: string +}) => { + return buildStudioPath( + StudioRouteNames.WEB_SOURCES.replace(":organizationId", organizationId).replace( + ":projectId", + projectId, + ), + ) +} + export const buildProjectAnalyticsPath = ({ organizationId, projectId, diff --git a/package-lock.json b/package-lock.json index 7c1259b5..f36ddc00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,10 +34,10 @@ "@ai-sdk/google": "^3.0.13", "@ai-sdk/google-vertex": "^4.0.28", "@ai-sdk/mcp": "^1.0.30", - "@bull-board/api": "^6.21.2", - "@bull-board/express": "^6.21.2", - "@bull-board/nestjs": "^6.21.2", - "@bull-board/ui": "^6.21.2", + "@bull-board/api": "^6.21.3", + "@bull-board/express": "^6.21.3", + "@bull-board/nestjs": "^6.21.3", + "@bull-board/ui": "^6.21.3", "@caseai-connect/api-contracts": "*", "@google-cloud/aiplatform": "^6.5.0", "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.21.0", @@ -58,12 +58,13 @@ "@opentelemetry/sdk-metrics": "^2.6.1", "@opentelemetry/sdk-node": "^0.214.0", "@opentelemetry/sdk-trace-base": "^2.6.1", + "@spider-cloud/spider-client": "^0.2.0", "ai": "^6.0.87", "axios": "^1.12.2", "bullmq": "^5.70.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.3", - "express-openid-connect": "^2.20.1", + "express-openid-connect": "^2.20.2", "jwks-rsa": "^3.2.0", "langfuse": "^3.38.6", "langfuse-core-v2": "npm:langfuse-core@3.16.2", @@ -108,6 +109,197 @@ "typescript": "5.5.4" } }, + "apps/api/node_modules/@angular-devkit/schematics-cli": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.24.tgz", + "integrity": "sha512-bsStZQG67J1HBqTmWxtIcobvgrn32L4UOdL7hGyOru5VxDWPNA8pRnDYavT3hnJeBkJYPoQIw8u7Dm0ecoQprw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "19.2.24", + "@inquirer/prompts": "7.3.2", + "ansi-colors": "4.1.3", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "bin": { + "schematics": "bin/schematics.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "apps/api/node_modules/@angular-devkit/schematics-cli/node_modules/@inquirer/prompts": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "apps/api/node_modules/@bull-board/nestjs": { + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-6.21.3.tgz", + "integrity": "sha512-2IU5tK628/swEfoaIFnPqTdEUrRNbUO73YAigt4Q5eGnJguLJVc5O3sSa4FBWLoy44B6XM+b9cCWEx65kkosDA==", + "license": "MIT", + "peerDependencies": { + "@bull-board/api": "^6.21.3", + "@nestjs/bull-shared": "^10.0.0 || ^11.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.8.1" + } + }, + "apps/api/node_modules/@llamaindex/core": { + "version": "0.6.23", + "resolved": "https://registry.npmjs.org/@llamaindex/core/-/core-0.6.23.tgz", + "integrity": "sha512-cNrQNWY0H52Qz19x3gKgtUFGudqFrANkebmlkE/TqJQtvrm4lvjycuKeIQrnEi2TsGZG1NHIRV2Mt1A7ly9wdA==", + "deprecated": "This package is deprecated and no longer maintained.", + "peer": true, + "dependencies": { + "@finom/zod-to-json-schema": "3.24.11", + "@llamaindex/env": "0.1.31", + "@types/node": "^24.0.13", + "magic-bytes.js": "^1.10.0", + "zod": "^4.1.5" + } + }, + "apps/api/node_modules/@llamaindex/core/node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "apps/api/node_modules/@llamaindex/env": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/@llamaindex/env/-/env-0.1.31.tgz", + "integrity": "sha512-Es1RKHrHy9TSKEW2pspUUbyR/BSNGfD04A+lN/b7q87gruDXKzdsdiucUBt4y5dfnlQu0ZfGgXMzCUfTf/XE6A==", + "deprecated": "This package is deprecated and no longer maintained.", + "peer": true, + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "js-tiktoken": "^1.0.12", + "pathe": "^1.1.2" + }, + "peerDependencies": { + "@huggingface/transformers": "^3.5.0", + "gpt-tokenizer": "^2.5.0" + }, + "peerDependenciesMeta": { + "@huggingface/transformers": { + "optional": true + }, + "gpt-tokenizer": { + "optional": true + } + } + }, + "apps/api/node_modules/@llamaindex/readers": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/@llamaindex/readers/-/readers-3.1.22.tgz", + "integrity": "sha512-MtM2ADbLqet3RSGuDPAoV0KWY+1ph5cGCwWEV8CPoh6Z5Js93Co3b+hBUw0mBCOlD5aU3A4wuxnlh9LWJwPoqQ==", + "deprecated": "This package is deprecated and no longer maintained.", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@xmldom/xmldom": "^0.9.8", + "csv-parse": "^5.5.6", + "mammoth": "^1.11.0", + "unpdf": "^0.12.1" + }, + "peerDependencies": { + "@llamaindex/core": "0.6.23", + "@llamaindex/env": "0.1.31" + } + }, + "apps/api/node_modules/@nestjs/cli": { + "version": "11.0.21", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.21.tgz", + "integrity": "sha512-F8mV0Sj/zVEouzR3NxBuJy08YHTUOmC5Xdcx3qIIaJWzrm8Vw86CHkhkaPBJ5ewRMHPDCShPmhsfwhpCcjts3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "19.2.24", + "@angular-devkit/schematics-cli": "19.2.24", + "@inquirer/prompts": "7.10.1", + "@nestjs/schematics": "^11.0.1", + "ansis": "4.2.0", + "chokidar": "4.0.3", + "cli-table3": "0.6.5", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "9.1.0", + "glob": "13.0.6", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.2.0", + "typescript": "5.9.3", + "webpack": "5.106.0", + "webpack-node-externals": "3.0.0" + }, + "bin": { + "nest": "bin/nest.js" + }, + "engines": { + "node": ">= 20.11" + }, + "peerDependencies": { + "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0", + "@swc/core": "^1.3.62" + }, + "peerDependenciesMeta": { + "@swc/cli": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "apps/api/node_modules/@nestjs/cli/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "apps/api/node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", @@ -193,13 +385,13 @@ "license": "MIT" }, "node_modules/@ai-sdk/anthropic": { - "version": "3.0.72", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.72.tgz", - "integrity": "sha512-t0j9mggxylA9uP0hi12NlRk2npYh4QkE7JIpws2MdV/18QzHcsT6+TNGIjbOPayLQDjrmRKx78Ym7iZkg9qRxQ==", + "version": "3.0.64", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.64.tgz", + "integrity": "sha512-rwLi/Rsuj2pYniQXIrvClHvXDzgM4UQHHnvHTWEF14efnlKclG/1ghpNC+adsRujAbCTr6gRsSbDE2vEqriV7g==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24" + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21" }, "engines": { "node": ">=18" @@ -209,14 +401,14 @@ } }, "node_modules/@ai-sdk/gateway": { - "version": "3.0.105", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.105.tgz", - "integrity": "sha512-XpERadvLMHkYGJO4hz1Sw7Y9J705Iex48TmdZLdZdaPiFFtVgiA9qhXugLUWGAxdlXU/2N6ipoPSOwfnULZbXw==", + "version": "3.0.84", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.84.tgz", + "integrity": "sha512-RnUw6UNvkaw9MEaJU9cIjA+WBP+ZR5+M/9nfbfJHcGKtTbcWXijJuYKx9nYRnm+qU+iiakb0XvQA/vvho6lTsw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24", - "@vercel/oidc": "3.2.0" + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21", + "@vercel/oidc": "3.1.0" }, "engines": { "node": ">=18" @@ -226,13 +418,13 @@ } }, "node_modules/@ai-sdk/google": { - "version": "3.0.65", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.65.tgz", - "integrity": "sha512-SwdaJ6IqguyiVuDRgiRM4sHj7uUO4AETlQFFLF3jcEvu/3yrgIHfw2aM6bBNKSdalw0j25Pedx6qyHc2DWJwrg==", + "version": "3.0.55", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.55.tgz", + "integrity": "sha512-lIID7kDdeqzSR/eg+LrEFJGoe/mIwuW4eBdjS84Bi0cIY4cmGwSsvwYILSdiad0197Ha+DUbCxOUuSOnORUx7g==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24" + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21" }, "engines": { "node": ">=18" @@ -242,16 +434,16 @@ } }, "node_modules/@ai-sdk/google-vertex": { - "version": "4.0.113", - "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-4.0.113.tgz", - "integrity": "sha512-eG7dOZEt3umUWxHHlseYTXLDXdbsVkQ//99liHB38+vLat8SDYcp6+skvguev7OKbl66/8JHdgqRk5Wg7lcd3A==", + "version": "4.0.98", + "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-4.0.98.tgz", + "integrity": "sha512-SOKKEC0Qer5TPWF4xPk+GPL2Sz5WhX8PzBKczE+Tz3W4MQbK7BpWaEG/uBgdRrb6ikB640+6nX0jtLDuC9kG+Q==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "3.0.72", - "@ai-sdk/google": "3.0.65", - "@ai-sdk/openai-compatible": "2.0.42", - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24", + "@ai-sdk/anthropic": "3.0.64", + "@ai-sdk/google": "3.0.55", + "@ai-sdk/openai-compatible": "2.0.37", + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21", "google-auth-library": "^10.5.0" }, "engines": { @@ -262,13 +454,13 @@ } }, "node_modules/@ai-sdk/mcp": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/@ai-sdk/mcp/-/mcp-1.0.37.tgz", - "integrity": "sha512-kcR00X0A7mqV6BeSo+22Ir3qVqxJaeTO12ChCgGViwvAICVwT2x6mW3bRsOWItY5sYM0RekzGLVz7428ETL4+g==", + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/@ai-sdk/mcp/-/mcp-1.0.30.tgz", + "integrity": "sha512-QTpRa5kmMpKGbhaOgCULxIVykBlDoAe14bynSfx7oQYxGfINapixDyrTr40TwWU71VfGLWVdEJBkfMyKeTbQtw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24", + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21", "pkce-challenge": "^5.0.0" }, "engines": { @@ -279,13 +471,13 @@ } }, "node_modules/@ai-sdk/open-responses": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@ai-sdk/open-responses/-/open-responses-1.0.12.tgz", - "integrity": "sha512-ovvP1pLmlxv140gU3rF7wOR/vNdw7fTCKAbxgx5UkRCYO7fzllJQBLi6wyQkzhCdbYyVnihJT4A3MS+fcxx5Yg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/open-responses/-/open-responses-1.0.8.tgz", + "integrity": "sha512-DGkpfWH4hw/cIe84fvT9DhosOVDS4xgHAFUJiHt9WmhFTPCs1apIY2WXMmBSitbwfYBjsq6pWWeD1Z1pX5APoA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24" + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21" }, "engines": { "node": ">=18" @@ -295,13 +487,13 @@ } }, "node_modules/@ai-sdk/openai": { - "version": "3.0.54", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.54.tgz", - "integrity": "sha512-j1qrNe/ebUKuE+fETzS+CVnczs11jQBR9y9M6aoKtJZAosg6SZnPC1Bb92e2u6yaSK+88TZoFhiY67uYphPitw==", + "version": "3.0.49", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.49.tgz", + "integrity": "sha512-U2f0pCyNn/jQH3wjgxr8o9VvCkuDFTtXbIhbFFtgXqCzMbed6rBnvzQcAMEK0/Pa44byL9zfcvCOFOflvkRA8w==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24" + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21" }, "engines": { "node": ">=18" @@ -311,13 +503,13 @@ } }, "node_modules/@ai-sdk/openai-compatible": { - "version": "2.0.42", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.42.tgz", - "integrity": "sha512-hjq485U/dpi6Hvjzw5+F1vohCrB1kibGHlUFknYGa4nOoCnSvFM1lTXEIyTAkjK1uXgTbNk8vw66lbEyWT12jg==", + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.37.tgz", + "integrity": "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24" + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21" }, "engines": { "node": ">=18" @@ -327,9 +519,9 @@ } }, "node_modules/@ai-sdk/provider": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.9.tgz", - "integrity": "sha512-/ngMKqKdL9dSlY/eQ3NFDzzFyw0Hix+cbFFlyuKEKcOgpHdBt/spKUvX/i0wGrDLFPYJeVvv3N0j92LxWRL7yQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", + "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -339,14 +531,14 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "4.0.24", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.24.tgz", - "integrity": "sha512-oXIw1oLmuBILuvHgSj6w5LOV8oSnFRouPSv0MGkG9sRMeukZ9JnMF17kldaRQaRq8lSJIxo6aS3NzWlVmSb+4Q==", + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", + "integrity": "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.9", + "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", - "eventsource-parser": "^3.0.8" + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" @@ -396,6 +588,30 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -425,86 +641,33 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics-cli": { - "version": "19.2.24", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.24.tgz", - "integrity": "sha512-bsStZQG67J1HBqTmWxtIcobvgrn32L4UOdL7hGyOru5VxDWPNA8pRnDYavT3hnJeBkJYPoQIw8u7Dm0ecoQprw==", + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@auth0/auth0-auth-js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@auth0/auth0-auth-js/-/auth0-auth-js-1.6.0.tgz", + "integrity": "sha512-/WYYNlsqhWA6I60pMVLFVeOgjOUCLdJThEAsjN8pAgYY09BTxbPaRIEVDgGu6ckoJpkmKvEYlHPO/vwRNrvX6w==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.24", - "@angular-devkit/schematics": "19.2.24", - "@inquirer/prompts": "7.3.2", - "ansi-colors": "4.1.3", - "symbol-observable": "4.0.0", - "yargs-parser": "21.1.1" - }, - "bin": { - "schematics": "bin/schematics.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "jose": "^6.0.8", + "openid-client": "^6.8.0" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/@inquirer/prompts": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", - "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", - "dev": true, + "node_modules/@auth0/auth0-react": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@auth0/auth0-react/-/auth0-react-2.16.1.tgz", + "integrity": "sha512-YT6ngVDh3MV5ey2zhzXVQdLN0gQQCGzvykGtQVGY49Bky/NCB/Os6sXPhqqdsoTB07umYY9Uu54GowqwUSO4sw==", "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.1.2", - "@inquirer/confirm": "^5.1.6", - "@inquirer/editor": "^4.2.7", - "@inquirer/expand": "^4.0.9", - "@inquirer/input": "^4.1.6", - "@inquirer/number": "^3.0.9", - "@inquirer/password": "^4.0.9", - "@inquirer/rawlist": "^4.0.9", - "@inquirer/search": "^3.0.9", - "@inquirer/select": "^4.0.9" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@auth0/auth0-auth-js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@auth0/auth0-auth-js/-/auth0-auth-js-1.6.0.tgz", - "integrity": "sha512-/WYYNlsqhWA6I60pMVLFVeOgjOUCLdJThEAsjN8pAgYY09BTxbPaRIEVDgGu6ckoJpkmKvEYlHPO/vwRNrvX6w==", - "license": "MIT", - "dependencies": { - "jose": "^6.0.8", - "openid-client": "^6.8.0" - } - }, - "node_modules/@auth0/auth0-react": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@auth0/auth0-react/-/auth0-react-2.16.2.tgz", - "integrity": "sha512-Sp7aXuvSMXh0qO74wv25ZsNjCAX1HItU2LhHCvPAJKQYRr/Rc9b1OtdyhkkIXAlAYgQZ2qbC2P8hiDpRh54aAw==", - "license": "MIT", - "dependencies": { - "@auth0/auth0-spa-js": "^2.19.2" + "@auth0/auth0-spa-js": "^2.18.0" }, "peerDependencies": { "react": "^16.11.0 || ^17 || ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1", @@ -512,9 +675,9 @@ } }, "node_modules/@auth0/auth0-spa-js": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/@auth0/auth0-spa-js/-/auth0-spa-js-2.19.2.tgz", - "integrity": "sha512-NJOjPQZjZ8g2LXkBjNiYtf614WGVhwCg+q9L2MXcEQqey+ign9CG/wnl9OxYDz7XuItWecfYQLbiVTjIGNZ/Dw==", + "version": "2.18.3", + "resolved": "https://registry.npmjs.org/@auth0/auth0-spa-js/-/auth0-spa-js-2.18.3.tgz", + "integrity": "sha512-nfZxRj+bq0t4dJfem7V0VK/mPjD9TTvu6Wd87Yc/k7QojiFf5VswDL1+9o+6WjXAIaIEttS6BLZUYcsIgphLiQ==", "license": "MIT", "dependencies": { "@auth0/auth0-auth-js": "1.6.0", @@ -549,12 +712,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.973.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", - "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -592,7 +755,6 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -708,7 +870,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -718,7 +880,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1082,7 +1244,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1277,7 +1439,6 @@ "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-6.21.3.tgz", "integrity": "sha512-FoQO+0MgZsPrQX9WLZx0KpINamJY48FUU+OyMcZxx9mQWCwsdak45V/uBgQrTYB3GaF5oGA0SxPXEp4RHwj36A==", "license": "MIT", - "peer": true, "dependencies": { "redis-info": "^3.1.0" }, @@ -1297,26 +1458,11 @@ "express": "^5.2.1" } }, - "node_modules/@bull-board/nestjs": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-6.21.3.tgz", - "integrity": "sha512-2IU5tK628/swEfoaIFnPqTdEUrRNbUO73YAigt4Q5eGnJguLJVc5O3sSa4FBWLoy44B6XM+b9cCWEx65kkosDA==", - "license": "MIT", - "peerDependencies": { - "@bull-board/api": "^6.21.3", - "@nestjs/bull-shared": "^10.0.0 || ^11.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0", - "reflect-metadata": "^0.1.13 || ^0.2.0", - "rxjs": "^7.8.1" - } - }, "node_modules/@bull-board/ui": { "version": "6.21.3", "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-6.21.3.tgz", "integrity": "sha512-s/PLBJab8cnoQAGVqjQb0v4oGe0KgB4aQ5G5g93doxzXB/D+wkXNL9P9+zLWLldBJXE57jL4CR99ttDCIiyNHw==", "license": "MIT", - "peer": true, "dependencies": { "@bull-board/api": "6.21.3" } @@ -1379,9 +1525,9 @@ "license": "MIT" }, "node_modules/@dependents/detective-less": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.3.tgz", - "integrity": "sha512-v6oD9Ukp+N7V4n6p5I/+mM5fIohSfkrDSGlFm5w/pYmchvbk+sMIHsLxrFJ5Lnujewj1BzWL0K84d88lwZAMQA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.2.tgz", + "integrity": "sha512-QPKO4ao2+iniYAYnPZwHKK67EgDG2GAdye9OCy11xsmApHGwzpH3AcSdPjGyPO3tC2/K8mF7JjWX3A/FTRnskg==", "dev": true, "license": "MIT", "dependencies": { @@ -1402,9 +1548,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", "license": "MIT", "optional": true, "dependencies": { @@ -1412,9 +1558,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], @@ -1428,9 +1574,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], @@ -1444,9 +1590,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], @@ -1460,9 +1606,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], @@ -1476,9 +1622,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], @@ -1492,9 +1638,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], @@ -1508,9 +1654,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], @@ -1524,9 +1670,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], @@ -1540,9 +1686,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], @@ -1556,9 +1702,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], @@ -1572,9 +1718,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], @@ -1588,9 +1734,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], @@ -1604,9 +1750,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], @@ -1620,9 +1766,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], @@ -1636,9 +1782,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], @@ -1652,9 +1798,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], @@ -1668,9 +1814,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], @@ -1684,9 +1830,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], @@ -1700,9 +1846,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], @@ -1716,9 +1862,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "cpu": [ "arm64" ], @@ -1732,9 +1878,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], @@ -1748,9 +1894,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "cpu": [ "arm64" ], @@ -1764,9 +1910,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], @@ -1780,9 +1926,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], @@ -1796,9 +1942,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], @@ -1812,9 +1958,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], @@ -1876,9 +2022,9 @@ "license": "MIT" }, "node_modules/@google-cloud/aiplatform": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/aiplatform/-/aiplatform-6.6.0.tgz", - "integrity": "sha512-CVPo83uZGTrH0gids2kMfckjryktU7VhmYm+QncJcTVC7FBjEuZTqz5vhHqoJ5t2IHcmwGoi2sDmM3yl0ZMQaA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@google-cloud/aiplatform/-/aiplatform-6.5.0.tgz", + "integrity": "sha512-UZaeXg4Xt+/2LQLWw2nZ7ipbFdUIm9Xo3edAu2xpP/GMmHQIFk3nJmCI7Y3bFUrcr7kK4mw1gPJ374LQKpOO3w==", "license": "Apache-2.0", "dependencies": { "google-gax": "^5.0.0" @@ -1908,6 +2054,20 @@ "@opentelemetry/sdk-metrics": "^2.0.0" } }, + "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter/node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter/node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -1925,6 +2085,15 @@ "node": ">=14" } }, + "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter/node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-3.0.0.tgz", @@ -1946,6 +2115,20 @@ "@opentelemetry/sdk-trace-base": "^2.0.0" } }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter/node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter/node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -1963,6 +2146,15 @@ "node": ">=14" } }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter/node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@google-cloud/opentelemetry-resource-util": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-3.0.0.tgz", @@ -1980,6 +2172,29 @@ "@opentelemetry/resources": "^2.0.0" } }, + "node_modules/@google-cloud/opentelemetry-resource-util/node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/opentelemetry-resource-util/node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@google-cloud/paginator": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", @@ -2046,6 +2261,20 @@ "node": ">=14" } }, + "node_modules/@google-cloud/storage/node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@google-cloud/storage/node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -2063,20 +2292,28 @@ "node": ">=14" } }, + "node_modules/@google-cloud/storage/node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@google-cloud/storage/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@google/genai": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.50.1.tgz", - "integrity": "sha512-YbkX7H9+1Pt8wOt7DDREy8XSoiL6fRDzZQRyaVBarFf8MR3zHGqVdvM4cLbDXqPhxqvegZShgfxb8kw9C7YhAQ==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.48.0.tgz", + "integrity": "sha512-plonYK4ML2PrxsRD9SeqmFt76eREWkQdPCglOA6aYDzL1AAbE+7PUnT54SvpWGfws13L0AZEqGSpL7+1IPnTxQ==", "license": "Apache-2.0", "dependencies": { "google-auth-library": "^10.3.0", @@ -2096,6 +2333,25 @@ } } }, + "node_modules/@google/genai/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@google/genai/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.14.3", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", @@ -2158,7 +2414,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -2172,7 +2427,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2195,7 +2449,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2218,7 +2471,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2235,7 +2487,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2252,7 +2503,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2269,7 +2519,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2286,7 +2535,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2303,7 +2551,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2320,7 +2567,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2337,7 +2583,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2354,7 +2599,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2371,7 +2615,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2388,7 +2631,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2411,7 +2653,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2434,7 +2675,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2457,7 +2697,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2480,7 +2719,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2503,7 +2741,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2526,7 +2763,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2549,7 +2785,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2572,7 +2807,6 @@ "cpu": [ "wasm32" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { @@ -2592,7 +2826,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -2612,7 +2845,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -2632,7 +2864,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -3149,9 +3380,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", - "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -3294,13 +3525,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", @@ -3477,13 +3701,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/diff-sequences": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", @@ -3801,13 +4018,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", @@ -3959,13 +4169,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/get-type": { "version": "30.1.0", "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", @@ -4274,13 +4477,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/schemas": { "version": "30.0.5", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", @@ -4385,7 +4581,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -4492,7 +4687,6 @@ "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -4507,9 +4701,9 @@ } }, "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.7.0.tgz", - "integrity": "sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.4.tgz", + "integrity": "sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==", "dev": true, "license": "MIT", "dependencies": { @@ -4518,7 +4712,7 @@ }, "peerDependencies": { "typescript": ">= 4.3.x", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4593,13 +4787,12 @@ } }, "node_modules/@llamaindex/core": { - "version": "0.6.23", - "resolved": "https://registry.npmjs.org/@llamaindex/core/-/core-0.6.23.tgz", - "integrity": "sha512-cNrQNWY0H52Qz19x3gKgtUFGudqFrANkebmlkE/TqJQtvrm4lvjycuKeIQrnEi2TsGZG1NHIRV2Mt1A7ly9wdA==", - "deprecated": "This package is deprecated and no longer maintained.", + "version": "0.6.22", + "resolved": "https://registry.npmjs.org/@llamaindex/core/-/core-0.6.22.tgz", + "integrity": "sha512-/BXyemkvpxMaUhOkbwJ2PTvzKjSWkL8+6QLpz/n+pk8xBwMMe1GVBgli/J57gCyi8GbrlBafBj6GaPOgWub2Eg==", "dependencies": { "@finom/zod-to-json-schema": "3.24.11", - "@llamaindex/env": "0.1.31", + "@llamaindex/env": "0.1.30", "@types/node": "^24.0.13", "magic-bytes.js": "^1.10.0", "zod": "^4.1.5" @@ -4615,11 +4808,9 @@ } }, "node_modules/@llamaindex/env": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@llamaindex/env/-/env-0.1.31.tgz", - "integrity": "sha512-Es1RKHrHy9TSKEW2pspUUbyR/BSNGfD04A+lN/b7q87gruDXKzdsdiucUBt4y5dfnlQu0ZfGgXMzCUfTf/XE6A==", - "deprecated": "This package is deprecated and no longer maintained.", - "peer": true, + "version": "0.1.30", + "resolved": "https://registry.npmjs.org/@llamaindex/env/-/env-0.1.30.tgz", + "integrity": "sha512-y6kutMcCevzbmexUgz+HXf7KiZemzAoFEYSjAILfR+cG6FmYSF8XvLbGOB34Kx8mlRi7EI8rZXpezJ5qCqOyZg==", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "js-tiktoken": "^1.0.12", @@ -4638,23 +4829,66 @@ } } }, - "node_modules/@llamaindex/readers": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@llamaindex/readers/-/readers-3.1.22.tgz", - "integrity": "sha512-MtM2ADbLqet3RSGuDPAoV0KWY+1ph5cGCwWEV8CPoh6Z5Js93Co3b+hBUw0mBCOlD5aU3A4wuxnlh9LWJwPoqQ==", - "deprecated": "This package is deprecated and no longer maintained.", + "node_modules/@llamaindex/node-parser": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@llamaindex/node-parser/-/node-parser-2.0.22.tgz", + "integrity": "sha512-uj5O89WShAAyiSZ8f8tU7hnLJ6pSmlY2a6hkAOs8odkUgT87dEqaPHpsK7w0iJdEFiob7GoLeRhv2K624FooXg==", "dependencies": { - "@discoveryjs/json-ext": "^0.6.1", - "@xmldom/xmldom": "^0.9.8", - "csv-parse": "^5.5.6", - "mammoth": "^1.11.0", - "unpdf": "^0.12.1" + "html-to-text": "^9.0.5" }, "peerDependencies": { - "@llamaindex/core": "0.6.23", - "@llamaindex/env": "0.1.31" - } - }, + "@llamaindex/core": "0.6.22", + "@llamaindex/env": "0.1.30", + "tree-sitter": "^0.22.0", + "web-tree-sitter": "^0.24.3" + } + }, + "node_modules/@llamaindex/workflow": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/@llamaindex/workflow/-/workflow-1.1.24.tgz", + "integrity": "sha512-VyKsbRkFlnT5dRNKbgLXQV+ZpQ+CAFgmC9LaZv6hD/fIKo6wq1wQW/ZqLZgZt569xeHgxmrXPB6KHdqn/AhPbQ==", + "dependencies": { + "@llamaindex/workflow-core": "^1.3.2" + }, + "peerDependencies": { + "@llamaindex/core": "0.6.22", + "@llamaindex/env": "0.1.30" + } + }, + "node_modules/@llamaindex/workflow-core": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@llamaindex/workflow-core/-/workflow-core-1.3.3.tgz", + "integrity": "sha512-WJIcD4K2suGbNkwU5CC70jKKrA5tARba42nMs8Pou1RGzmoxqg+K+b7vyLBmiDtImR8P40YLmkayCIRVQPBmsg==", + "license": "MIT", + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.7.0", + "hono": "^4.7.4", + "next": "^15.2.2", + "p-retry": "^6.2.1", + "rxjs": "^7.8.2", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + }, + "hono": { + "optional": true + }, + "next": { + "optional": true + }, + "p-retry": { + "optional": true + }, + "rxjs": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/@lukeed/csprng": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", @@ -4900,7 +5134,6 @@ "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.4.tgz", "integrity": "sha512-VBJcDHSAzxQnpcDfA0kt9MTGUD1XZzfByV70su0W0eDCQ9aqIEBlzWRW21tv9FG9dIut22ysgDidshdjlnczLw==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "2.8.1" }, @@ -4924,167 +5157,11 @@ "bullmq": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/@nestjs/cli": { - "version": "11.0.21", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.21.tgz", - "integrity": "sha512-F8mV0Sj/zVEouzR3NxBuJy08YHTUOmC5Xdcx3qIIaJWzrm8Vw86CHkhkaPBJ5ewRMHPDCShPmhsfwhpCcjts3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.24", - "@angular-devkit/schematics": "19.2.24", - "@angular-devkit/schematics-cli": "19.2.24", - "@inquirer/prompts": "7.10.1", - "@nestjs/schematics": "^11.0.1", - "ansis": "4.2.0", - "chokidar": "4.0.3", - "cli-table3": "0.6.5", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "9.1.0", - "glob": "13.0.6", - "node-emoji": "1.11.0", - "ora": "5.4.1", - "tsconfig-paths": "4.2.0", - "tsconfig-paths-webpack-plugin": "4.2.0", - "typescript": "5.9.3", - "webpack": "5.106.0", - "webpack-node-externals": "3.0.0" - }, - "bin": { - "nest": "bin/nest.js" - }, - "engines": { - "node": ">= 20.11" - }, - "peerDependencies": { - "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0", - "@swc/core": "^1.3.62" - }, - "peerDependenciesMeta": { - "@swc/cli": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nestjs/cli/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@nestjs/cli/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nestjs/cli/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nestjs/cli/node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@nestjs/cli/node_modules/webpack": { - "version": "5.106.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.0.tgz", - "integrity": "sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.20.0", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.17", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.4" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, "node_modules/@nestjs/common": { "version": "11.1.19", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.19.tgz", "integrity": "sha512-qeiTt2tv+e5QyDKqG8HlVZb2wx64FEaSGFJouqTSRs+kG44iTfl3xlz1XqVped+rihx4hmjWgL5gkhtdK3E6+Q==", "license": "MIT", - "peer": true, "dependencies": { "file-type": "21.3.4", "iterare": "1.2.1", @@ -5132,7 +5209,6 @@ "integrity": "sha512-6nJkWa2efrYi+XlU686J9y5L7OvxpLVjT0T/sxRKE7Jvpffiihelup4WSvLvRhdHDjj/5SuoWEwqReXAaaeHmw==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", @@ -5199,11 +5275,10 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "11.1.19", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.19.tgz", - "integrity": "sha512-Vpdv8jyCQdThfoTx+UTn+DRYr6H6X02YUqcpZ3qP6G3ZUwtVp7eS+hoQPGd4UuCnlnFG8Wqr2J9bGEzQdi1rIg==", + "version": "11.1.18", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.18.tgz", + "integrity": "sha512-s6GdHMTa3qx0fJewR74Xa30ysPHfBEqxIwZ7BGSTLoAEQ1vTP24urNl+b6+s49NFLEIOyeNho5fN/9/I17QlOw==", "license": "MIT", - "peer": true, "dependencies": { "cors": "2.8.6", "express": "5.2.1", @@ -5221,70 +5296,145 @@ } }, "node_modules/@nestjs/schematics": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.1.0.tgz", - "integrity": "sha512-lVxGZ46tcdItFMoXr6vyKWlnOsm1SZm/GUqAEDvy2RL4Q4O+3bkziAhrO7Y8JLssFUUvNFEGqAizI52WAxhjDw==", + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.10.tgz", + "integrity": "sha512-q9lr0wGwgBHLarD4uno3XiW4JX60WPlg2VTgbqPHl/6bT4u1IEEzj+q9Tad3bVnqL5mlDF3vrZ2tj+x13CJpmw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.24", - "@angular-devkit/schematics": "19.2.24", - "comment-json": "5.0.0", + "@angular-devkit/core": "19.2.23", + "@angular-devkit/schematics": "19.2.23", + "comment-json": "4.6.2", "jsonc-parser": "3.3.1", "pluralize": "8.0.0" }, "peerDependencies": { - "prettier": "^3.0.0", "typescript": ">=4.8.2" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } } }, - "node_modules/@nestjs/serve-static": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.5.tgz", - "integrity": "sha512-AhYx3N9aMwR2cb0w5Nlb5nHNYiAcF74ea/D/xna+PxlXwjmwGN/PpC/5fuMtOwmPBMgOTxNPOnB8C9LDZBSgyw==", + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.23.tgz", + "integrity": "sha512-RazHPQkUEsNU/OZ75w9UeHxGFMthRiuAW2B/uA7eXExBj/1meHrrBfoCA56ujW2GUxVjRtSrMjylKh4R4meiYA==", + "dev": true, "license": "MIT", "dependencies": { - "path-to-regexp": "8.4.2" + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@fastify/static": "^8.0.4 || ^9.0.0", - "@nestjs/common": "^11.0.2", - "@nestjs/core": "^11.0.2", - "express": "^5.0.1", - "fastify": "^5.2.1" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { - "@fastify/static": { - "optional": true - }, - "express": { - "optional": true - }, - "fastify": { + "chokidar": { "optional": true } } }, - "node_modules/@nestjs/testing": { - "version": "11.1.19", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.19.tgz", - "integrity": "sha512-/UFNWXvPEdu4v4DlC5oWLbGKmD27LehLK06b8oLzs6D6lf4vAQTdST8LRAXBadyMUQnVEQWMuBo3CtAVtlfXtQ==", + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "19.2.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.23.tgz", + "integrity": "sha512-Jzs7YM4X6azmHU7Mw5tQSPMuvaqYS8SLnZOJbtiXCy1JyuW9bm/WBBecNHMiuZ8LHXKhvQ6AVX1tKrzF6uiDmw==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "2.8.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" + "@angular-devkit/core": "19.2.23", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" }, - "peerDependencies": { - "@nestjs/common": "^11.0.0", + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/schematics/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@nestjs/schematics/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nestjs/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@nestjs/serve-static": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.5.tgz", + "integrity": "sha512-AhYx3N9aMwR2cb0w5Nlb5nHNYiAcF74ea/D/xna+PxlXwjmwGN/PpC/5fuMtOwmPBMgOTxNPOnB8C9LDZBSgyw==", + "license": "MIT", + "dependencies": { + "path-to-regexp": "8.4.2" + }, + "peerDependencies": { + "@fastify/static": "^8.0.4 || ^9.0.0", + "@nestjs/common": "^11.0.2", + "@nestjs/core": "^11.0.2", + "express": "^5.0.1", + "fastify": "^5.2.1" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "express": { + "optional": true + }, + "fastify": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing": { + "version": "11.1.17", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.17.tgz", + "integrity": "sha512-lNffw+z+2USewmw4W0tsK+Rq94A2N4PiHbcqoRUu5y8fnqxQeIWGHhjo5BFCqj7eivqJBhT7WdRydxVq4rAHzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0", "@nestjs/microservices": "^11.0.0", "@nestjs/platform-express": "^11.0.0" @@ -5299,16 +5449,16 @@ } }, "node_modules/@nestjs/typeorm": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.1.tgz", - "integrity": "sha512-8rw/nKT0S+L+MkzgE9F2/mox7mAgsPlwfzmW9gsESN1lmQtIrVEfiiBwC2O8+guS1jBfQehJIdcdUj2OAp4VUQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", + "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", "license": "MIT", "peerDependencies": { "@nestjs/common": "^10.0.0 || ^11.0.0", "@nestjs/core": "^10.0.0 || ^11.0.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0", - "typeorm": "^0.3.0 || ^1.0.0-dev" + "typeorm": "^0.3.0" } }, "node_modules/@next/env": { @@ -5325,7 +5475,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5342,7 +5491,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5359,7 +5507,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5376,7 +5523,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5393,7 +5539,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5410,7 +5555,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5427,7 +5571,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5444,7 +5587,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5467,18 +5609,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@nodable/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/nodable" - } - ], - "license": "MIT" - }, "node_modules/@nuxt/opencollective": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", @@ -5496,11 +5626,10 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -5533,21 +5662,6 @@ "@opentelemetry/api": "^1.9.0" } }, - "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/context-async-hooks": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.1.tgz", @@ -5561,11 +5675,10 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", - "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", + "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -5596,21 +5709,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-http": { "version": "0.214.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.214.0.tgz", @@ -5630,21 +5728,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-proto": { "version": "0.214.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.214.0.tgz", @@ -5666,65 +5749,56 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.214.0.tgz", + "integrity": "sha512-0NGxWHVYHgbp51SEzmsP+Hdups81eRs229STcSWHo3WO0aqY6RpJ9csxfyEtFgaNrBDv6UfOh0je4ss/ROS6XA==", "license": "Apache-2.0", "dependencies": { + "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/exporter-metrics-otlp-http": "0.214.0", + "@opentelemetry/otlp-exporter-base": "0.214.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.214.0", + "@opentelemetry/otlp-transformer": "0.214.0", + "@opentelemetry/resources": "2.6.1", + "@opentelemetry/sdk-metrics": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.214.0.tgz", + "integrity": "sha512-Tx/59RmjBgkXJ3qnsD04rpDrVWL53LU/czpgLJh+Ab98nAroe91I7vZ3uGN9mxwPS0jsZEnmqmHygVwB2vRMlA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.1", + "@opentelemetry/otlp-exporter-base": "0.214.0", + "@opentelemetry/otlp-transformer": "0.214.0", "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/sdk-metrics": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.214.0.tgz", - "integrity": "sha512-0NGxWHVYHgbp51SEzmsP+Hdups81eRs229STcSWHo3WO0aqY6RpJ9csxfyEtFgaNrBDv6UfOh0je4ss/ROS6XA==", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.214.0.tgz", + "integrity": "sha512-pJIcghFGhx3VSCgP5U+yZx+OMNj0t+ttnhC8IjL5Wza7vWIczctF6t3AGcVQffi2dEqX+ZHANoBwoPR8y6RMKA==", "license": "Apache-2.0", "dependencies": { - "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.1", "@opentelemetry/exporter-metrics-otlp-http": "0.214.0", "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.214.0", "@opentelemetry/otlp-transformer": "0.214.0", "@opentelemetry/resources": "2.6.1", "@opentelemetry/sdk-metrics": "2.6.1" @@ -5736,64 +5810,75 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.214.0.tgz", + "integrity": "sha512-4TGYoZKebUWVuYkV6r5wS2dUF4zH7EbWFw/Uqz1ZM1tGHQeFT9wzHGXq3iSIXMUrwu5jRdxjfMaXrYejPu2kpQ==", "license": "Apache-2.0", "dependencies": { + "@opentelemetry/core": "2.6.1", + "@opentelemetry/resources": "2.6.1", + "@opentelemetry/sdk-metrics": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.214.0.tgz", + "integrity": "sha512-FWRZ7AWoTryYhthralHkfXUuyO3l7cRsnr49WcDio1orl2a7KxT8aDZdwQtV1adzoUvZ9Gfo+IstElghCS4zfw==", "license": "Apache-2.0", "dependencies": { + "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/otlp-exporter-base": "0.214.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.214.0", + "@opentelemetry/otlp-transformer": "0.214.0", + "@opentelemetry/resources": "2.6.1", + "@opentelemetry/sdk-trace-base": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", - "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.214.0.tgz", + "integrity": "sha512-kIN8nTBMgV2hXzV/a20BCFilPZdAIMYYJGSgfMMRm/Xa+07y5hRDS2Vm12A/z8Cdu3Sq++ZvJfElokX2rkgGgw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1" + "@opentelemetry/otlp-exporter-base": "0.214.0", + "@opentelemetry/otlp-transformer": "0.214.0", + "@opentelemetry/resources": "2.6.1", + "@opentelemetry/sdk-trace-base": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.214.0.tgz", - "integrity": "sha512-Tx/59RmjBgkXJ3qnsD04rpDrVWL53LU/czpgLJh+Ab98nAroe91I7vZ3uGN9mxwPS0jsZEnmqmHygVwB2vRMlA==", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.214.0.tgz", + "integrity": "sha512-ON0spYWb2yAdQ9b+ItNyK0c6qdtcs+0eVR4YFJkhJL7agfT8sHFg0e5EesauSRiTHPZHiDobI92k77q0lwAmqg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/otlp-exporter-base": "0.214.0", "@opentelemetry/otlp-transformer": "0.214.0", "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-metrics": "2.6.1" + "@opentelemetry/sdk-trace-base": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -5802,65 +5887,33 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/exporter-zipkin": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.6.1.tgz", + "integrity": "sha512-km2/hD3inLTqtLnUAHDGz7ZP/VOyZNslrC/iN66x4jkmpckwlONW54LRPNI6fm09/musDtZga9EWsxgwnjGUlw==", "license": "Apache-2.0", "dependencies": { + "@opentelemetry/core": "2.6.1", + "@opentelemetry/resources": "2.6.1", + "@opentelemetry/sdk-trace-base": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", - "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "node_modules/@opentelemetry/instrumentation": { "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.214.0.tgz", - "integrity": "sha512-pJIcghFGhx3VSCgP5U+yZx+OMNj0t+ttnhC8IjL5Wza7vWIczctF6t3AGcVQffi2dEqX+ZHANoBwoPR8y6RMKA==", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz", + "integrity": "sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.214.0", - "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/otlp-transformer": "0.214.0", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-metrics": "2.6.1" + "@opentelemetry/api-logs": "0.214.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -5869,63 +5922,50 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.60.0.tgz", + "integrity": "sha512-BZqFAoD+frnwjpb0/T4kEEQMhl2YykZch4n2MMLKAVTzTehTBBV2hZxvFF629ipS+WOGBKjCjz1dycU9QNIckQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/instrumentation": "^0.214.0", + "@opentelemetry/semantic-conventions": "^1.30.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", - "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.66.0.tgz", + "integrity": "sha512-KxfLGXBb7k2ueaPJfq2GXBDXBly8P+SpR/4Mj410hhNgmQF3sCqwXvUBQxZQkDAmsdBAoenM+yV1LhtsMRamcA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.214.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.41.2", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.7" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-prometheus": { + "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.214.0.tgz", - "integrity": "sha512-4TGYoZKebUWVuYkV6r5wS2dUF4zH7EbWFw/Uqz1ZM1tGHQeFT9wzHGXq3iSIXMUrwu5jRdxjfMaXrYejPu2kpQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.214.0.tgz", + "integrity": "sha512-u1Gdv0/E9wP+apqWf7Wv2npXmgJtxsW2XL0TEv9FZloTZRuMBKmu8cYVXwS4Hm3q/f/3FuCnPTgiwYvIqRSpRg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-metrics": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/otlp-transformer": "0.214.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -5934,66 +5974,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", - "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.214.0.tgz", - "integrity": "sha512-FWRZ7AWoTryYhthralHkfXUuyO3l7cRsnr49WcDio1orl2a7KxT8aDZdwQtV1adzoUvZ9Gfo+IstElghCS4zfw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.214.0.tgz", + "integrity": "sha512-IDP6zcyA24RhNZ289MP6eToIZcinlmirHjX8v3zKCQ2ZhPpt5cGwkN91tCth337lqHIgWcTy90uKRiX/SzALDw==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.1", "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.214.0", - "@opentelemetry/otlp-transformer": "0.214.0", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1" + "@opentelemetry/otlp-transformer": "0.214.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -6002,65 +5992,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "node_modules/@opentelemetry/otlp-transformer": { "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.214.0.tgz", - "integrity": "sha512-kIN8nTBMgV2hXzV/a20BCFilPZdAIMYYJGSgfMMRm/Xa+07y5hRDS2Vm12A/z8Cdu3Sq++ZvJfElokX2rkgGgw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.214.0.tgz", + "integrity": "sha512-DSaYcuBRh6uozfsWN3R8HsN0yDhCuWP7tOFdkUOVaWD1KVJg8m4qiLUsg/tNhTLS9HUYUcwNpwL2eroLtsZZ/w==", "license": "Apache-2.0", "dependencies": { + "@opentelemetry/api-logs": "0.214.0", "@opentelemetry/core": "2.6.1", - "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/otlp-transformer": "0.214.0", "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1" + "@opentelemetry/sdk-logs": "0.214.0", + "@opentelemetry/sdk-metrics": "2.6.1", + "@opentelemetry/sdk-trace-base": "2.6.1", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -6069,411 +6013,13 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/propagator-b3": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.6.1.tgz", + "integrity": "sha512-Dvz9TA6cPqIbxolSzQ5x9br6iQlqdGhVYrm+oYc7pfJ7LaVXz8F0XIqhWbnKB5YvfZ6SUmabBUUxnvHs/9uhxA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.214.0.tgz", - "integrity": "sha512-ON0spYWb2yAdQ9b+ItNyK0c6qdtcs+0eVR4YFJkhJL7agfT8sHFg0e5EesauSRiTHPZHiDobI92k77q0lwAmqg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/otlp-transformer": "0.214.0", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.6.1.tgz", - "integrity": "sha512-km2/hD3inLTqtLnUAHDGz7ZP/VOyZNslrC/iN66x4jkmpckwlONW54LRPNI6fm09/musDtZga9EWsxgwnjGUlw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz", - "integrity": "sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "import-in-the-middle": "^3.0.0", - "require-in-the-middle": "^8.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.60.0.tgz", - "integrity": "sha512-BZqFAoD+frnwjpb0/T4kEEQMhl2YykZch4n2MMLKAVTzTehTBBV2hZxvFF629ipS+WOGBKjCjz1dycU9QNIckQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.214.0", - "@opentelemetry/semantic-conventions": "^1.30.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.66.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.66.0.tgz", - "integrity": "sha512-KxfLGXBb7k2ueaPJfq2GXBDXBly8P+SpR/4Mj410hhNgmQF3sCqwXvUBQxZQkDAmsdBAoenM+yV1LhtsMRamcA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.214.0", - "@opentelemetry/semantic-conventions": "^1.34.0", - "@opentelemetry/sql-common": "^0.41.2", - "@types/pg": "8.15.6", - "@types/pg-pool": "2.0.7" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.214.0.tgz", - "integrity": "sha512-u1Gdv0/E9wP+apqWf7Wv2npXmgJtxsW2XL0TEv9FZloTZRuMBKmu8cYVXwS4Hm3q/f/3FuCnPTgiwYvIqRSpRg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/otlp-transformer": "0.214.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.214.0.tgz", - "integrity": "sha512-IDP6zcyA24RhNZ289MP6eToIZcinlmirHjX8v3zKCQ2ZhPpt5cGwkN91tCth337lqHIgWcTy90uKRiX/SzALDw==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/core": "2.6.1", - "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/otlp-transformer": "0.214.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.214.0.tgz", - "integrity": "sha512-DSaYcuBRh6uozfsWN3R8HsN0yDhCuWP7tOFdkUOVaWD1KVJg8m4qiLUsg/tNhTLS9HUYUcwNpwL2eroLtsZZ/w==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-logs": "0.214.0", - "@opentelemetry/sdk-metrics": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1", - "protobufjs": "^7.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", - "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.6.1.tgz", - "integrity": "sha512-Dvz9TA6cPqIbxolSzQ5x9br6iQlqdGhVYrm+oYc7pfJ7LaVXz8F0XIqhWbnKB5YvfZ6SUmabBUUxnvHs/9uhxA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/core": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -6483,212 +6029,27 @@ } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.6.1.tgz", - "integrity": "sha512-kKFMxBcjBZAC1vBch5mtZ/dJQvcAEKWga+c+q5iGgRLPIE6Mc649zEwMaCIQCzalziMJQiyUadFYMHmELB7AFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", - "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@opentelemetry/core": "2.7.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.214.0.tgz", - "integrity": "sha512-zf6acnScjhsaBUU22zXZ/sLWim1dfhUAbGXdMmHmNG3LfBnQ3DKsOCITb2IZwoUsNNMTogqFKBnlIPPftUgGwA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", - "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@opentelemetry/core": "2.7.1", - "@opentelemetry/resources": "2.7.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.214.0.tgz", - "integrity": "sha512-gl2XvQBJuPjhGcw9SsnQO5qxChAPMuGRPFaD8lqtF+Cey91NgGUQ0sio2vlDFOSm3JOLzc44vL+OAfx1dXuZjg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "@opentelemetry/configuration": "0.214.0", - "@opentelemetry/context-async-hooks": "2.6.1", - "@opentelemetry/core": "2.6.1", - "@opentelemetry/exporter-logs-otlp-grpc": "0.214.0", - "@opentelemetry/exporter-logs-otlp-http": "0.214.0", - "@opentelemetry/exporter-logs-otlp-proto": "0.214.0", - "@opentelemetry/exporter-metrics-otlp-grpc": "0.214.0", - "@opentelemetry/exporter-metrics-otlp-http": "0.214.0", - "@opentelemetry/exporter-metrics-otlp-proto": "0.214.0", - "@opentelemetry/exporter-prometheus": "0.214.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.214.0", - "@opentelemetry/exporter-trace-otlp-http": "0.214.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.214.0", - "@opentelemetry/exporter-zipkin": "2.6.1", - "@opentelemetry/instrumentation": "0.214.0", - "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/propagator-b3": "2.6.1", - "@opentelemetry/propagator-jaeger": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-logs": "0.214.0", - "@opentelemetry/sdk-metrics": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1", - "@opentelemetry/sdk-trace-node": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", - "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.6.1.tgz", + "integrity": "sha512-kKFMxBcjBZAC1vBch5mtZ/dJQvcAEKWga+c+q5iGgRLPIE6Mc649zEwMaCIQCzalziMJQiyUadFYMHmELB7AFw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1" + "@opentelemetry/core": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { + "node_modules/@opentelemetry/resources": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", + "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -6698,63 +6059,87 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", - "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.214.0.tgz", + "integrity": "sha512-zf6acnScjhsaBUU22zXZ/sLWim1dfhUAbGXdMmHmNG3LfBnQ3DKsOCITb2IZwoUsNNMTogqFKBnlIPPftUgGwA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@opentelemetry/core": "2.7.1", - "@opentelemetry/resources": "2.7.1", + "@opentelemetry/api-logs": "0.214.0", + "@opentelemetry/core": "2.6.1", + "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node": { + "node_modules/@opentelemetry/sdk-metrics": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.1.tgz", - "integrity": "sha512-Hh2i4FwHWRFhnO2Q/p6svMxy8MPsNCG0uuzUY3glqm0rwM0nQvbTO1dXSp9OqQoTKXcQzaz9q1f65fsurmOhNw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", + "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "2.6.1", "@opentelemetry/core": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1" + "@opentelemetry/resources": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", + "node_modules/@opentelemetry/sdk-node": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.214.0.tgz", + "integrity": "sha512-gl2XvQBJuPjhGcw9SsnQO5qxChAPMuGRPFaD8lqtF+Cey91NgGUQ0sio2vlDFOSm3JOLzc44vL+OAfx1dXuZjg==", "license": "Apache-2.0", "dependencies": { + "@opentelemetry/api-logs": "0.214.0", + "@opentelemetry/configuration": "0.214.0", + "@opentelemetry/context-async-hooks": "2.6.1", + "@opentelemetry/core": "2.6.1", + "@opentelemetry/exporter-logs-otlp-grpc": "0.214.0", + "@opentelemetry/exporter-logs-otlp-http": "0.214.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.214.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.214.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.214.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.214.0", + "@opentelemetry/exporter-prometheus": "0.214.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.214.0", + "@opentelemetry/exporter-trace-otlp-http": "0.214.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.214.0", + "@opentelemetry/exporter-zipkin": "2.6.1", + "@opentelemetry/instrumentation": "0.214.0", + "@opentelemetry/otlp-exporter-base": "0.214.0", + "@opentelemetry/propagator-b3": "2.6.1", + "@opentelemetry/propagator-jaeger": "2.6.1", + "@opentelemetry/resources": "2.6.1", + "@opentelemetry/sdk-logs": "0.214.0", + "@opentelemetry/sdk-metrics": "2.6.1", + "@opentelemetry/sdk-trace-base": "2.6.1", + "@opentelemetry/sdk-trace-node": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/resources": { + "node_modules/@opentelemetry/sdk-trace-base": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", + "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.1", + "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -6764,21 +6149,21 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { + "node_modules/@opentelemetry/sdk-trace-node": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.1.tgz", + "integrity": "sha512-Hh2i4FwHWRFhnO2Q/p6svMxy8MPsNCG0uuzUY3glqm0rwM0nQvbTO1dXSp9OqQoTKXcQzaz9q1f65fsurmOhNw==", "license": "Apache-2.0", "dependencies": { + "@opentelemetry/context-async-hooks": "2.6.1", "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/sdk-trace-base": "2.6.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/semantic-conventions": { @@ -6847,9 +6232,9 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { @@ -6875,9 +6260,9 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz", - "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { @@ -6893,9 +6278,9 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, "node_modules/@radix-ui/number": { @@ -8735,9 +8120,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", "cpu": [ "arm" ], @@ -8748,9 +8133,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", "cpu": [ "arm64" ], @@ -8761,9 +8146,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", "cpu": [ "arm64" ], @@ -8774,9 +8159,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", "cpu": [ "x64" ], @@ -8787,9 +8172,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", "cpu": [ "arm64" ], @@ -8800,9 +8185,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", "cpu": [ "x64" ], @@ -8813,9 +8198,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", "cpu": [ "arm" ], @@ -8826,9 +8211,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", "cpu": [ "arm" ], @@ -8839,9 +8224,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", "cpu": [ "arm64" ], @@ -8852,9 +8237,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", "cpu": [ "arm64" ], @@ -8865,9 +8250,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", "cpu": [ "loong64" ], @@ -8878,9 +8263,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", "cpu": [ "loong64" ], @@ -8891,9 +8276,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", "cpu": [ "ppc64" ], @@ -8904,9 +8289,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", "cpu": [ "ppc64" ], @@ -8917,9 +8302,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", "cpu": [ "riscv64" ], @@ -8930,9 +8315,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", "cpu": [ "riscv64" ], @@ -8943,9 +8328,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", "cpu": [ "s390x" ], @@ -8956,9 +8341,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", "cpu": [ "x64" ], @@ -8969,9 +8354,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", "cpu": [ "x64" ], @@ -8982,9 +8367,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", "cpu": [ "x64" ], @@ -8995,9 +8380,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", "cpu": [ "arm64" ], @@ -9008,9 +8393,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", "cpu": [ "arm64" ], @@ -9021,9 +8406,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", "cpu": [ "ia32" ], @@ -9034,9 +8419,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", "cpu": [ "x64" ], @@ -9047,9 +8432,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", "cpu": [ "x64" ], @@ -9145,9 +8530,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", - "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", + "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9182,6 +8567,16 @@ "node": ">=14.0.0" } }, + "node_modules/@spider-cloud/spider-client": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@spider-cloud/spider-client/-/spider-client-0.2.0.tgz", + "integrity": "sha512-O3BBHE/C8XNV+R/RJbMt1mbbSBVSyCxPn/OSX4bi2G8evt1WFH3kepNm3XtzUESG5XKl+B4NMqOnlTSK8n+OXw==", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.2", + "spider-browser": "^0.2.3" + } + }, "node_modules/@sqltools/formatter": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", @@ -9200,14 +8595,49 @@ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, - "node_modules/@storybook/builder-vite": { - "version": "10.3.6", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.3.6.tgz", - "integrity": "sha512-gpvR/sE4BcrFtmQZ+Ker7zD23oQzoVeqD9nF6cK6yzY+Q0svJXyX2EPmFG4y+EwygD5/vNzDpP84gGMut8VRwg==", + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/react-vite": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.3.3.tgz", + "integrity": "sha512-qHdlBe1hjqFAGXa8JL7bWTLbP/gDqXbWDm+SYCB646NHh5yvVDkZLwigP5Y+UL7M2ASfqFtosnroUK9tcCM2dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.4", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "10.3.3", + "@storybook/react": "10.3.3", + "empathic": "^2.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^8.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "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", + "storybook": "^10.3.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/react-vite/node_modules/@storybook/builder-vite": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.3.3.tgz", + "integrity": "sha512-awspKCTZvXyeV3KabL0id62mFbxR5u/5yyGQultwCiSb2/yVgBfip2MAqLyS850pvTiB6QFVM9deOyd2/G/bEA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "10.3.6", + "@storybook/csf-plugin": "10.3.3", "ts-dedent": "^2.0.0" }, "funding": { @@ -9215,14 +8645,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.3.6", + "storybook": "^10.3.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@storybook/csf-plugin": { - "version": "10.3.6", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.3.6.tgz", - "integrity": "sha512-9kBf7VRdRqTSIYo+rPtVn5yjYYyK8kP2QhEYx3oiXvfwy4RexmbJnhk/tXa/lNiTqukA1TqaWQ2+5MqF4fu6YQ==", + "node_modules/@storybook/react-vite/node_modules/@storybook/csf-plugin": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.3.3.tgz", + "integrity": "sha512-Utlh7zubm+4iOzBBfzLW4F4vD99UBtl2Do4edlzK2F7krQIcFvR2ontjAE8S1FQVLZAC3WHalCOS+Ch8zf3knA==", "dev": true, "license": "MIT", "dependencies": { @@ -9235,7 +8665,7 @@ "peerDependencies": { "esbuild": "*", "rollup": "*", - "storybook": "^10.3.6", + "storybook": "^10.3.3", "vite": "*", "webpack": "*" }, @@ -9254,33 +8684,15 @@ } } }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/icons": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.1.tgz", - "integrity": "sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==", - "dev": true, - "license": "MIT", - "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/@storybook/react": { - "version": "10.3.6", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.3.6.tgz", - "integrity": "sha512-oZQZ6xayWe5IdHmFUTL0TL8rX/gpNNh9gWhT2vzW5eeUvlkVG/RBKdsja6Ndrk2s1D9vcnwiI6r6CNXy3IEEmg==", + "node_modules/@storybook/react-vite/node_modules/@storybook/react": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.3.3.tgz", + "integrity": "sha512-cGG5TbR8Tdx9zwlpsWyBEfWrejm5iWdYF26EwIhwuKq9GFUTAVrQzo0Rs7Tqc3ZyVhRS/YfsRiWSEH+zmq2JiQ==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "10.3.6", + "@storybook/react-dom-shim": "10.3.3", "react-docgen": "^8.0.2", "react-docgen-typescript": "^2.2.2" }, @@ -9291,7 +8703,7 @@ "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", - "storybook": "^10.3.6", + "storybook": "^10.3.3", "typescript": ">= 4.9.x" }, "peerDependenciesMeta": { @@ -9300,10 +8712,10 @@ } } }, - "node_modules/@storybook/react-dom-shim": { - "version": "10.3.6", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.3.6.tgz", - "integrity": "sha512-/Tu1gPu+Fw+zOnAGmxRmOD30FX3a04LxcTAKflEtdpmtIMVR5bA3qpjy+f5YhoyDCecbXyKmL1OeIU2FIIZHqQ==", + "node_modules/@storybook/react-vite/node_modules/@storybook/react-dom-shim": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.3.3.tgz", + "integrity": "sha512-lkhuh4G3UTreU9M3Iz5Dt32c6U+l/4XuvqLtbe1sDHENZH6aPj7y0b5FwnfHyvuTvYRhtbo29xZrF5Bp9kCC0w==", "dev": true, "license": "MIT", "funding": { @@ -9313,35 +8725,23 @@ "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", - "storybook": "^10.3.6" + "storybook": "^10.3.3" } }, - "node_modules/@storybook/react-vite": { - "version": "10.3.6", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.3.6.tgz", - "integrity": "sha512-tySQRc+8q7V2NkylQMNJjDV8zXy6tkxb8oDqw/DIhHhI9Xn77MTKVZ8Cihbo5NMm7HYTB6xDKr6wqdSMgdufYQ==", + "node_modules/@storybook/react-vite/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", "dev": true, "license": "MIT", "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", - "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "10.3.6", - "@storybook/react": "10.3.6", - "empathic": "^2.0.0", - "magic-string": "^0.30.0", - "react-docgen": "^8.0.0", - "resolve": "^1.22.8", - "tsconfig-paths": "^4.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" }, - "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", - "storybook": "^10.3.6", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=18.12.0" } }, "node_modules/@swc/helpers": { @@ -9402,9 +8802,9 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", - "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", @@ -9413,7 +8813,7 @@ "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.2.4" + "tailwindcss": "4.2.2" } }, "node_modules/@tailwindcss/node/node_modules/magic-string": { @@ -9426,32 +8826,32 @@ } }, "node_modules/@tailwindcss/oxide": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", - "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.4", - "@tailwindcss/oxide-darwin-arm64": "4.2.4", - "@tailwindcss/oxide-darwin-x64": "4.2.4", - "@tailwindcss/oxide-freebsd-x64": "4.2.4", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", - "@tailwindcss/oxide-linux-x64-musl": "4.2.4", - "@tailwindcss/oxide-wasm32-wasi": "4.2.4", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", - "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", "cpu": [ "arm64" ], @@ -9465,9 +8865,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", - "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", "cpu": [ "arm64" ], @@ -9481,9 +8881,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", - "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", "cpu": [ "x64" ], @@ -9497,9 +8897,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", - "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", "cpu": [ "x64" ], @@ -9513,9 +8913,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", - "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", "cpu": [ "arm" ], @@ -9529,9 +8929,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", - "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", "cpu": [ "arm64" ], @@ -9545,9 +8945,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", - "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", "cpu": [ "arm64" ], @@ -9561,9 +8961,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", - "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", "cpu": [ "x64" ], @@ -9577,9 +8977,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", - "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", "cpu": [ "x64" ], @@ -9593,9 +8993,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", - "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -9622,9 +9022,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", - "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", "cpu": [ "arm64" ], @@ -9638,9 +9038,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", - "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", "cpu": [ "x64" ], @@ -9654,57 +9054,28 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz", - "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", + "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.2.4", - "@tailwindcss/oxide": "4.2.4", + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", "postcss": "^8.5.6", - "tailwindcss": "4.2.4" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "tailwindcss": "4.2.2" } }, "node_modules/@tailwindcss/vite": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz", - "integrity": "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.2.4", - "@tailwindcss/oxide": "4.2.4", - "tailwindcss": "4.2.4" + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" @@ -9731,12 +9102,12 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.13.24", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.24.tgz", - "integrity": "sha512-aIJvz5OSkhNIhZIpYivrxrPTKYsjW9Uzy+sP/mx0S3sev2HyvPb7xmjbYvokzEpfgYHy/HjzJ2zFAETuUfgCpg==", + "version": "3.13.23", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", + "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.14.0" + "@tanstack/virtual-core": "3.13.23" }, "funding": { "type": "github", @@ -9761,9 +9132,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.14.0.tgz", - "integrity": "sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==", + "version": "3.13.23", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", + "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", "funding": { "type": "github", @@ -9771,19 +9142,20 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", + "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", - "picocolors": "1.1.1", "pretty-format": "^27.0.2" }, "engines": { @@ -9796,6 +9168,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -9809,6 +9182,7 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -9821,50 +9195,10 @@ "node_modules/@testing-library/dom/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/@tokenizer/inflate": { "version": "0.4.1", @@ -10017,9 +9351,9 @@ "license": "MIT" }, "node_modules/@turbo/darwin-64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/darwin-64/-/darwin-64-2.9.6.tgz", - "integrity": "sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@turbo/darwin-64/-/darwin-64-2.9.3.tgz", + "integrity": "sha512-P8foouaP+y/p+hhEGBoZpzMbpVvUMwPjDpcy6wN7EYfvvyISD1USuV27qWkczecihwuPJzQ1lDBuL8ERcavTyg==", "cpu": [ "x64" ], @@ -10031,9 +9365,9 @@ ] }, "node_modules/@turbo/darwin-arm64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/darwin-arm64/-/darwin-arm64-2.9.6.tgz", - "integrity": "sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@turbo/darwin-arm64/-/darwin-arm64-2.9.3.tgz", + "integrity": "sha512-SIzEkvtNdzdI50FJDaIQ6kQGqgSSdFPcdn0wqmmONN6iGKjy6hsT+EH99GP65FsfV7DLZTh2NmtTIRl2kdoz5Q==", "cpu": [ "arm64" ], @@ -10045,9 +9379,9 @@ ] }, "node_modules/@turbo/linux-64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/linux-64/-/linux-64-2.9.6.tgz", - "integrity": "sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@turbo/linux-64/-/linux-64-2.9.3.tgz", + "integrity": "sha512-pLRwFmcHHNBvsCySLS6OFabr/07kDT2pxEt/k6eBf/3asiVQZKJ7Rk88AafQx2aYA641qek4RsXvYO3JYpiBug==", "cpu": [ "x64" ], @@ -10059,9 +9393,9 @@ ] }, "node_modules/@turbo/linux-arm64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/linux-arm64/-/linux-arm64-2.9.6.tgz", - "integrity": "sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@turbo/linux-arm64/-/linux-arm64-2.9.3.tgz", + "integrity": "sha512-gy6ApUroC2Nzv+qjGtE/uPNkhHAFU4c8God+zd5Aiv9L9uBgHlxVJpHT3XWl5xwlJZ2KWuMrlHTaS5kmNB+q1Q==", "cpu": [ "arm64" ], @@ -10073,9 +9407,9 @@ ] }, "node_modules/@turbo/windows-64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/windows-64/-/windows-64-2.9.6.tgz", - "integrity": "sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@turbo/windows-64/-/windows-64-2.9.3.tgz", + "integrity": "sha512-d0YelTX6hAsB7kIEtGB3PzIzSfAg3yDoUlHwuwJc3adBXUsyUIs0YLG+1NNtuhcDOUGnWQeKUoJ2pGWvbpRj7w==", "cpu": [ "x64" ], @@ -10087,9 +9421,9 @@ ] }, "node_modules/@turbo/windows-arm64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/windows-arm64/-/windows-arm64-2.9.6.tgz", - "integrity": "sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@turbo/windows-arm64/-/windows-arm64-2.9.3.tgz", + "integrity": "sha512-/08CwpKJl3oRY8nOlh2YgilZVJDHsr60XTNxRhuDeuFXONpUZ5X+Nv65izbG/xBew9qxcJFbDX9/sAmAX+ITcQ==", "cpu": [ "arm64" ], @@ -10105,7 +9439,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -10494,7 +9829,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -10586,7 +9920,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -10667,19 +10000,14 @@ "@types/node": "*" } }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "dev": true, "license": "MIT", "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, @@ -10695,17 +10023,6 @@ "@types/send": "<1" } }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -10779,14 +10096,14 @@ "license": "MIT" }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", - "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", + "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.1", - "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/tsconfig-utils": "^8.59.0", + "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "engines": { @@ -10801,9 +10118,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", - "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", + "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", "dev": true, "license": "MIT", "engines": { @@ -10818,9 +10135,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", - "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", "dev": true, "license": "MIT", "engines": { @@ -10832,16 +10149,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", - "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.1", - "@typescript-eslint/tsconfig-utils": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/project-service": "8.59.0", + "@typescript-eslint/tsconfig-utils": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -10912,13 +10229,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", - "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -10936,9 +10253,9 @@ "license": "ISC" }, "node_modules/@vercel/oidc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", - "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz", + "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==", "license": "Apache-2.0", "engines": { "node": ">= 20" @@ -10995,14 +10312,65 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@vitest/mocker": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", - "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.5", + "@vitest/spy": "4.1.2", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -11022,16 +10390,6 @@ } } }, - "node_modules/@vitest/mocker/node_modules/@vitest/spy": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", - "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vitest/mocker/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -11053,60 +10411,32 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", + "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", - "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", + "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.5", + "@vitest/utils": "4.1.2", "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", - "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/@vitest/utils": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", - "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.5", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vitest/runner/node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -11114,25 +10444,15 @@ "dev": true, "license": "MIT" }, - "node_modules/@vitest/runner/node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@vitest/snapshot": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", - "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", + "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.5", - "@vitest/utils": "4.1.5", + "@vitest/pretty-format": "4.1.2", + "@vitest/utils": "4.1.2", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -11140,34 +10460,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", - "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/@vitest/utils": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", - "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.5", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vitest/snapshot/node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -11185,84 +10477,84 @@ "dev": true, "license": "MIT" }, - "node_modules/@vitest/snapshot/node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", + "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", + "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.1.2", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.33.tgz", - "integrity": "sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", + "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.33", + "@vue/shared": "3.5.32", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/@vue/compiler-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", - "integrity": "sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", + "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-core": "3.5.32", + "@vue/shared": "3.5.32" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.33.tgz", - "integrity": "sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", + "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.33", - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33", + "@vue/compiler-core": "3.5.32", + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.10", + "postcss": "^8.5.8", "source-map-js": "^1.2.1" } }, @@ -11276,50 +10568,21 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/@vue/compiler-sfc/node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.33.tgz", - "integrity": "sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", + "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-dom": "3.5.32", + "@vue/shared": "3.5.32" } }, "node_modules/@vue/shared": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.33.tgz", - "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", + "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", "dev": true, "license": "MIT" }, @@ -11484,13 +10747,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@webcontainer/env": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", - "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", - "dev": true, - "license": "MIT" - }, "node_modules/@xmldom/xmldom": { "version": "0.9.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", @@ -11551,7 +10807,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -11647,14 +10902,14 @@ } }, "node_modules/ai": { - "version": "6.0.170", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.170.tgz", - "integrity": "sha512-FWTKeGGDRcYJtPWIrdZDSuvOW5LCjI2NZUJmaml8OTOaPEsXnFdFvmawCXbT+wTGxyWKJTgZ9sZtCjbJsmjM2Q==", + "version": "6.0.142", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.142.tgz", + "integrity": "sha512-ZoxAsnTL/dFg5WdcwC8QNhKVlLtqwwT3I7p/4i8IJJP+6ZwqF1ljuwMsAsPYYvppZ+RzUxjxxFGb1cbEhNH3dg==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "3.0.105", - "@ai-sdk/provider": "3.0.9", - "@ai-sdk/provider-utils": "4.0.24", + "@ai-sdk/gateway": "3.0.84", + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.21", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -11664,27 +10919,17 @@ "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/ai/node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "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", @@ -11709,17 +10954,38 @@ } } }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, "peerDependencies": { - "ajv": "^8.8.2" + "ajv": "^6.9.1" } }, "node_modules/ansi-colors": { @@ -12059,9 +11325,9 @@ } }, "node_modules/axios": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", - "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -12075,7 +11341,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -12146,7 +11411,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/types": "^7.26.0" @@ -12242,9 +11507,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.24", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz", - "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==", + "version": "2.10.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.13.tgz", + "integrity": "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12359,7 +11624,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -12435,21 +11699,18 @@ "license": "MIT" }, "node_modules/bullmq": { - "version": "5.76.4", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.76.4.tgz", - "integrity": "sha512-hVAplia7zfN3BxSCgAoRInJnbemfLwJdQLqJy/txEX8UMSTAeg0saPFNGWIlzES/Ct5xQ20TUaik/XwS99DOMA==", + "version": "5.71.1", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.71.1.tgz", + "integrity": "sha512-kOBfdcsHmO6wwmIjpersoVdYQ7jkjTgky4Yop0loc7QwSdgxliSzD69U9ijZuRrkyCJwz5p5eqxeGeQkJ0YGZQ==", "license": "MIT", - "peer": true, "dependencies": { "cron-parser": "4.9.0", "ioredis": "5.10.1", "msgpackr": "1.11.5", "node-abort-controller": "3.1.1", "semver": "7.7.4", - "tslib": "2.8.1" - }, - "engines": { - "node": ">=12.22.0" + "tslib": "2.8.1", + "uuid": "11.1.0" } }, "node_modules/bullmq/node_modules/semver": { @@ -12543,14 +11804,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" }, "engines": { @@ -12610,9 +11871,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001791", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", - "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "version": "1.0.30001784", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz", + "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==", "devOptional": true, "funding": [ { @@ -12944,9 +12205,10 @@ } }, "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8" @@ -13086,9 +12348,9 @@ } }, "node_modules/comment-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-5.0.0.tgz", - "integrity": "sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", + "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", "dev": true, "license": "MIT", "dependencies": { @@ -13162,9 +12424,9 @@ "optional": true }, "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -13746,16 +13008,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -13894,20 +13146,6 @@ "node": ">=20" } }, - "node_modules/dependency-cruiser/node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/dependency-cruiser/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -13985,15 +13223,15 @@ "license": "MIT" }, "node_modules/detective-amd": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.1.0.tgz", - "integrity": "sha512-fmI6LGMvotqd49QaA3ZYw+q0aGp2yXmMjzIuY6fH9j9YFIXY/73yDhMwhX9cPbhWd+AH06NH1Di/LKOuCH0Ubg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.2.tgz", + "integrity": "sha512-qX4zkNVcufOoo7pKlRnLHEzUwDcqIY5N9FEuNJN+rDUjct3gikNdVJXRfpI6sG/Y9pfIMjcXeNdHV1oYulxjmw==", "dev": true, "license": "MIT", "dependencies": { "ast-module-types": "^6.0.1", "escodegen": "^2.1.0", - "get-amd-module-type": "^6.0.2", + "get-amd-module-type": "^6.0.1", "node-source-walk": "^7.0.1" }, "bin": { @@ -14030,10 +13268,27 @@ "node": ">=18" } }, + "node_modules/detective-postcss": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", + "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-url": "^1.2.4", + "postcss-values-parser": "^6.0.2" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.47" + } + }, "node_modules/detective-sass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.2.tgz", - "integrity": "sha512-i3xpXHDKS0qI2aFW4asQ7fqlPK00ndOVZELvQapFJCaF0VxYmsNWtd0AmvXbTLMk7bfO5VdIeorhY9KfmHVoVA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.1.tgz", + "integrity": "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==", "dev": true, "license": "MIT", "dependencies": { @@ -14045,9 +13300,9 @@ } }, "node_modules/detective-scss": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.2.tgz", - "integrity": "sha512-9JOEMZ8pDh3ShXmftq7hoQqqJsClaGgxo1hghfCeFlmKf5TC/Twtwb0PAaK8dXwpg9Z0uCmEYSrCxO+kel2eEg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.1.tgz", + "integrity": "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==", "dev": true, "license": "MIT", "dependencies": { @@ -14069,9 +13324,9 @@ } }, "node_modules/detective-typescript": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.1.2.tgz", - "integrity": "sha512-bIeEn0eVi/JRsE1YizBR2ilnMlWRAIBJJ6kXCKNFxEEWhUcEY3R6I3KYIAy48ieURbD1hcb3Ebvl8AqeoPMSzg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.1.1.tgz", + "integrity": "sha512-P0V72pffNrtjHm7kZPiwXeM47l3jF/M3nZ543ZNVWG6sWvYwq95ERoL1+6Txm5Mam8EPVu1gqpHECvoAZsznog==", "dev": true, "license": "MIT", "dependencies": { @@ -14176,7 +13431,8 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dom-serializer": { "version": "2.0.0", @@ -14192,18 +13448,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -14362,9 +13606,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "version": "1.5.330", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.330.tgz", + "integrity": "sha512-jFNydB5kFtYUobh4IkWUnXeyDbjf/r9gcUEXe1xcrcUxIGfTdzPXA+ld6zBRbwvgIGVzDll/LTIiDztEtckSnA==", "dev": true, "license": "ISC" }, @@ -14416,23 +13660,22 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", - "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -14550,9 +13793,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, "license": "MIT" }, @@ -14601,9 +13844,9 @@ } }, "node_modules/es-toolkit": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", - "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz", + "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==", "license": "MIT", "workspaces": [ "docs", @@ -14611,9 +13854,9 @@ ] }, "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -14623,32 +13866,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/escalade": { @@ -14700,6 +13943,16 @@ "source-map": "~0.6.1" } }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -14725,16 +13978,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", @@ -14775,7 +14018,7 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { + "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -14785,6 +14028,16 @@ "node": ">=4.0" } }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", @@ -14847,9 +14100,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", - "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -14923,12 +14176,17 @@ "node": ">=12.0.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.0" + }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -14993,6 +14251,15 @@ "express": ">= 4.17.0" } }, + "node_modules/express-openid-connect/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/express-openid-connect/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -15117,9 +14384,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -15134,9 +14401,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", - "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", "funding": [ { "type": "github", @@ -15149,9 +14416,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", - "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", + "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", "funding": [ { "type": "github", @@ -15160,10 +14427,9 @@ ], "license": "MIT", "dependencies": { - "@nodable/entities": "^2.1.0", - "fast-xml-builder": "^1.1.5", - "path-expression-matcher": "^1.5.0", - "strnum": "^2.2.3" + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.2" }, "bin": { "fxparser": "src/cli/cli.js" @@ -15250,21 +14516,21 @@ } }, "node_modules/filing-cabinet": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.4.1.tgz", - "integrity": "sha512-XSZKDRYZ7ijMsr6aTD5rUy5nh4Dsg4+N74bufCHzdhFAh4argabH8CBGcus1ha+hGbJf7OQmbtTVVNnb1uDpmw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.3.0.tgz", + "integrity": "sha512-2EwtzdQkC37FJxDOrKuEOplTFzzaToCqzT008DrIWW27RQ6psxitfUi6hct5mUhMHO7C6xopOhxubyjyPCapbQ==", "dev": true, "license": "MIT", "dependencies": { "app-module-path": "^2.2.0", "commander": "^12.1.0", - "enhanced-resolve": "^5.21.0", - "module-definition": "^6.0.2", - "module-lookup-amd": "^9.1.3", + "enhanced-resolve": "^5.20.1", + "module-definition": "^6.0.1", + "module-lookup-amd": "^9.1.1", "resolve": "^1.22.12", "resolve-dependency-path": "^4.0.1", - "sass-lookup": "^6.1.2", - "stylus-lookup": "^6.1.2", + "sass-lookup": "^6.1.1", + "stylus-lookup": "^6.1.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.9.3" }, @@ -15344,9 +14610,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -15692,7 +14958,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -15703,17 +14968,49 @@ } }, "node_modules/gcp-metadata": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", "license": "Apache-2.0", "dependencies": { - "gaxios": "^6.1.1", - "google-logging-utils": "^0.0.2", + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/gaxios": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/generator-function": { @@ -16007,29 +15304,6 @@ "node": ">=18" } }, - "node_modules/google-auth-library/node_modules/gcp-metadata": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-auth-library/node_modules/google-logging-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/google-auth-library/node_modules/node-fetch": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", @@ -16070,15 +15344,6 @@ "node": ">=18" } }, - "node_modules/google-gax/node_modules/google-logging-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/google-gax/node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -16139,9 +15404,9 @@ } }, "node_modules/google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -16166,15 +15431,29 @@ "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", "license": "Apache-2.0", "dependencies": { - "extend": "^3.0.2", - "gaxios": "^6.0.3", - "google-auth-library": "^9.7.0", - "qs": "^6.7.0", - "url-template": "^2.0.8", - "uuid": "^9.0.0" + "extend": "^3.0.2", + "gaxios": "^6.0.3", + "google-auth-library": "^9.7.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common/node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=14" } }, "node_modules/googleapis-common/node_modules/google-auth-library": { @@ -16194,11 +15473,19 @@ "node": ">=14" } }, + "node_modules/googleapis-common/node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/googleapis-common/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -16208,6 +15495,20 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/googleapis/node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/googleapis/node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -16225,6 +15526,15 @@ "node": ">=14" } }, + "node_modules/googleapis/node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -16424,9 +15734,9 @@ "optional": true }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -16552,18 +15862,6 @@ "entities": "^4.4.0" } }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -16671,7 +15969,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.29.2" }, @@ -16746,9 +16043,9 @@ "license": "MIT" }, "node_modules/immer": { - "version": "11.1.4", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", - "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.6.tgz", + "integrity": "sha512-uwrF08UBQfxk49i9WcUeCx045wjB1zXEHNJmbYHPVVspxmjwSeWCoKbB8DEIvs3XkBJV6lcRAyLaWJ2+u3MMCw==", "license": "MIT", "funding": { "type": "opencollective", @@ -17244,19 +16541,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-network-error": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", - "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -17667,7 +16951,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -17955,13 +17238,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", @@ -18240,13 +17516,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-diff": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", @@ -18390,13 +17659,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -18676,13 +17938,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-leak-detector/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-matcher-utils": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", @@ -19028,13 +18283,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-runner/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -19262,13 +18510,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", @@ -19481,13 +18722,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -19507,7 +18741,6 @@ "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.3.0", "@types/node": "*", @@ -19633,13 +18866,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/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==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", @@ -19873,7 +19099,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -19970,9 +19195,9 @@ "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, @@ -19997,9 +19222,9 @@ "license": "MIT" }, "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -20082,15 +19307,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -20226,9 +19442,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.12.42", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.42.tgz", - "integrity": "sha512-oKQFPTibqQwZZkChCDVMFVJXMZdyJNqDWZWYNn8BgyAaK/6yFJEowxCY0RVFirRyWP63hMRuKlkSEd9qlvbWXg==", + "version": "1.12.41", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.41.tgz", + "integrity": "sha512-lsmMmGXBxXIK/VMLEj0kL6MtUs1kBGj1nTCzi6zgQoG1DEwqwt2DQyHxcLykceIxAnfE3hya7NuIh6PpC6S3fA==", "license": "MIT" }, "node_modules/lie": { @@ -20245,7 +19461,6 @@ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "license": "MPL-2.0", - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -20521,102 +19736,6 @@ "node": ">=18.0.0" } }, - "node_modules/llamaindex/node_modules/@llamaindex/core": { - "version": "0.6.22", - "resolved": "https://registry.npmjs.org/@llamaindex/core/-/core-0.6.22.tgz", - "integrity": "sha512-/BXyemkvpxMaUhOkbwJ2PTvzKjSWkL8+6QLpz/n+pk8xBwMMe1GVBgli/J57gCyi8GbrlBafBj6GaPOgWub2Eg==", - "peer": true, - "dependencies": { - "@finom/zod-to-json-schema": "3.24.11", - "@llamaindex/env": "0.1.30", - "@types/node": "^24.0.13", - "magic-bytes.js": "^1.10.0", - "zod": "^4.1.5" - } - }, - "node_modules/llamaindex/node_modules/@llamaindex/env": { - "version": "0.1.30", - "resolved": "https://registry.npmjs.org/@llamaindex/env/-/env-0.1.30.tgz", - "integrity": "sha512-y6kutMcCevzbmexUgz+HXf7KiZemzAoFEYSjAILfR+cG6FmYSF8XvLbGOB34Kx8mlRi7EI8rZXpezJ5qCqOyZg==", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "js-tiktoken": "^1.0.12", - "pathe": "^1.1.2" - }, - "peerDependencies": { - "@huggingface/transformers": "^3.5.0", - "gpt-tokenizer": "^2.5.0" - }, - "peerDependenciesMeta": { - "@huggingface/transformers": { - "optional": true - }, - "gpt-tokenizer": { - "optional": true - } - } - }, - "node_modules/llamaindex/node_modules/@llamaindex/node-parser": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@llamaindex/node-parser/-/node-parser-2.0.22.tgz", - "integrity": "sha512-uj5O89WShAAyiSZ8f8tU7hnLJ6pSmlY2a6hkAOs8odkUgT87dEqaPHpsK7w0iJdEFiob7GoLeRhv2K624FooXg==", - "dependencies": { - "html-to-text": "^9.0.5" - }, - "peerDependencies": { - "@llamaindex/core": "0.6.22", - "@llamaindex/env": "0.1.30", - "tree-sitter": "^0.22.0", - "web-tree-sitter": "^0.24.3" - } - }, - "node_modules/llamaindex/node_modules/@llamaindex/workflow": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/@llamaindex/workflow/-/workflow-1.1.24.tgz", - "integrity": "sha512-VyKsbRkFlnT5dRNKbgLXQV+ZpQ+CAFgmC9LaZv6hD/fIKo6wq1wQW/ZqLZgZt569xeHgxmrXPB6KHdqn/AhPbQ==", - "dependencies": { - "@llamaindex/workflow-core": "^1.3.2" - }, - "peerDependencies": { - "@llamaindex/core": "0.6.22", - "@llamaindex/env": "0.1.30" - } - }, - "node_modules/llamaindex/node_modules/@llamaindex/workflow-core": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@llamaindex/workflow-core/-/workflow-core-1.3.3.tgz", - "integrity": "sha512-WJIcD4K2suGbNkwU5CC70jKKrA5tARba42nMs8Pou1RGzmoxqg+K+b7vyLBmiDtImR8P40YLmkayCIRVQPBmsg==", - "license": "MIT", - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.7.0", - "hono": "^4.7.4", - "next": "^15.2.2", - "p-retry": "^6.2.1", - "rxjs": "^7.8.2", - "zod": "^3.25.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - }, - "hono": { - "optional": true - }, - "next": { - "optional": true - }, - "p-retry": { - "optional": true - }, - "rxjs": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/llamaindex/node_modules/@types/node": { "version": "24.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", @@ -20626,13 +19745,6 @@ "undici-types": "~7.16.0" } }, - "node_modules/llamaindex/node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "license": "MIT", - "optional": true - }, "node_modules/load-esm": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", @@ -20653,9 +19765,9 @@ } }, "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", "engines": { @@ -20899,6 +20011,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -22172,9 +21285,9 @@ "license": "MIT" }, "node_modules/module-lookup-amd": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-9.1.3.tgz", - "integrity": "sha512-Jc3XmOaR9FdfMJSK8+vyLgsCkzm8z2L0NS6vrlRWi12DjS7MY7TMNE7E1yj8yXx837xtMDbKSSgcdXnFlJ2YLg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-9.1.2.tgz", + "integrity": "sha512-HFEiUNm8/woZFJZcd42wrovEHjHN6nwfNjf2CjiVLbVFRbj+sEmEJn0mrx8JY4/qJP8wSZTtmguikAJBqEuRRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22371,7 +21484,6 @@ "integrity": "sha512-VSqCrJwtLVGwAVE0Sb/yikrQfkwkZW9p+lL/J4+xe+G3ZA+QnWPqgcfH1tDUEuk9y+pthzzVFp4L/U8JerMfMQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@next/env": "15.5.15", "@swc/helpers": "0.5.15", @@ -22414,19 +21526,48 @@ "babel-plugin-react-compiler": { "optional": true }, - "sass": { - "optional": true + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + ], "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, "node_modules/node-abort-controller": { @@ -22440,6 +21581,7 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", "license": "MIT", + "peer": true, "engines": { "node": "^18 || ^20 || >= 21" } @@ -22499,6 +21641,7 @@ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "license": "MIT", + "peer": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -22528,20 +21671,20 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "dev": true, "license": "MIT" }, "node_modules/node-source-walk": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.2.tgz", - "integrity": "sha512-71kFFjYaSshDTA8/a2HiTYPLdASWjLJxUyJxGE+ffxU+KhxSBtM9kiLUX+R2yooFdSFKMFpi4n3PFtDy6qXv8A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.1.tgz", + "integrity": "sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0" + "@babel/parser": "^7.26.7" }, "engines": { "node": ">=18" @@ -22613,9 +21756,9 @@ } }, "node_modules/oauth4webapi": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.6.tgz", - "integrity": "sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ==", + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.5.tgz", + "integrity": "sha512-A8jmyUckVhRJj5lspguklcl90Ydqk61H3dcU0oLhH3Yv13KpAliKTt5hknpGGPZSSfOwGyraNEFmofDYH+1kSg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -22899,19 +22042,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -23034,7 +22164,6 @@ "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", "license": "MIT", - "peer": true, "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", @@ -23077,9 +22206,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", - "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", + "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", "funding": [ { "type": "github", @@ -23134,9 +22263,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -23198,7 +22327,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -23362,10 +22490,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "devOptional": true, + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "funding": [ { "type": "opencollective", @@ -23381,11 +22508,10 @@ } ], "license": "MIT", - "peer": true, "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -23488,53 +22614,6 @@ "node": ">=18" } }, - "node_modules/precinct/node_modules/detective-postcss": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", - "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-url": "^1.2.4", - "postcss-values-parser": "^6.0.2" - }, - "engines": { - "node": "^14.0.0 || >=16.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.47" - } - }, - "node_modules/precinct/node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/pretty-format": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", @@ -23563,13 +22642,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-format/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==", - "dev": true, - "license": "MIT" - }, "node_modules/pretty-ms": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", @@ -23646,22 +22718,22 @@ } }, "node_modules/protobufjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz", - "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", + "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.1", + "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", + "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" }, @@ -23729,9 +22801,9 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -23988,11 +23060,10 @@ } }, "node_modules/react": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", - "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -24052,16 +23123,15 @@ } }, "node_modules/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.5" + "react": "^19.2.4" } }, "node_modules/react-dropzone": { @@ -24082,11 +23152,10 @@ } }, "node_modules/react-hook-form": { - "version": "7.74.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.74.0.tgz", - "integrity": "sha512-yR6wHr99p9wFv686jhRWVSFhUvDvNbdUf2dKlbno8/VKOCuoNobDGC6S+M2dua9A9Yo8vpcrp8assIYbsZCQ9g==", + "version": "7.72.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.72.0.tgz", + "integrity": "sha512-V4v6jubaf6JAurEaVnT9aUPKFbNtDgohj5CIgVGyPHvT9wRx5OZHVjz31GsxnPNI278XMu+ruFz+wGOscHaLKw==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -24136,11 +23205,10 @@ } }, "node_modules/react-is": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz", - "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==", - "license": "MIT", - "peer": true + "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==", + "license": "MIT" }, "node_modules/react-markdown": { "version": "10.1.0", @@ -24174,7 +23242,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", - "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -24251,9 +23318,9 @@ } }, "node_modules/react-router": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.2.tgz", - "integrity": "sha512-yCqNne6I8IB6rVCH7XUvlBK7/QKyqypBFGv+8dj4QBFJiiRX+FG7/nkdAvGElyvVZ/HQP5N19wzteuTARXi5Gw==", + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.2.tgz", + "integrity": "sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -24273,12 +23340,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.2.tgz", - "integrity": "sha512-YZcM5ES8jJSM+KrJ9BdvHHqlnGTg5tH3sC5ChFRj4inosKctdyzBDhOyyHdGk597q2OT6NTrCA1OvB/YDwfekQ==", + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.2.tgz", + "integrity": "sha512-aR7SUORwTqAW0JDeiWF07e9SBE9qGpByR9I8kJT5h/FrBKxPMS6TiC7rmVO+gC0q52Bx7JnjWe8Z1sR9faN4YA==", "license": "MIT", "dependencies": { - "react-router": "7.14.2" + "react-router": "7.13.2" }, "engines": { "node": ">=20.0.0" @@ -24492,8 +23559,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -24508,8 +23574,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", @@ -24930,11 +23995,10 @@ } }, "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -24946,31 +24010,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" } }, @@ -25008,20 +24072,19 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -25102,9 +24165,9 @@ "license": "MIT" }, "node_modules/sass-lookup": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-6.1.2.tgz", - "integrity": "sha512-GjmndmKQBtlPil79RK72L7yc5kDXZPCQeH97bP8R8DcxtXQJO6vECExb3WP/m6+cxaV9h4ZxrSRvCkPG2v/VSw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-6.1.1.tgz", + "integrity": "sha512-12dvZdQYTeKZ1ypjuiijZYuMZ1m0F+4+BkRX5yJi2WA9W3DBUrcdCt7bVuKlagHl11n8eYtalWDle+m98Ol2DA==", "dev": true, "license": "MIT", "dependencies": { @@ -25153,41 +24216,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "peer": 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/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, "node_modules/selderee": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", @@ -25350,7 +24378,6 @@ "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "optional": true, @@ -25396,7 +24423,6 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, "license": "ISC", "optional": true, "bin": { @@ -25447,13 +24473,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" + "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" @@ -25628,6 +24654,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/spider-browser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/spider-browser/-/spider-browser-0.2.7.tgz", + "integrity": "sha512-6/AqU7Y8RGPP3eHPFYitXQa4oV849k5fcv5cbjnAGmcfDQihij8kaB+HVgn6CmbmK6aLtZP8YfvbvWhDUo/CHQ==", + "license": "MIT", + "dependencies": { + "ws": "^8.18.0", + "zod": "^3.23.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/spider-browser/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -25705,9 +24753,9 @@ } }, "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", "dev": true, "license": "MIT" }, @@ -25725,12 +24773,11 @@ } }, "node_modules/storybook": { - "version": "10.3.6", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.3.6.tgz", - "integrity": "sha512-vbSz7g/1rGMC1uAULqMZjALkIuLu2QABqfhRYhyr/11kzyesi+vAmwyJLukZP1FfecxGOgMwOh6GS0YsGpHAvQ==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.3.3.tgz", + "integrity": "sha512-tMoRAts9EVqf+mEMPLC6z1DPyHbcPe+CV1MhLN55IKsl0HxNjvVGK44rVPSePbltPE6vIsn4bdRj6CCUt8SJwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.1", @@ -25738,7 +24785,6 @@ "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", - "@webcontainer/env": "^1.1.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", "open": "^10.2.0", "recast": "^0.23.5", @@ -25754,45 +24800,106 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "prettier": "^2 || ^3", - "vite-plus": "^0.1.15" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - }, - "vite-plus": { - "optional": true - } + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/storybook-addon-remix-react-router": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/storybook-addon-remix-react-router/-/storybook-addon-remix-react-router-6.1.0.tgz", + "integrity": "sha512-p0LmPEGRF2/6Y6WJFhLZLhKEkHHrqNgzIDfHw1JMBGHxGWcZbEZtcHm3rrMw7jCzqsW4eHEr9OriOmZCetcKwg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@mjackson/form-data-parser": "^0.4.0", + "compare-versions": "^6.0.0", + "react-inspector": "9.0.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0", + "react-router": "^7.0.2", + "storybook": "^10.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/storybook/node_modules/@storybook/icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.1.tgz", + "integrity": "sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==", + "dev": true, + "license": "MIT", + "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/storybook/node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/storybook/node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/storybook-addon-remix-react-router": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/storybook-addon-remix-react-router/-/storybook-addon-remix-react-router-6.1.0.tgz", - "integrity": "sha512-p0LmPEGRF2/6Y6WJFhLZLhKEkHHrqNgzIDfHw1JMBGHxGWcZbEZtcHm3rrMw7jCzqsW4eHEr9OriOmZCetcKwg==", + "node_modules/storybook/node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@mjackson/form-data-parser": "^0.4.0", - "compare-versions": "^6.0.0", - "react-inspector": "9.0.0" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0", - "react-router": "^7.0.2", - "storybook": "^10.0.0" + "tinyspy": "^4.0.3" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/vitest" } }, + "node_modules/storybook/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, "node_modules/storybook/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -25840,14 +24947,20 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -26048,9 +25161,9 @@ } }, "node_modules/strnum": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", - "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", "funding": [ { "type": "github", @@ -26124,9 +25237,9 @@ } }, "node_modules/stylus-lookup": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-6.1.2.tgz", - "integrity": "sha512-O+Q/SJ8s1X2aMLh4213fQ9X/bND9M3dhSsyTRe+O1OXPcewGLiYmAtKCrnP7FDvDBaXB2ZHPkCt3zi4cJXBlCQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-6.1.1.tgz", + "integrity": "sha512-0+xmFLaqWksv5/pMiZtONG6gP82YNGVWgKiQXvw8cdKVFEJ++X9dySGR0hG+A+78PBtbHPqiJzXi2ZKoWr/7Sg==", "dev": true, "license": "MIT", "dependencies": { @@ -26245,15 +25358,15 @@ } }, "node_modules/tailwindcss": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", - "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", "license": "MIT" }, "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", "license": "MIT", "engines": { "node": ">=6" @@ -26344,7 +25457,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -26355,12 +25467,11 @@ } }, "node_modules/terser": { - "version": "5.46.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", - "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", + "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "devOptional": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -26375,9 +25486,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "dev": true, "license": "MIT", "dependencies": { @@ -26408,6 +25519,23 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/terser-webpack-plugin/node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -26426,6 +25554,19 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -26441,6 +25582,13 @@ "node": ">= 10.13.0" } }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", @@ -26535,9 +25683,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", - "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, "license": "MIT", "engines": { @@ -26545,13 +25693,13 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.4" + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -26561,9 +25709,9 @@ } }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -26729,19 +25877,19 @@ } }, "node_modules/ts-jest": { - "version": "29.4.9", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", - "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.9", + "handlebars": "^4.7.8", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.4", + "semver": "^7.7.3", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -26758,7 +25906,7 @@ "babel-jest": "^29.0.0 || ^30.0.0", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <7" + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { @@ -26808,9 +25956,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", - "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -26847,7 +25995,6 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -26934,21 +26081,21 @@ "license": "0BSD" }, "node_modules/turbo": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.9.6.tgz", - "integrity": "sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.9.3.tgz", + "integrity": "sha512-J/VUvsGRykPb9R8Kh8dHVBOqioDexLk9BhLCU/ZybRR+HN9UR3cURdazFvNgMDt9zPP8TF6K73Z+tplfmi0PqQ==", "dev": true, "license": "MIT", "bin": { "turbo": "bin/turbo" }, "optionalDependencies": { - "@turbo/darwin-64": "2.9.6", - "@turbo/darwin-arm64": "2.9.6", - "@turbo/linux-64": "2.9.6", - "@turbo/linux-arm64": "2.9.6", - "@turbo/windows-64": "2.9.6", - "@turbo/windows-arm64": "2.9.6" + "@turbo/darwin-64": "2.9.3", + "@turbo/darwin-arm64": "2.9.3", + "@turbo/linux-64": "2.9.3", + "@turbo/linux-arm64": "2.9.3", + "@turbo/windows-64": "2.9.3", + "@turbo/windows-arm64": "2.9.3" } }, "node_modules/tw-animate-css": { @@ -27082,7 +26229,6 @@ "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.28.tgz", "integrity": "sha512-6GH7wXhtfq2D33ZuRXYwIsl/qM5685WZcODZb7noOOcRMteM9KF2x2ap3H0EBjnSV0VO4gNAfJT5Ukp0PkOlvg==", "license": "MIT", - "peer": true, "dependencies": { "@sqltools/formatter": "^1.2.5", "ansis": "^4.2.0", @@ -27289,7 +26435,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -27481,22 +26626,6 @@ "node": ">= 0.8" } }, - "node_modules/unplugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "acorn": "^8.15.0", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -27627,9 +26756,9 @@ } }, "node_modules/uuid": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", - "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -27662,9 +26791,9 @@ } }, "node_modules/validator": { - "version": "13.15.35", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", - "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -27747,7 +26876,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -27817,48 +26945,20 @@ } } }, - "node_modules/vite/node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/vitest": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", - "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", + "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.5", - "@vitest/mocker": "4.1.5", - "@vitest/pretty-format": "4.1.5", - "@vitest/runner": "4.1.5", - "@vitest/snapshot": "4.1.5", - "@vitest/spy": "4.1.5", - "@vitest/utils": "4.1.5", + "@vitest/expect": "4.1.2", + "@vitest/mocker": "4.1.2", + "@vitest/pretty-format": "4.1.2", + "@vitest/runner": "4.1.2", + "@vitest/snapshot": "4.1.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -27886,12 +26986,10 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.5", - "@vitest/browser-preview": "4.1.5", - "@vitest/browser-webdriverio": "4.1.5", - "@vitest/coverage-istanbul": "4.1.5", - "@vitest/coverage-v8": "4.1.5", - "@vitest/ui": "4.1.5", + "@vitest/browser-playwright": "4.1.2", + "@vitest/browser-preview": "4.1.2", + "@vitest/browser-webdriverio": "4.1.2", + "@vitest/ui": "4.1.2", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -27915,12 +27013,6 @@ "@vitest/browser-webdriverio": { "optional": true }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, "@vitest/ui": { "optional": true }, @@ -27936,16 +27028,16 @@ } }, "node_modules/vitest/node_modules/@vitest/expect": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", - "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", + "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.5", - "@vitest/utils": "4.1.5", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -27953,44 +27045,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vitest/node_modules/@vitest/pretty-format": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", - "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/spy": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", - "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/utils": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", - "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.5", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vitest/node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -28018,16 +27072,6 @@ "dev": true, "license": "MIT" }, - "node_modules/vitest/node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -28117,12 +27161,11 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.106.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", - "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "version": "5.106.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.0.tgz", + "integrity": "sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -28140,8 +27183,9 @@ "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", - "mime-db": "^1.54.0", + "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", @@ -28176,9 +27220,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", - "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "dev": true, "license": "MIT", "engines": { @@ -28192,6 +27236,23 @@ "dev": true, "license": "MIT" }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/webpack/node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -28210,6 +27271,49 @@ } } }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack/node_modules/schema-utils": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", @@ -28583,11 +27687,10 @@ } }, "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/packages/api-contracts/src/documents/documents.dto.ts b/packages/api-contracts/src/documents/documents.dto.ts index a2d40a1f..54241a69 100644 --- a/packages/api-contracts/src/documents/documents.dto.ts +++ b/packages/api-contracts/src/documents/documents.dto.ts @@ -2,6 +2,7 @@ import type { DocumentTagDto } from "../document-tags/document-tag.dto" import type { TimeType } from "../generic" export const DOCUMENT_EMBEDDING_STATUS_CHANGED_CHANNEL_DTO = "document_embedding_status_changed" +export const DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL_DTO = "document_crawl_progress_changed" export type DocumentSourceType = | "project" @@ -9,6 +10,7 @@ export type DocumentSourceType = | "extraction" | "evaluationExtractionDataset" | "evaluationExtractionRun" + | "webCrawl" export type DocumentEmbeddingStatus = "pending" | "queued" | "processing" | "completed" | "failed" export type DocumentEmbeddingStatusChangedEventPayload = { type: typeof DOCUMENT_EMBEDDING_STATUS_CHANGED_CHANNEL_DTO @@ -22,6 +24,17 @@ export type DocumentEmbeddingStatusChangedEventPayload = { export type DocumentEmbeddingStatusChangedEventDto = MessageEvent & DocumentEmbeddingStatusChangedEventPayload +export type DocumentCrawlProgressChangedEventPayload = { + type: typeof DOCUMENT_CRAWL_PROGRESS_CHANGED_CHANNEL_DTO + documentId: string + organizationId: string + projectId: string + pagesCrawled: number + updatedAt: TimeType +} +export type DocumentCrawlProgressChangedEventDto = MessageEvent & + DocumentCrawlProgressChangedEventPayload + export type PresignFileRequestItemDto = { fileName: string mimeType: MimeTypes @@ -46,16 +59,32 @@ export type DocumentDto = { deletedAt?: TimeType title: string content?: string + pages?: { url: string; markdown: string }[] fileName?: string language: "en" | "fr" mimeType?: MimeTypes size?: number storageRelativePath?: string + sourceType: DocumentSourceType + sourceUrl?: string | null embeddingStatus: DocumentEmbeddingStatus embeddingError: string | null tagIds: DocumentTagDto["id"][] } +export type CrawlUrlRequestDto = { + url: string + name?: string +} + +export type CrawlUrlResponseDto = { + message: string +} + +export type ReCrawlUrlResponseDto = { + message: string +} + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types export enum MimeTypes { aac = "audio/aac", diff --git a/packages/api-contracts/src/documents/documents.routes.ts b/packages/api-contracts/src/documents/documents.routes.ts index d20eb5a5..0ef1d6c5 100644 --- a/packages/api-contracts/src/documents/documents.routes.ts +++ b/packages/api-contracts/src/documents/documents.routes.ts @@ -2,10 +2,13 @@ import type { DocumentTagsUpdateFieldsDto } from "../document-tags/document-tag. import type { RequestPayload, ResponseData, SuccessResponseDTO } from "../generic" import { defineRoute } from "../helpers" import type { + CrawlUrlRequestDto, + CrawlUrlResponseDto, DocumentDto, DocumentUploadOptionalTagFields, PresignFileRequestItemDto, PresignFileResponseItemDto, + ReCrawlUrlResponseDto, } from "./documents.dto" export const DocumentsRoutes = { @@ -32,7 +35,7 @@ export const DocumentsRoutes = { }), getAll: defineRoute>({ method: "get", - path: "organizations/:organizationId/projects/:projectId/documents", + path: "organizations/:organizationId/projects/:projectId/documents/:sourceType", }), getTemporaryUrl: defineRoute>({ method: "get", @@ -53,9 +56,21 @@ export const DocumentsRoutes = { method: "post", path: "organizations/:organizationId/projects/:projectId/documents/:documentId/reprocess", }), + crawlUrl: defineRoute, RequestPayload>({ + method: "post", + path: "organizations/:organizationId/projects/:projectId/documents/crawl-url", + }), + reCrawlUrl: defineRoute>({ + method: "post", + path: "organizations/:organizationId/projects/:projectId/documents/:documentId/recrawl", + }), // Streaming responses are sent as text/event-stream (SSE) and do not follow ResponseData. streamEmbeddingStatus: defineRoute>({ method: "get", path: "organizations/:organizationId/projects/:projectId/documents/embedding-status/stream", }), + streamCrawlProgress: defineRoute>({ + method: "get", + path: "organizations/:organizationId/projects/:projectId/documents/crawl-progress/stream", + }), } diff --git a/packages/api-contracts/src/feature-flags/feature-flags.dto.ts b/packages/api-contracts/src/feature-flags/feature-flags.dto.ts index 50d5971a..5947a9da 100644 --- a/packages/api-contracts/src/feature-flags/feature-flags.dto.ts +++ b/packages/api-contracts/src/feature-flags/feature-flags.dto.ts @@ -16,6 +16,10 @@ export const FeatureFlags = [ key: "project-analytics", description: "View project-level analytics and usage charts in the studio.", }, + { + key: "web_sources", + description: "Crawl a website and index its pages as documents.", + }, ] as const export type FeatureFlagKey = (typeof FeatureFlags)[number]["key"] export type FeatureFlagsDto = FeatureFlagKey[]