diff --git a/backend/.development.env b/backend/.development.env index e14d1d52d..d6236ece3 100755 --- a/backend/.development.env +++ b/backend/.development.env @@ -57,11 +57,6 @@ JWT_SECRET=MySuperSecretJwtSecret TEMPORARY_JWT_SECRET=MySuperSecretTemporaryJwtSecret -# session secret for storing ai history -# you need it if you want to use openai service -# required if OPENAI_API_KEY is set -SESSION_SECRET=MySuperSecretSessionSecret - # for authorization with google GOOGLE_CLIENT_ID= diff --git a/backend/package.json b/backend/package.json index 9ec20a14b..4de5b354f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -48,7 +48,6 @@ "@sentry/minimal": "^6.19.7", "@sentry/node": "8.52.0", "@types/crypto-js": "^4.2.2", - "@types/express-session": "^1.18.2", "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.0.0", "@types/nodemailer": "^6.4.17", @@ -71,7 +70,6 @@ "eslint-plugin-security": "3.0.1", "express": "5.1.0", "express-rate-limit": "7.5.1", - "express-session": "^1.18.1", "fetch-blob": "^4.0.0", "helmet": "8.1.0", "ip-range-check": "0.2.0", diff --git a/backend/src/common/application/global-database-context.interface.ts b/backend/src/common/application/global-database-context.interface.ts index 4ce617d94..fc87a4ffc 100644 --- a/backend/src/common/application/global-database-context.interface.ts +++ b/backend/src/common/application/global-database-context.interface.ts @@ -1,52 +1,54 @@ import { Repository } from 'typeorm'; import { IAgentRepository } from '../../entities/agent/repository/agent.repository.interface.js'; +import { IAiResponsesToUserRepository } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user-repository.interface.js'; +import { AiResponsesToUserEntity } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.js'; +import { IAiUserFilesRepository } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files-repository.interface.js'; +import { AiUserFileEntity } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files.entity.js'; +import { IAiUserThreadsRepository } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads-repository.interface.js'; +import { AiUserThreadEntity } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads.entity.js'; +import { UserApiKeyEntity } from '../../entities/api-key/api-key.entity.js'; +import { IUserApiKeyRepository } from '../../entities/api-key/repository/user-api-key-repository.interface.js'; +import { CompanyFaviconEntity } from '../../entities/company-favicon/company-favicon.entity.js'; +import { CompanyInfoEntity } from '../../entities/company-info/company-info.entity.js'; +import { InvitationInCompanyEntity } from '../../entities/company-info/invitation-in-company/invitation-in-company.entity.js'; +import { IInvitationInCompanyRepository } from '../../entities/company-info/invitation-in-company/repository/invitation-repository.interface.js'; +import { ICompanyInfoRepository } from '../../entities/company-info/repository/company-info-repository.interface.js'; +import { CompanyLogoEntity } from '../../entities/company-logo/company-logo.entity.js'; +import { CompanyTabTitleEntity } from '../../entities/company-tab-title/company-tab-title.entity.js'; import { IConnectionPropertiesRepository } from '../../entities/connection-properties/repository/connection-properties.repository.interface.js'; +import { ConnectionEntity } from '../../entities/connection/connection.entity.js'; import { IConnectionRepository } from '../../entities/connection/repository/connection.repository.interface.js'; import { ICustomFieldsRepository } from '../../entities/custom-field/repository/custom-fields-repository.interface.js'; import { IEmailVerificationRepository } from '../../entities/email/repository/email-verification.repository.interface.js'; import { IGroupRepository } from '../../entities/group/repository/group.repository.interface.js'; import { ILogOutRepository } from '../../entities/log-out/repository/log-out-repository.interface.js'; import { IPermissionRepository } from '../../entities/permission/repository/permission.repository.interface.js'; +import { ActionEventsEntity } from '../../entities/table-actions/table-action-events-module/action-event.entity.js'; +import { IActionEventsRepository } from '../../entities/table-actions/table-action-events-module/repository/action-events-custom-repository.interface.js'; +import { ActionRulesEntity } from '../../entities/table-actions/table-action-rules-module/action-rules.entity.js'; +import { IActionRulesRepository } from '../../entities/table-actions/table-action-rules-module/repository/action-rules-custom-repository.interface.js'; import { ITableActionRepository } from '../../entities/table-actions/table-actions-module/repository/table-action-custom-repository.interface.js'; +import { TableActionEntity } from '../../entities/table-actions/table-actions-module/table-action.entity.js'; import { TableFieldInfoEntity } from '../../entities/table-field-info/table-field-info.entity.js'; +import { ITableFiltersCustomRepository } from '../../entities/table-filters/repository/table-filters-custom-repository.interface.js'; +import { TableFiltersEntity } from '../../entities/table-filters/table-filters.entity.js'; import { TableInfoEntity } from '../../entities/table-info/table-info.entity.js'; import { ITableLogsRepository } from '../../entities/table-logs/repository/table-logs-repository.interface.js'; import { ITableSettingsRepository } from '../../entities/table-settings/repository/table-settings.repository.interface.js'; +import { TableSettingsEntity } from '../../entities/table-settings/table-settings.entity.js'; import { IUserAccessRepository } from '../../entities/user-access/repository/user-access.repository.interface.js'; import { IUserActionRepository } from '../../entities/user-actions/repository/user-action.repository.interface.js'; import { IUserRepository } from '../../entities/user/repository/user.repository.interface.js'; import { IEmailChangeRepository } from '../../entities/user/user-email/repository/email-change.repository.interface.js'; +import { IUserGitHubIdentifierRepository } from '../../entities/user/user-github-identifier/repository/user-github-identifier-repository.interface.js'; import { IUserInvitationRepository } from '../../entities/user/user-invitation/repository/user-invitation-repository.interface.js'; import { IPasswordResetRepository } from '../../entities/user/user-password/repository/password-reset-repository.interface.js'; -import { ITableWidgetsRepository } from '../../entities/widget/repository/table-widgets-repository.interface.js'; -import { IDatabaseContext } from '../database-context.interface.js'; -import { IUserGitHubIdentifierRepository } from '../../entities/user/user-github-identifier/repository/user-github-identifier-repository.interface.js'; -import { CompanyInfoEntity } from '../../entities/company-info/company-info.entity.js'; -import { ICompanyInfoRepository } from '../../entities/company-info/repository/company-info-repository.interface.js'; -import { InvitationInCompanyEntity } from '../../entities/company-info/invitation-in-company/invitation-in-company.entity.js'; -import { IInvitationInCompanyRepository } from '../../entities/company-info/invitation-in-company/repository/invitation-repository.interface.js'; import { IUserSessionSettings } from '../../entities/user/user-session-settings/reposiotory/user-session-settings-repository.interface.js'; import { UserSessionSettingsEntity } from '../../entities/user/user-session-settings/user-session-settings.entity.js'; import { UserEntity } from '../../entities/user/user.entity.js'; -import { ConnectionEntity } from '../../entities/connection/connection.entity.js'; -import { ActionRulesEntity } from '../../entities/table-actions/table-action-rules-module/action-rules.entity.js'; -import { IActionRulesRepository } from '../../entities/table-actions/table-action-rules-module/repository/action-rules-custom-repository.interface.js'; -import { IActionEventsRepository } from '../../entities/table-actions/table-action-events-module/repository/action-events-custom-repository.interface.js'; -import { UserApiKeyEntity } from '../../entities/api-key/api-key.entity.js'; -import { IUserApiKeyRepository } from '../../entities/api-key/repository/user-api-key-repository.interface.js'; -import { ActionEventsEntity } from '../../entities/table-actions/table-action-events-module/action-event.entity.js'; -import { TableActionEntity } from '../../entities/table-actions/table-actions-module/table-action.entity.js'; -import { IAiUserThreadsRepository } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads-repository.interface.js'; -import { AiUserThreadEntity } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads.entity.js'; -import { IAiUserFilesRepository } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files-repository.interface.js'; -import { AiUserFileEntity } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files.entity.js'; -import { CompanyLogoEntity } from '../../entities/company-logo/company-logo.entity.js'; -import { CompanyFaviconEntity } from '../../entities/company-favicon/company-favicon.entity.js'; -import { CompanyTabTitleEntity } from '../../entities/company-tab-title/company-tab-title.entity.js'; -import { TableFiltersEntity } from '../../entities/table-filters/table-filters.entity.js'; -import { ITableFiltersCustomRepository } from '../../entities/table-filters/repository/table-filters-custom-repository.interface.js'; -import { TableSettingsEntity } from '../../entities/table-settings/table-settings.entity.js'; +import { ITableWidgetsRepository } from '../../entities/widget/repository/table-widgets-repository.interface.js'; import { TableWidgetEntity } from '../../entities/widget/table-widget.entity.js'; +import { IDatabaseContext } from '../database-context.interface.js'; export interface IGlobalDatabaseContext extends IDatabaseContext { userRepository: Repository & IUserRepository; @@ -82,4 +84,5 @@ export interface IGlobalDatabaseContext extends IDatabaseContext { companyFaviconRepository: Repository; companyTabTitleRepository: Repository; tableFiltersRepository: Repository & ITableFiltersCustomRepository; + aiResponsesToUserRepository: Repository & IAiResponsesToUserRepository; } diff --git a/backend/src/common/application/global-database-context.ts b/backend/src/common/application/global-database-context.ts index 387138587..82893b1d6 100644 --- a/backend/src/common/application/global-database-context.ts +++ b/backend/src/common/application/global-database-context.ts @@ -90,6 +90,9 @@ import { CompanyTabTitleEntity } from '../../entities/company-tab-title/company- import { TableFiltersEntity } from '../../entities/table-filters/table-filters.entity.js'; import { ITableFiltersCustomRepository } from '../../entities/table-filters/repository/table-filters-custom-repository.interface.js'; import { tableFiltersCustomRepositoryExtension } from '../../entities/table-filters/repository/table-filters-custom-repository-extension.js'; +import { IAiResponsesToUserRepository } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user-repository.interface.js'; +import { AiResponsesToUserEntity } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.js'; +import { aiResponsesToUserRepositoryExtension } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-reponses-to-user-repository.extension.js'; @Injectable({ scope: Scope.REQUEST }) export class GlobalDatabaseContext implements IGlobalDatabaseContext { @@ -128,6 +131,7 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext { private _companyFaviconRepository: Repository; private _companyTabTitleRepository: Repository; private _tableFiltersRepository: Repository & ITableFiltersCustomRepository; + private _aiResponsesToUserRepository: Repository & IAiResponsesToUserRepository; public constructor( @Inject(BaseType.DATA_SOURCE) @@ -216,6 +220,9 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext { this._tableFiltersRepository = this.appDataSource .getRepository(TableFiltersEntity) .extend(tableFiltersCustomRepositoryExtension); + this._aiResponsesToUserRepository = this.appDataSource + .getRepository(AiResponsesToUserEntity) + .extend(aiResponsesToUserRepositoryExtension); } public get userRepository(): Repository & IUserRepository { @@ -350,6 +357,10 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext { return this._tableFiltersRepository; } + public get aiResponsesToUserRepository(): Repository & IAiResponsesToUserRepository { + return this._aiResponsesToUserRepository; + } + public startTransaction(): Promise { this._queryRunner = this.appDataSource.createQueryRunner(); this._queryRunner.startTransaction(); diff --git a/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-reponses-to-user-repository.extension.ts b/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-reponses-to-user-repository.extension.ts new file mode 100644 index 000000000..50143ee3f --- /dev/null +++ b/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-reponses-to-user-repository.extension.ts @@ -0,0 +1,19 @@ +import { IAiResponsesToUserRepository } from './ai-responses-to-user-repository.interface.js'; +import { AiResponsesToUserEntity } from './ai-responses-to-user.entity.js'; + +export const aiResponsesToUserRepositoryExtension: IAiResponsesToUserRepository = { + async findResponsesByUserId(userId: string): Promise> { + return await this.createQueryBuilder('ai_responses_to_user') + .leftJoin('ai_responses_to_user.user', 'user') + .where('user.id = :userId', { userId }) + .getMany(); + }, + + async findResponseByIdAndUserId(responseId: string, userId: string): Promise { + return await this.createQueryBuilder('ai_responses_to_user') + .leftJoin('ai_responses_to_user.user', 'user') + .where('user.id = :userId', { userId }) + .andWhere('ai_responses_to_user.id = :responseId', { responseId }) + .getOne(); + }, +}; diff --git a/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user-repository.interface.ts b/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user-repository.interface.ts new file mode 100644 index 000000000..4e16dcc8e --- /dev/null +++ b/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user-repository.interface.ts @@ -0,0 +1,7 @@ +import { AiResponsesToUserEntity } from './ai-responses-to-user.entity.js'; + +export interface IAiResponsesToUserRepository { + findResponsesByUserId(userId: string): Promise>; + + findResponseByIdAndUserId(responseId: string, userId: string): Promise; +} diff --git a/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.ts b/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.ts new file mode 100644 index 000000000..f9531d092 --- /dev/null +++ b/backend/src/entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.ts @@ -0,0 +1,29 @@ +import { BeforeUpdate, Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn, Relation } from 'typeorm'; +import { UserEntity } from '../../../user/user.entity.js'; + +@Entity('ai_responses_to_user') +export class AiResponsesToUserEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ type: 'varchar', length: 128, nullable: true }) + ai_response_id: string; + + @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' }) + createdAt: Date; + + @Column({ type: 'timestamp', default: null, nullable: true }) + updatedAt: Date; + + @Column() + user_id: string; + + @ManyToOne((_) => UserEntity, (user) => user.ai_responses, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'user_id' }) + user: Relation; + + @BeforeUpdate() + updateTimestamp() { + this.updatedAt = new Date(); + } +} diff --git a/backend/src/entities/ai/application/data-structures/request-info-from-table.ds.ts b/backend/src/entities/ai/application/data-structures/request-info-from-table.ds.ts index fa3642205..24ff6c10f 100644 --- a/backend/src/entities/ai/application/data-structures/request-info-from-table.ds.ts +++ b/backend/src/entities/ai/application/data-structures/request-info-from-table.ds.ts @@ -9,4 +9,5 @@ export class RequestInfoFromTableDS { export class RequestInfoFromTableDSV2 extends RequestInfoFromTableDS { response: Response; + ai_thread_id?: string | null; } diff --git a/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v4.use.case.ts b/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v4.use.case.ts index 11534dd4b..7431e0818 100644 --- a/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v4.use.case.ts +++ b/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v4.use.case.ts @@ -19,13 +19,7 @@ import { Response } from 'express'; import { ConnectionEntity } from '../../connection/connection.entity.js'; import { IDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/interfaces/data-access-object.interface.js'; import { IDataAccessObjectAgent } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/interfaces/data-access-object-agent.interface.js'; - -declare module 'express-session' { - interface Session { - lastResponseId?: string | null; - } -} - +import { AiResponsesToUserEntity } from '../ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.js'; @Injectable({ scope: Scope.REQUEST }) export class RequestInfoFromTableWithAIUseCaseV4 extends AbstractUseCase @@ -41,8 +35,7 @@ export class RequestInfoFromTableWithAIUseCaseV4 } public async implementation(inputData: RequestInfoFromTableDSV2): Promise { - const { connectionId, tableName, user_message, master_password, user_id, response } = inputData; - this.initializeSession(response); + const { connectionId, tableName, user_message, master_password, user_id, response, ai_thread_id } = inputData; this.setupResponseHeaders(response); const { foundConnection, dataAccessObject, databaseType, isMongoDb, userEmail } = await this.setupConnection( @@ -55,31 +48,63 @@ export class RequestInfoFromTableWithAIUseCaseV4 const system_prompt = this.createSystemPrompt(tableName, databaseType, foundConnection); + let previous_response_id: string | null = null; + let foundUserAiResponse: AiResponsesToUserEntity | null = null; + let threadIdForHeader: string | null = null; + + if (ai_thread_id) { + foundUserAiResponse = await this._dbContext.aiResponsesToUserRepository.findResponseByIdAndUserId( + ai_thread_id, + user_id, + ); + if (foundUserAiResponse) { + previous_response_id = foundUserAiResponse.ai_response_id; + threadIdForHeader = foundUserAiResponse.id; + } + } else { + const newAiResponse = new AiResponsesToUserEntity(); + newAiResponse.ai_response_id = null; + newAiResponse.user_id = user_id; + foundUserAiResponse = await this._dbContext.aiResponsesToUserRepository.save(newAiResponse); + previous_response_id = null; + threadIdForHeader = foundUserAiResponse.id; + } + + if (threadIdForHeader) { + response.setHeader('X-OpenAI-Thread-ID', threadIdForHeader); + } const initialOpenAIStream = await this.createInitialOpenAIStream( user_message, system_prompt, user_id, tools, - response, + previous_response_id, ); const currentDepth = 0; - await this.handleStreamRecursively( - currentDepth, - tools, - user_id, - initialOpenAIStream, - response, - dataAccessObject, - tableName, - userEmail, - foundConnection, - ); - response.end(); try { + const lastResponseId = await this.handleStreamRecursively( + currentDepth, + tools, + user_id, + initialOpenAIStream, + response, + dataAccessObject, + tableName, + userEmail, + foundConnection, + ); + + if (foundUserAiResponse && lastResponseId) { + foundUserAiResponse.ai_response_id = lastResponseId; + await this._dbContext.aiResponsesToUserRepository.save(foundUserAiResponse); + } + response.end(); } catch (error) { await slackPostMessage(error?.message); Sentry.captureException(error); - response.status(500).send({ error: 'An error occurred while processing your request.' }); + if (!response.headersSent) { + response.status(500).send({ error: 'An error occurred while processing your request.' }); + } return; } } @@ -94,12 +119,12 @@ export class RequestInfoFromTableWithAIUseCaseV4 inputTableName: string, userEmail: string, foundConnection: ConnectionEntity, - ) { + ): Promise { if (currentDepth >= this.maxDepth) { response.write( 'Your question is too complex to process at this time. Please try simplifying it or breaking it down into smaller parts.', ); - return; + return null; } let current_response_id: string = null; for await (const chunk of stream) { @@ -132,7 +157,7 @@ export class RequestInfoFromTableWithAIUseCaseV4 current_tool_call_id, current_tools_output, ); - await this.handleStreamRecursively( + const nestedResponseId = await this.handleStreamRecursively( ++currentDepth, tools, user_id, @@ -143,6 +168,9 @@ export class RequestInfoFromTableWithAIUseCaseV4 userEmail, foundConnection, ); + if (nestedResponseId) { + current_response_id = nestedResponseId; + } } if (chunk.item.name === 'executeRawSql') { @@ -174,7 +202,7 @@ export class RequestInfoFromTableWithAIUseCaseV4 current_tool_call_id, current_tools_output, ); - await this.handleStreamRecursively( + const nestedResponseId = await this.handleStreamRecursively( ++currentDepth, tools, user_id, @@ -185,6 +213,9 @@ export class RequestInfoFromTableWithAIUseCaseV4 userEmail, foundConnection, ); + if (nestedResponseId) { + current_response_id = nestedResponseId; + } } if (chunk.item.name === 'executeAggregationPipeline') { const { pipeline } = JSON.parse(this.sanitizeJsonString(chunk.item.arguments)); @@ -211,7 +242,7 @@ export class RequestInfoFromTableWithAIUseCaseV4 current_tool_call_id, current_tools_output, ); - await this.handleStreamRecursively( + const nestedResponseId = await this.handleStreamRecursively( ++currentDepth, tools, user_id, @@ -222,6 +253,9 @@ export class RequestInfoFromTableWithAIUseCaseV4 userEmail, foundConnection, ); + if (nestedResponseId) { + current_response_id = nestedResponseId; + } } } if (chunk.type === 'response.output_text.delta') { @@ -230,7 +264,9 @@ export class RequestInfoFromTableWithAIUseCaseV4 } response.write(chunk.delta); } - response.req.session.lastResponseId = current_response_id; + } + if (current_response_id) { + return current_response_id; } } @@ -385,16 +421,7 @@ export class RequestInfoFromTableWithAIUseCaseV4 response.setHeader('Content-Type', 'text/event-stream'); response.setHeader('Cache-Control', 'no-cache'); response.setHeader('Connection', 'keep-alive'); - } - - private initializeSession(response: any): void { - if (!response.req.session) { - (response.req as any).session = { - lastResponseId: null, - }; - } else if (response.req.session.lastResponseId === undefined) { - response.req.session.lastResponseId = null; - } + response.setHeader('Access-Control-Expose-Headers', 'X-OpenAI-Thread-ID'); } private async setupConnection(connectionId: string, master_password: string, user_id: string) { @@ -481,7 +508,7 @@ Remember that all responses should be clear and user-friendly, explaining techni system_prompt: string, user_id: string, tools: any[], - response: any, + previous_response_id: string | null = null, ) { const openApiKey = getRequiredEnvVariable('OPENAI_API_KEY'); const openai = new OpenAI({ apiKey: openApiKey }); @@ -493,7 +520,7 @@ Remember that all responses should be clear and user-friendly, explaining techni user: user_id, stream: true, tools: tools, - previous_response_id: response.req.session.lastResponseId || undefined, + previous_response_id: previous_response_id || undefined, }); } diff --git a/backend/src/entities/ai/user-ai-requests-v2.controller.ts b/backend/src/entities/ai/user-ai-requests-v2.controller.ts index 83813e1ed..b09a606eb 100644 --- a/backend/src/entities/ai/user-ai-requests-v2.controller.ts +++ b/backend/src/entities/ai/user-ai-requests-v2.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Inject, Injectable, Post, Res, UseGuards, UseInterceptors } from '@nestjs/common'; +import { Body, Controller, Inject, Injectable, Post, Query, Res, UseGuards, UseInterceptors } from '@nestjs/common'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { Response } from 'express'; import { UseCaseType } from '../../common/data-injection.tokens.js'; @@ -8,6 +8,7 @@ import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { UserId } from '../../decorators/user-id.decorator.js'; import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { TableReadGuard } from '../../guards/table-read.guard.js'; +import { ValidationHelper } from '../../helpers/validators/validation-helper.js'; import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { IRequestInfoFromTableV2 } from './ai-use-cases.interface.js'; import { RequestInfoFromTableDSV2 } from './application/data-structures/request-info-from-table.ds.js'; @@ -32,15 +33,23 @@ export class UserAIRequestsControllerV2 { @UseGuards(TableReadGuard) @ApiBody({ type: RequestInfoFromTableBodyDTO }) @ApiQuery({ name: 'tableName', required: true, type: String }) + @ApiQuery({ name: 'threadId', required: false, type: String }) @Post('/ai/v2/request/:connectionId') public async requestInfoFromTableWithAI( @SlugUuid('connectionId') connectionId: string, + @Query('threadId') threadId: string, @QueryTableName() tableName: string, @MasterPassword() masterPassword: string, @UserId() userId: string, @Body() requestData: RequestInfoFromTableBodyDTO, @Res({ passthrough: true }) response: Response, ): Promise { + if (threadId) { + if (!ValidationHelper.isValidUUID(threadId)) { + response.status(400).send({ error: 'Invalid threadId format. It should be a valid UUID.' }); + return; + } + } const inputData: RequestInfoFromTableDSV2 = { connectionId, tableName, @@ -48,6 +57,7 @@ export class UserAIRequestsControllerV2 { master_password: masterPassword, user_id: userId, response, + ai_thread_id: threadId || null, }; return await this.requestInfoFromTableWithAIUseCase.execute(inputData, InTransactionEnum.OFF); } diff --git a/backend/src/entities/user/user.entity.ts b/backend/src/entities/user/user.entity.ts index bb44d1e1b..d19dc427e 100644 --- a/backend/src/entities/user/user.entity.ts +++ b/backend/src/entities/user/user.entity.ts @@ -26,6 +26,7 @@ import { UserRoleEnum } from './enums/user-role.enum.js'; import { ExternalRegistrationProviderEnum } from './enums/external-registration-provider.enum.js'; import { UserApiKeyEntity } from '../api-key/api-key.entity.js'; import { AiUserThreadEntity } from '../ai/ai-data-entities/ai-user-threads/ai-user-threads.entity.js'; +import { AiResponsesToUserEntity } from '../ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.js'; @Entity('user') export class UserEntity { @@ -119,6 +120,9 @@ export class UserEntity { @OneToMany((_) => AiUserThreadEntity, (thread) => thread.user) ai_threads: Relation[]; + @OneToMany((_) => AiResponsesToUserEntity, (response) => response.user) + ai_responses: Relation[]; + @Column({ default: false }) isActive: boolean; diff --git a/backend/src/helpers/validators/required-environment-variables.validator.ts b/backend/src/helpers/validators/required-environment-variables.validator.ts index fda3ffe7a..ad4672721 100644 --- a/backend/src/helpers/validators/required-environment-variables.validator.ts +++ b/backend/src/helpers/validators/required-environment-variables.validator.ts @@ -3,10 +3,6 @@ import { Messages } from '../../exceptions/text/messages.js'; export function requiredEnvironmentVariablesValidator(): void { const requiredParameterNames: Array = ['DATABASE_URL', 'PRIVATE_KEY', 'JWT_SECRET']; - if (process.env.OPENAI_API_KEY && process.env.OPENAI_API_KEY.length) { - requiredParameterNames.push('SESSION_SECRET'); - } - const requiredParameters: Array<{ [k: string]: string | null }> = requiredParameterNames.map((paramName) => { const paramValue = getEnvironmentVariable(paramName); return { diff --git a/backend/src/main.ts b/backend/src/main.ts index 57d32a966..ab3d60de5 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -7,7 +7,6 @@ import bodyParser from 'body-parser'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import rateLimit from 'express-rate-limit'; -import session from 'express-session'; import helmet from 'helmet'; import { ApplicationModule } from './app.module.js'; import { WinstonLogger } from './entities/logging/winston-logger.js'; @@ -42,26 +41,6 @@ async function bootstrap() { app.use(cookieParser()); - const cookieDomain = process.env.ROCKETADMIN_COOKIE_DOMAIN || undefined; - const sessionSecret = process.env.SESSION_SECRET || undefined; - if (sessionSecret) { - app.use( - session({ - secret: sessionSecret, - resave: false, - saveUninitialized: false, - cookie: { - secure: true, - domain: cookieDomain, - maxAge: 2 * 60 * 60 * 1000, - httpOnly: true, - path: '/', - }, - name: 'rocketadmin.sid', - }), - ); - } - app.enableCors({ origin: [ 'https://app.autoadmin.org', diff --git a/backend/src/migrations/1755522332243-AddAiResponsesToUserEntity.ts b/backend/src/migrations/1755522332243-AddAiResponsesToUserEntity.ts new file mode 100644 index 000000000..750bc7c51 --- /dev/null +++ b/backend/src/migrations/1755522332243-AddAiResponsesToUserEntity.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddAiResponsesToUserEntity1755522332243 implements MigrationInterface { + name = 'AddAiResponsesToUserEntity1755522332243'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "ai_responses_to_user" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "ai_response_id" character varying(128), "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP, "user_id" uuid NOT NULL, CONSTRAINT "PK_15fbf891f35af2e741eb7a6a4c1" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `ALTER TABLE "ai_responses_to_user" ADD CONSTRAINT "FK_ccf6477f9644155217bb7698606" FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "ai_responses_to_user" DROP CONSTRAINT "FK_ccf6477f9644155217bb7698606"`); + await queryRunner.query(`DROP TABLE "ai_responses_to_user"`); + } +} diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts index 1cba54805..77693a9c5 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts @@ -328,7 +328,7 @@ export class DataAccessObjectOracle extends BasicDataAccessObject implements IDa datesColumnsNames: Array, ) { const offset = (page - 1) * perPage; - const fastCount = await this.getFastRowsCount(knex, tableName, tableSchema); + const { rowsCount: fastCount } = await this.getRowsCount(knex, tableName, tableSchema); const applySearchFields = (builder: Knex.QueryBuilder) => { if (searchedFieldValue && searchedFields.length > 0) { for (const field of searchedFields) { @@ -419,7 +419,7 @@ export class DataAccessObjectOracle extends BasicDataAccessObject implements IDa public async getRowsCount(knex: Knex, tableName: string, tableSchema: string) { const fastCount = await this.getFastRowsCount(knex, tableName, tableSchema); - if (fastCount >= DAO_CONSTANTS.LARGE_DATASET_ROW_LIMIT) { + if (fastCount && fastCount >= DAO_CONSTANTS.LARGE_DATASET_ROW_LIMIT) { return { rowsCount: fastCount, large_dataset: true }; } @@ -427,11 +427,18 @@ export class DataAccessObjectOracle extends BasicDataAccessObject implements IDa return { rowsCount: rowsCount, large_dataset: false }; } - public async getFastRowsCount(knex: Knex, tableName: string, tableSchema: string) { + public async getFastRowsCount( + knex: Knex, + tableName: string, + tableSchema: string, + ): Promise { const fastCountQueryResult = await knex('ALL_TABLES') .select('NUM_ROWS') .where('TABLE_NAME', '=', tableName) .andWhere('OWNER', '=', tableSchema); + if (!fastCountQueryResult[0]) { + return null; + } const fastCount = fastCountQueryResult[0]['NUM_ROWS']; return fastCount; } diff --git a/yarn.lock b/yarn.lock index e252dccbe..622254c64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -870,17 +870,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.22.5, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" - dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.27.1": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.27.1": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -891,13 +881,6 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/compat-data@npm:7.22.5" - checksum: eb1a47ebf79ae268b4a16903e977be52629339806e248455eb9973897c503a04b701f36a9de64e19750d6e081d0561e77a514c8dc470babbeba59ae94298ed18 - languageName: node - linkType: hard - "@babel/compat-data@npm:^7.27.2": version: 7.27.7 resolution: "@babel/compat-data@npm:7.27.7" @@ -905,29 +888,6 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.12.3": - version: 7.22.5 - resolution: "@babel/core@npm:7.22.5" - dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.5 - "@babel/helper-module-transforms": ^7.22.5 - "@babel/helpers": ^7.22.5 - "@babel/parser": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - convert-source-map: ^1.7.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.2 - semver: ^6.3.0 - checksum: 173ae426958c90c7bbd7de622c6f13fcab8aef0fac3f138e2d47bc466d1cd1f86f71ca82ae0acb9032fd8794abed8efb56fea55c031396337eaec0d673b69d56 - languageName: node - linkType: hard - "@babel/core@npm:^7.23.9, @babel/core@npm:^7.27.4": version: 7.27.7 resolution: "@babel/core@npm:7.27.7" @@ -951,18 +911,6 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.22.5, @babel/generator@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/generator@npm:7.23.6" - dependencies: - "@babel/types": ^7.23.6 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: 1a1a1c4eac210f174cd108d479464d053930a812798e09fee069377de39a893422df5b5b146199ead7239ae6d3a04697b45fc9ac6e38e0f6b76374390f91fc6c - languageName: node - linkType: hard - "@babel/generator@npm:^7.27.5": version: 7.27.5 resolution: "@babel/generator@npm:7.27.5" @@ -976,21 +924,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-compilation-targets@npm:7.22.5" - dependencies: - "@babel/compat-data": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 - browserslist: ^4.21.3 - lru-cache: ^5.1.1 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: a479460615acffa0f4fd0a29b740eafb53a93694265207d23a6038ccd18d183a382cacca515e77b7c9b042c3ba80b0aca0da5f1f62215140e81660d2cf721b68 - languageName: node - linkType: hard - "@babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" @@ -1004,41 +937,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" - dependencies: - "@babel/template": ^7.22.15 - "@babel/types": ^7.23.0 - checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" - dependencies: - "@babel/types": ^7.22.5 - checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-imports@npm:7.22.5" - dependencies: - "@babel/types": ^7.22.5 - checksum: 9ac2b0404fa38b80bdf2653fbeaf8e8a43ccb41bd505f9741d820ed95d3c4e037c62a1bcdcb6c9527d7798d2e595924c4d025daed73283badc180ada2c9c49ad - languageName: node - linkType: hard - "@babel/helper-module-imports@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-module-imports@npm:7.27.1" @@ -1049,22 +947,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-transforms@npm:7.22.5" - dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 8985dc0d971fd17c467e8b84fe0f50f3dd8610e33b6c86e5b3ca8e8859f9448bcc5c84e08a2a14285ef388351c0484797081c8f05a03770bf44fc27bf4900e68 - languageName: node - linkType: hard - "@babel/helper-module-transforms@npm:^7.27.3": version: 7.27.3 resolution: "@babel/helper-module-transforms@npm:7.27.3" @@ -1078,45 +960,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.27.1": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 5d715055301badab62bdb2336075a77f8dc8bd290cad2bc1b37ea3bf1b3efc40594d308082229f239deb4d6b5b80b0a73bce000e595ea74416e0339c11037047 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" - dependencies: - "@babel/types": ^7.22.5 - checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.22.5, @babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" - dependencies: - "@babel/types": ^7.22.5 - checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 - languageName: node - linkType: hard - "@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -1124,13 +974,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc - languageName: node - linkType: hard - "@babel/helper-validator-identifier@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-identifier@npm:7.27.1" @@ -1138,13 +981,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-option@npm:7.22.5" - checksum: bbeca8a85ee86990215c0424997438b388b8d642d69b9f86c375a174d3cdeb270efafd1ff128bc7a1d370923d13b6e45829ba8581c027620e83e3a80c5c414b3 - languageName: node - linkType: hard - "@babel/helper-validator-option@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-option@npm:7.27.1" @@ -1152,7 +988,7 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.22.5, @babel/helpers@npm:^7.27.6": +"@babel/helpers@npm:^7.27.6": version: 7.28.2 resolution: "@babel/helpers@npm:7.28.2" dependencies: @@ -1162,27 +998,7 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" - dependencies: - "@babel/helper-validator-identifier": ^7.22.20 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/parser@npm:7.23.6" - bin: - parser: ./bin/babel-parser.js - checksum: 140801c43731a6c41fd193f5c02bc71fd647a0360ca616b23d2db8be4b9739b9f951a03fc7c2db4f9b9214f4b27c1074db0f18bc3fa653783082d5af7c8860d5 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.23.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.5, @babel/parser@npm:^7.27.7": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.5, @babel/parser@npm:^7.27.7": version: 7.27.7 resolution: "@babel/parser@npm:7.27.7" dependencies: @@ -1380,17 +1196,6 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" - dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/parser": ^7.22.15 - "@babel/types": ^7.22.15 - checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd - languageName: node - linkType: hard - "@babel/template@npm:^7.27.2": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" @@ -1402,24 +1207,6 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.22.5": - version: 7.23.7 - resolution: "@babel/traverse@npm:7.23.7" - dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.6 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.6 - "@babel/types": ^7.23.6 - debug: ^4.3.1 - globals: ^11.1.0 - checksum: d4a7afb922361f710efc97b1e25ec343fab8b2a4ddc81ca84f9a153f22d4482112cba8f263774be8d297918b6c4767c7a98988ab4e53ac73686c986711dd002e - languageName: node - linkType: hard - "@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.27.7": version: 7.27.7 resolution: "@babel/traverse@npm:7.27.7" @@ -1435,28 +1222,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.8.3": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" - dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: 68187dbec0d637f79bc96263ac95ec8b06d424396678e7e225492be866414ce28ebc918a75354d4c28659be6efe30020b4f0f6df81cc418a2d30645b690a8de0 - languageName: node - linkType: hard - -"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.7": - version: 7.27.7 - resolution: "@babel/types@npm:7.27.7" - dependencies: - "@babel/helper-string-parser": ^7.27.1 - "@babel/helper-validator-identifier": ^7.27.1 - checksum: 376ed07a4be0ba7aad3a31ef96b38b6d77bd8739fd94ca9128004e24152b10610e309d0fd5875c77a6f7d7eef727d4bf2a9c8e6bbcce21d88600ac346e496ec7 - languageName: node - linkType: hard - -"@babel/types@npm:^7.28.2": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.7, @babel/types@npm:^7.28.2": version: 7.28.2 resolution: "@babel/types@npm:7.28.2" dependencies: @@ -2274,18 +2040,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.12 resolution: "@jridgewell/gen-mapping@npm:0.3.12" dependencies: @@ -2302,13 +2057,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": version: 0.3.3 resolution: "@jridgewell/source-map@npm:0.3.3" @@ -2336,17 +2084,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.29 resolution: "@jridgewell/trace-mapping@npm:0.3.29" dependencies: @@ -4234,17 +3972,7 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" - dependencies: - "@types/connect": "*" - "@types/node": "*" - checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 - languageName: node - linkType: hard - -"@types/body-parser@npm:^1.19.6": +"@types/body-parser@npm:*, @types/body-parser@npm:^1.19.6": version: 1.19.6 resolution: "@types/body-parser@npm:1.19.6" dependencies: @@ -4348,27 +4076,7 @@ __metadata: languageName: node linkType: hard -"@types/express-session@npm:^1.18.2": - version: 1.18.2 - resolution: "@types/express-session@npm:1.18.2" - dependencies: - "@types/express": "*" - checksum: 317b749c2179f8d6b5b961e9da3deb8c730c06586cfbf92391c9f74c7981825bfa1b37942e7fe85e51a85c678809b614b2405c722c3474d4afd98686ee04d0ad - languageName: node - linkType: hard - -"@types/express@npm:*": - version: 5.0.2 - resolution: "@types/express@npm:5.0.2" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^5.0.0 - "@types/serve-static": "*" - checksum: c6f73c75c2b62e293e5fadcfd7de61716e3d0c0eaecda082b1921c9c8e56ddc37c530c5d4d68404794b38c7e8f5b893719ffc04c6fba2efa2fb13223bfb0346b - languageName: node - linkType: hard - -"@types/express@npm:^5.0.3": +"@types/express@npm:*, @types/express@npm:^5.0.3": version: 5.0.3 resolution: "@types/express@npm:5.0.3" dependencies: @@ -4386,14 +4094,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 - languageName: node - linkType: hard - -"@types/istanbul-lib-coverage@npm:^2.0.6": +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.6": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 @@ -4514,12 +4215,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=18": - version: 22.15.19 - resolution: "@types/node@npm:22.15.19" +"@types/node@npm:*, @types/node@npm:>=18, @types/node@npm:^24.0.10": + version: 24.0.10 + resolution: "@types/node@npm:24.0.10" dependencies: - undici-types: ~6.21.0 - checksum: 5aa45bf93c62bba1193bf07a56dddd84b74f89a554a08e1bd7772610f529d8dc6f828d464bc28c10001bd0092b6b3d11736544b52e154f25f5ca0ed93f04c32b + undici-types: ~7.8.0 + checksum: 04e4d11a711a683d6ed71f8db86b35035771ee9c1f110cb904ca67454d3478f19c71f1f0ccd0ba5350e5ce63bea70d08c569f798f6f5a5d2a1d05c038f1f729f languageName: node linkType: hard @@ -4541,15 +4242,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^24.0.10": - version: 24.0.10 - resolution: "@types/node@npm:24.0.10" - dependencies: - undici-types: ~7.8.0 - checksum: 04e4d11a711a683d6ed71f8db86b35035771ee9c1f110cb904ca67454d3478f19c71f1f0ccd0ba5350e5ce63bea70d08c569f798f6f5a5d2a1d05c038f1f729f - languageName: node - linkType: hard - "@types/nodemailer@npm:^6.4.17": version: 6.4.17 resolution: "@types/nodemailer@npm:6.4.17" @@ -4594,14 +4286,14 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:*": - version: 8.15.2 - resolution: "@types/pg@npm:8.15.2" +"@types/pg@npm:*, @types/pg@npm:^8.15.4": + version: 8.15.4 + resolution: "@types/pg@npm:8.15.4" dependencies: "@types/node": "*" pg-protocol: "*" - pg-types: ^4.0.1 - checksum: 008699150750fe4d50db376cf6a059ce14dd3046bd4be04b5d973418291301e385a5f3b3f4028683c5baadf47fc794544dd0f23179c235957c202a4f0f8460e4 + pg-types: ^2.2.0 + checksum: 3ab8dba491156cbce6826016475a1bc06709546a08602f5c7a2d5a0bb5068187e85207b807e169c0ababfe3a9e806694dab375e6d72588333300a78c8ac30e1f languageName: node linkType: hard @@ -4616,17 +4308,6 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:^8.15.4": - version: 8.15.4 - resolution: "@types/pg@npm:8.15.4" - dependencies: - "@types/node": "*" - pg-protocol: "*" - pg-types: ^2.2.0 - checksum: 3ab8dba491156cbce6826016475a1bc06709546a08602f5c7a2d5a0bb5068187e85207b807e169c0ababfe3a9e806694dab375e6d72588333300a78c8ac30e1f - languageName: node - linkType: hard - "@types/qrcode@npm:^1.5.5": version: 1.5.5 resolution: "@types/qrcode@npm:1.5.5" @@ -4759,14 +4440,7 @@ __metadata: languageName: node linkType: hard -"@types/validator@npm:^13.11.8": - version: 13.15.0 - resolution: "@types/validator@npm:13.15.0" - checksum: c9f033dd8c6a46d55674cbdb293f48aab9e2b12eba935f8373c3a51eb3df47ce4d2991fea92aaaed67fe1158ee769d8f1318d237d3f6bd9b33dfb035c9ddec46 - languageName: node - linkType: hard - -"@types/validator@npm:^13.15.2": +"@types/validator@npm:^13.11.8, @types/validator@npm:^13.15.2": version: 13.15.2 resolution: "@types/validator@npm:13.15.2" checksum: b4270a6887dcae7125ce06586ef92606479b20ddf2a25d5abef22d6c9777f983dff1beef0085da71e03b462db67e8089a20a5f0cb0371630db365ef3abbbb5a1 @@ -5502,15 +5176,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -5831,7 +5496,6 @@ __metadata: "@types/cron": ^2.4.3 "@types/crypto-js": ^4.2.2 "@types/express": ^5.0.3 - "@types/express-session": ^1.18.2 "@types/ibm_db": ^3.2.0 "@types/json2csv": ^5.0.7 "@types/jsonwebtoken": ^9.0.10 @@ -5867,7 +5531,6 @@ __metadata: eslint-plugin-security: 3.0.1 express: 5.1.0 express-rate-limit: 7.5.1 - express-session: ^1.18.1 fetch-blob: ^4.0.0 helmet: 8.1.0 ibm_db: ^3.3.0 @@ -6228,7 +5891,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.3, browserslist@npm:^4.24.0": +"browserslist@npm:^4.24.0": version: 4.24.2 resolution: "browserslist@npm:4.24.2" dependencies: @@ -6504,17 +6167,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - "chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -6751,7 +6403,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": +"color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -6989,7 +6641,7 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": +"convert-source-map@npm:^1.6.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 @@ -7027,13 +6679,6 @@ __metadata: languageName: node linkType: hard -"cookie-signature@npm:1.0.7": - version: 1.0.7 - resolution: "cookie-signature@npm:1.0.7" - checksum: 1a62808cd30d15fb43b70e19829b64d04b0802d8ef00275b57d152de4ae6a3208ca05c197b6668d104c4d9de389e53ccc2d3bc6bcaaffd9602461417d8c40710 - languageName: node - linkType: hard - "cookie-signature@npm:^1.2.1": version: 1.2.2 resolution: "cookie-signature@npm:1.2.2" @@ -7251,24 +6896,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: 2.0.0 - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0": - version: 4.4.0 - resolution: "debug@npm:4.4.0" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1": + version: 4.4.1 + resolution: "debug@npm:4.4.1" dependencies: ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 + checksum: a43826a01cda685ee4cec00fb2d3322eaa90ccadbef60d9287debc2a886be3e835d9199c80070ede75a409ee57828c4c6cd80e4b154f2843f0dc95a570dc0729 languageName: node linkType: hard @@ -7293,18 +6929,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.4.1": - version: 4.4.1 - resolution: "debug@npm:4.4.1" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: a43826a01cda685ee4cec00fb2d3322eaa90ccadbef60d9287debc2a886be3e835d9199c80070ede75a409ee57828c4c6cd80e4b154f2843f0dc95a570dc0729 - languageName: node - linkType: hard - "decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -7411,7 +7035,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0, depd@npm:^2.0.0, depd@npm:~2.0.0": +"depd@npm:2.0.0, depd@npm:^2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a @@ -7785,13 +7409,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - "escape-string-regexp@npm:^2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" @@ -8162,22 +7779,6 @@ __metadata: languageName: node linkType: hard -"express-session@npm:^1.18.1": - version: 1.18.1 - resolution: "express-session@npm:1.18.1" - dependencies: - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: ~2.0.0 - on-headers: ~1.0.2 - parseurl: ~1.3.3 - safe-buffer: 5.2.1 - uid-safe: ~2.1.5 - checksum: e712cb3399300d9e300b51769ee3e81da6a4a54acc39137945134bf61a452f27ee9afde337f3c0f300457a88b3a12d0b5c711625684d7c8d998e9d2bd34d9e18 - languageName: node - linkType: hard - "express@npm:5.1.0": version: 5.1.0 resolution: "express@npm:5.1.0" @@ -8948,13 +8549,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -9711,20 +9305,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.1 - resolution: "istanbul-lib-instrument@npm:6.0.1" - dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-coverage: ^3.2.0 - semver: ^7.5.4 - checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^6.0.2": +"istanbul-lib-instrument@npm:^6.0.0, istanbul-lib-instrument@npm:^6.0.2": version: 6.0.3 resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: @@ -10329,15 +9910,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - "jsesc@npm:^3.0.2": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -11320,13 +10892,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 - languageName: node - linkType: hard - "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -11773,13 +11338,6 @@ __metadata: languageName: node linkType: hard -"obuf@npm:~1.1.2": - version: 1.1.2 - resolution: "obuf@npm:1.1.2" - checksum: 41a2ba310e7b6f6c3b905af82c275bf8854896e2e4c5752966d64cbcd2f599cfffd5932006bcf3b8b419dfdacebb3a3912d5d94e10f1d0acab59876c8757f27f - languageName: node - linkType: hard - "on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -11789,13 +11347,6 @@ __metadata: languageName: node linkType: hard -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5 - languageName: node - linkType: hard - "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -12055,7 +11606,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.3, parseurl@npm:~1.3.3": +"parseurl@npm:^1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -12182,13 +11733,6 @@ __metadata: languageName: node linkType: hard -"pg-numeric@npm:1.0.2": - version: 1.0.2 - resolution: "pg-numeric@npm:1.0.2" - checksum: 8899f8200caa1744439a8778a9eb3ceefb599d893e40a09eef84ee0d4c151319fd416634a6c0fc7b7db4ac268710042da5be700b80ef0de716fe089b8652c84f - languageName: node - linkType: hard - "pg-pool@npm:^3.10.1": version: 3.10.1 resolution: "pg-pool@npm:3.10.1" @@ -12229,21 +11773,6 @@ __metadata: languageName: node linkType: hard -"pg-types@npm:^4.0.1": - version: 4.0.1 - resolution: "pg-types@npm:4.0.1" - dependencies: - pg-int8: 1.0.1 - pg-numeric: 1.0.2 - postgres-array: ~3.0.1 - postgres-bytea: ~3.0.0 - postgres-date: ~2.0.1 - postgres-interval: ^3.0.0 - postgres-range: ^1.1.1 - checksum: 05258ef2f27a75f1bf4e243f36bb749f85148339d3be818147bcc4aebe019ad7589a6869150713140250d81e5a46ec25dc6e0a031ea77e23db5ca232a0d7a3dc - languageName: node - linkType: hard - "pg@npm:^8.16.3": version: 8.16.3 resolution: "pg@npm:8.16.3" @@ -12349,13 +11878,6 @@ __metadata: languageName: node linkType: hard -"postgres-array@npm:~3.0.1": - version: 3.0.2 - resolution: "postgres-array@npm:3.0.2" - checksum: 5955f9dffeb6fa960c1a0b04fd4b2ba16813ddb636934ad26f902e4d76a91c0b743dcc6edc4cffc52deba7d547505e0020adea027c1d50a774f989cf955420d1 - languageName: node - linkType: hard - "postgres-bytea@npm:~1.0.0": version: 1.0.0 resolution: "postgres-bytea@npm:1.0.0" @@ -12363,15 +11885,6 @@ __metadata: languageName: node linkType: hard -"postgres-bytea@npm:~3.0.0": - version: 3.0.0 - resolution: "postgres-bytea@npm:3.0.0" - dependencies: - obuf: ~1.1.2 - checksum: 5f917a003fcaa0df7f285e1c37108ad474ce91193466b9bd4bcaecef2cdea98ca069c00aa6a8dbe6d2e7192336cadc3c9b36ae48d1555a299521918e00e2936b - languageName: node - linkType: hard - "postgres-date@npm:~1.0.4": version: 1.0.7 resolution: "postgres-date@npm:1.0.7" @@ -12379,13 +11892,6 @@ __metadata: languageName: node linkType: hard -"postgres-date@npm:~2.0.1": - version: 2.0.1 - resolution: "postgres-date@npm:2.0.1" - checksum: 0304bf8641a01412e4f5c3a374604e2e3dbc9dbee71d30df12fe60b32560c5674f887c2d15bafa2996f3b618b617398e7605f0e3669db43f31e614dfe69f8de7 - languageName: node - linkType: hard - "postgres-interval@npm:^1.1.0": version: 1.2.0 resolution: "postgres-interval@npm:1.2.0" @@ -12395,20 +11901,6 @@ __metadata: languageName: node linkType: hard -"postgres-interval@npm:^3.0.0": - version: 3.0.0 - resolution: "postgres-interval@npm:3.0.0" - checksum: c7a1cf006de97de663b6b8c4d2b167aa9909a238c4866a94b15d303762f5ac884ff4796cd6e2111b7f0a91302b83c570453aa8506fd005b5a5d5dfa87441bebc - languageName: node - linkType: hard - -"postgres-range@npm:^1.1.1": - version: 1.1.3 - resolution: "postgres-range@npm:1.1.3" - checksum: bf7e194a18c490d02bda0bd02035a8da454d8fd2b22c55d3d03f185c038b2a6f52d0804417d8090864afefc2b7ed664b2d12c2454a4a0f545dcbbb86488fbdf1 - languageName: node - linkType: hard - "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -12587,13 +12079,6 @@ __metadata: languageName: node linkType: hard -"random-bytes@npm:~1.0.0": - version: 1.0.0 - resolution: "random-bytes@npm:1.0.0" - checksum: 09faa256394aa2ca9754aa57e92a27c452c3e97ffb266e98bebb517332e9df7168fea393159f88d884febce949ba8bec8ddb02f03342da6c6023ecc7b155e0ae - languageName: node - linkType: hard - "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -13120,7 +12605,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.0.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -13802,15 +13287,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -14089,13 +13565,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -14554,15 +14023,6 @@ __metadata: languageName: node linkType: hard -"uid-safe@npm:~2.1.5": - version: 2.1.5 - resolution: "uid-safe@npm:2.1.5" - dependencies: - random-bytes: ~1.0.0 - checksum: 07536043da9a026f4a2bc397543d0ace7587449afa1d9d2c4fd3ce76af8a5263a678788bcc429dff499ef29d45843cd5ee9d05434450fcfc19cc661229f703d1 - languageName: node - linkType: hard - "uid@npm:2.0.2": version: 2.0.2 resolution: "uid@npm:2.0.2" @@ -14605,13 +14065,6 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.21.0": - version: 6.21.0 - resolution: "undici-types@npm:6.21.0" - checksum: 46331c7d6016bf85b3e8f20c159d62f5ae471aba1eb3dc52fff35a0259d58dcc7d592d4cc4f00c5f9243fa738a11cfa48bd20203040d4a9e6bc25e807fab7ab3 - languageName: node - linkType: hard - "undici-types@npm:~7.8.0": version: 7.8.0 resolution: "undici-types@npm:7.8.0" @@ -14825,20 +14278,13 @@ __metadata: languageName: node linkType: hard -"validator@npm:^13.15.15": +"validator@npm:^13.15.15, validator@npm:^13.9.0": version: 13.15.15 resolution: "validator@npm:13.15.15" checksum: 10c1b9215a25c31497c481cf4a3ee3e17dcf0b8a219445788e7167ed1b93b8597bbf657bd5c8ca22199b699c3ab41df902c23526cc514075c4b71bd19a13d02c languageName: node linkType: hard -"validator@npm:^13.9.0": - version: 13.15.0 - resolution: "validator@npm:13.15.0" - checksum: 0d1faacb802336e69fafde33723b6de8e1833d1a3ec2b5202ffc69b95c8140db6d4728760026d738243d706cd324ea84808deea2ed647f571a3171d03ade8031 - languageName: node - linkType: hard - "vary@npm:^1, vary@npm:^1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2"