diff --git a/apps/server/package.json b/apps/server/package.json index e15d93f7..e2d030cb 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -30,7 +30,6 @@ "test:e2e": "jest --config test/jest-e2e.json" }, "dependencies": { - "@ai-sdk/amazon-bedrock": "^3.0.35", "@ai-sdk/azure": "^2.0.47", "@ai-sdk/google": "^2.0.18", "@ai-sdk/openai": "^2.0.46", diff --git a/apps/server/src/core/workspace/dto/update-workspace.dto.ts b/apps/server/src/core/workspace/dto/update-workspace.dto.ts index 8e4df4e1..2b61c7ee 100644 --- a/apps/server/src/core/workspace/dto/update-workspace.dto.ts +++ b/apps/server/src/core/workspace/dto/update-workspace.dto.ts @@ -22,4 +22,12 @@ export class UpdateWorkspaceDto extends PartialType(CreateWorkspaceDto) { @IsOptional() @IsBoolean() restrictApiToAdmins: boolean; + + @IsOptional() + @IsBoolean() + aiSearch: boolean; + + @IsOptional() + @IsBoolean() + generativeAi: boolean; } diff --git a/apps/server/src/core/workspace/services/workspace.service.ts b/apps/server/src/core/workspace/services/workspace.service.ts index a3db431e..3ede6ec8 100644 --- a/apps/server/src/core/workspace/services/workspace.service.ts +++ b/apps/server/src/core/workspace/services/workspace.service.ts @@ -312,6 +312,30 @@ export class WorkspaceService { delete updateWorkspaceDto.restrictApiToAdmins; } + if (typeof updateWorkspaceDto.aiSearch !== 'undefined') { + await this.workspaceRepo.updateAiSettings( + workspaceId, + 'aiSearch', + updateWorkspaceDto.aiSearch, + ); + + // to enable this + // we need to check if pgvector and embeddings table exists + + delete updateWorkspaceDto.aiSearch; + // if true, send to ai queue + // if false, send to delete embeddings + } + + if (typeof updateWorkspaceDto.generativeAi !== 'undefined') { + await this.workspaceRepo.updateAiSettings( + workspaceId, + 'generativeAi', + updateWorkspaceDto.generativeAi, + ); + delete updateWorkspaceDto.generativeAi; + } + await this.workspaceRepo.updateWorkspace(updateWorkspaceDto, workspaceId); const workspace = await this.workspaceRepo.findById(workspaceId, { diff --git a/apps/server/src/database/listeners/page.listener.ts b/apps/server/src/database/listeners/page.listener.ts index fd33bcd6..f94c2e18 100644 --- a/apps/server/src/database/listeners/page.listener.ts +++ b/apps/server/src/database/listeners/page.listener.ts @@ -26,18 +26,15 @@ export class PageListener { if (this.isTypesense()) { await this.searchQueue.add(QueueJob.PAGE_CREATED, { pageIds }); } - if (this.environmentService.isAISearchEnabled()) { - await this.aiQueue.add(QueueJob.PAGE_CREATED, { pageIds }); - } + + await this.aiQueue.add(QueueJob.PAGE_CREATED, { pageIds }); } @OnEvent(EventName.PAGE_UPDATED) async handlePageUpdated(event: PageEvent) { const { pageIds } = event; - if (this.isTypesense()) { - await this.searchQueue.add(QueueJob.PAGE_UPDATED, { pageIds }); - } + await this.searchQueue.add(QueueJob.PAGE_UPDATED, { pageIds }); } @OnEvent(EventName.PAGE_DELETED) @@ -68,9 +65,7 @@ export class PageListener { await this.searchQueue.add(QueueJob.PAGE_RESTORED, { pageIds }); } - if (this.environmentService.isAISearchEnabled()) { - await this.aiQueue.add(QueueJob.PAGE_RESTORED, { pageIds }); - } + await this.aiQueue.add(QueueJob.PAGE_RESTORED, { pageIds }); } isTypesense(): boolean { diff --git a/apps/server/src/database/listeners/space.listener.ts b/apps/server/src/database/listeners/space.listener.ts index a904ed50..af6e3a22 100644 --- a/apps/server/src/database/listeners/space.listener.ts +++ b/apps/server/src/database/listeners/space.listener.ts @@ -27,9 +27,7 @@ export class SpaceListener { await this.searchQueue.add(QueueJob.SPACE_DELETED, { spaceId }); } - if (this.environmentService.isAISearchEnabled()) { - await this.aiQueue.add(QueueJob.SPACE_DELETED, { spaceId }); - } + await this.aiQueue.add(QueueJob.SPACE_DELETED, { spaceId }); } isTypesense(): boolean { diff --git a/apps/server/src/database/migrations/20250923T181121-ai.ts b/apps/server/src/database/migrations/20250923T181121-ai.ts deleted file mode 100644 index da22483f..00000000 --- a/apps/server/src/database/migrations/20250923T181121-ai.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { type Kysely } from 'kysely'; - -export async function up(db: Kysely): Promise { - await db.schema - .alterTable('workspaces') - .addColumn('enable_ai', 'boolean', (col) => col.defaultTo(false)) - .addColumn('enable_ai_search', 'boolean', (col) => col.defaultTo(false)) - .execute(); -} - -export async function down(db: Kysely): Promise { - await db.schema.alterTable('workspaces').dropColumn('enable_ai').execute(); - await db.schema.alterTable('workspaces').dropColumn('enable_ai_search').execute(); -} diff --git a/apps/server/src/database/repos/workspace/workspace.repo.ts b/apps/server/src/database/repos/workspace/workspace.repo.ts index 790d6402..d17db49b 100644 --- a/apps/server/src/database/repos/workspace/workspace.repo.ts +++ b/apps/server/src/database/repos/workspace/workspace.repo.ts @@ -175,4 +175,22 @@ export class WorkspaceRepo { .returning(this.baseFields) .executeTakeFirst(); } + + async updateAiSettings( + workspaceId: string, + prefKey: string, + prefValue: string | boolean, + ) { + return this.db + .updateTable('workspaces') + .set({ + settings: sql`COALESCE(settings, '{}'::jsonb) + || jsonb_build_object('ai', COALESCE(settings->'ai', '{}'::jsonb) + || jsonb_build_object('${sql.raw(prefKey)}', ${sql.lit(prefValue)}))`, + updatedAt: new Date(), + }) + .where('id', '=', workspaceId) + .returning(this.baseFields) + .executeTakeFirst(); + } } diff --git a/apps/server/src/ee b/apps/server/src/ee index 05b042cb..f7ff3ff8 160000 --- a/apps/server/src/ee +++ b/apps/server/src/ee @@ -1 +1 @@ -Subproject commit 05b042cbb010f791ad9b53c978799c2ad4c69220 +Subproject commit f7ff3ff80dc1cc8a13ca121a656d854d379dd019 diff --git a/apps/server/src/integrations/environment/environment.service.ts b/apps/server/src/integrations/environment/environment.service.ts index bb5e63e1..30624f58 100644 --- a/apps/server/src/integrations/environment/environment.service.ts +++ b/apps/server/src/integrations/environment/environment.service.ts @@ -10,6 +10,10 @@ export class EnvironmentService { return this.configService.get('NODE_ENV', 'development'); } + isDevelopment(): boolean { + return this.getNodeEnv() === 'development'; + } + getAppUrl(): string { const rawUrl = this.configService.get('APP_URL') || @@ -237,23 +241,20 @@ export class EnvironmentService { } getAiDriver(): string { - return this.configService.get('AI_DRIVER', 'openai'); + return this.configService.get('AI_DRIVER'); } getAiEmbeddingModel(): string { - return this.configService.get( - 'AI_EMBEDDING_MODEL', - 'text-embedding-3-small', - ); + return this.configService.get('AI_EMBEDDING_MODEL'); } getAiCompletionModel(): string { - return this.configService.get('AI_COMPLETION_MODEL', 'gpt-4o-mini'); + return this.configService.get('AI_COMPLETION_MODEL'); } getAiEmbeddingDimension(): number { return parseInt( - this.configService.get('AI_EMBEDDING_DIMENSION', '1536'), + this.configService.get('AI_EMBEDDING_DIMENSION'), 10, ); } @@ -266,8 +267,8 @@ export class EnvironmentService { return this.configService.get('OPENAI_API_URL'); } - getGoogleAiApiKey(): string { - return this.configService.get('GOOGLE_AI_API_KEY'); + getGeminiApiKey(): string { + return this.configService.get('GEMINI_API_KEY'); } getOllamaApiUrl(): string { @@ -276,27 +277,4 @@ export class EnvironmentService { 'http://localhost:11434', ); } - - getAwsAccessKeyId(): string { - return this.configService.get('AWS_ACCESS_KEY_ID'); - } - - getAwsSecretAccessKey(): string { - return this.configService.get('AWS_SECRET_ACCESS_KEY'); - } - - getAwsBedrockRegion(): string { - return this.configService.get('AWS_BEDROCK_REGION'); - } - - isAIEnabled(): string { - return this.configService.get('ENABLE_AI'); - } - - isAISearchEnabled(): boolean { - const config = this.configService - .get('AI_SEARCH', 'false') - .toLowerCase(); - return config === 'true'; - } } diff --git a/apps/server/src/integrations/environment/environment.validation.ts b/apps/server/src/integrations/environment/environment.validation.ts index d59558f8..752e3d41 100644 --- a/apps/server/src/integrations/environment/environment.validation.ts +++ b/apps/server/src/integrations/environment/environment.validation.ts @@ -93,6 +93,7 @@ export class EnvironmentVariables { @IsOptional() @ValidateIf((obj) => obj.SEARCH_DRIVER === 'typesense') + @IsNotEmpty() @IsString() TYPESENSE_API_KEY: string; @@ -101,6 +102,53 @@ export class EnvironmentVariables { @IsISO6391() @IsString() TYPESENSE_LOCALE: string; + + @IsOptional() + @ValidateIf((obj) => obj.AI_DRIVER) + @IsIn(['openai', 'gemini', 'ollama']) + @IsString() + AI_DRIVER: string; + + @IsOptional() + @ValidateIf((obj) => obj.AI_DRIVER) + @IsString() + @IsNotEmpty() + AI_EMBEDDING_MODEL: string; + + @IsOptional() + @ValidateIf((obj) => obj.AI_EMBEDDING_DIMENSION) + @IsIn(['768', '1024', '1536']) + @IsString() + AI_EMBEDDING_DIMENSION: string; + + + @IsOptional() + @ValidateIf((obj) => obj.AI_DRIVER) + @IsString() + @IsNotEmpty() + AI_COMPLETION_MODEL: string; + + @IsOptional() + @ValidateIf((obj) => obj.AI_DRIVER && obj.AI_DRIVER === 'openai') + @IsString() + @IsNotEmpty() + OPENAI_API_KEY: string; + + @IsOptional() + @ValidateIf((obj) => obj.AI_DRIVER && obj.OPENAI_API_URL && obj.AI_DRIVER === 'openai') + @IsUrl({ protocols: ['http', 'https'], require_tld: false }) + OPENAI_API_URL: string; + + @IsOptional() + @ValidateIf((obj) => obj.AI_DRIVER && obj.AI_DRIVER === 'gemini') + @IsString() + @IsNotEmpty() + GEMINI_API_KEY: string; + + @IsOptional() + @ValidateIf((obj) => obj.AI_DRIVER && obj.AI_DRIVER === 'ollama') + @IsUrl({ protocols: ['http', 'https'], require_tld: false }) + OLLAMA_API_URL: string; } export function validate(config: Record) { diff --git a/apps/server/src/integrations/queue/constants/queue.constants.ts b/apps/server/src/integrations/queue/constants/queue.constants.ts index 89eeb0a6..eaac9b9c 100644 --- a/apps/server/src/integrations/queue/constants/queue.constants.ts +++ b/apps/server/src/integrations/queue/constants/queue.constants.ts @@ -53,6 +53,7 @@ export enum QueueJob { WORKSPACE_CREATED = 'workspace-created', WORKSPACE_SPACE_UPDATED = 'workspace-updated', WORKSPACE_DELETED = 'workspace-deleted', + WORKSPACE_DELETE_EMBEDDINGS = 'workspace-delete-embeddings', GENERATE_PAGE_EMBEDDINGS = 'generate-page-embeddings', DELETE_PAGE_EMBEDDINGS = 'delete-page-embeddings', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a67b375..772328b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -429,9 +429,6 @@ importers: apps/server: dependencies: - '@ai-sdk/amazon-bedrock': - specifier: ^3.0.35 - version: 3.0.35(zod@3.25.56) '@ai-sdk/azure': specifier: ^2.0.47 version: 2.0.47(zod@3.25.56) @@ -754,18 +751,6 @@ packages: '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - '@ai-sdk/amazon-bedrock@3.0.35': - resolution: {integrity: sha512-p3MjsZ+CvFgdzV2gf5J1pn5EzC/GVI8sHgL26f9RwAbUSyytPVnGevqcqmFXkWXZ7BtNgkB8M+Gd+1hH2hg5IA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/anthropic@2.0.27': - resolution: {integrity: sha512-tGXdWNs+dMZLsn6yVroz9PqPZbCY6kqwGl/xxFVxJWDrTPGj3+1t1vE7pzTZ3vDOiG05iVC7wzlXwV2Or650YA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/azure@2.0.47': resolution: {integrity: sha512-rPvjnBWVTVRCDs47qfBWxXxx4i4h7itemyKux21qibB7y24rubqmZGx9lYcI5pyBL057uROhBa9Y5VVHf/ESYw==} engines: {node: '>=18'} @@ -796,12 +781,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.12': - resolution: {integrity: sha512-ZtbdvYxdMoria+2SlNarEk6Hlgyf+zzcznlD55EAl+7VZvJaSg2sqPvwArY7L6TfDEDJsnCq0fdhBSkYo0Xqdg==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@2.0.0': resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} @@ -3850,10 +3829,6 @@ packages: '@smithy/eventstream-codec@3.1.10': resolution: {integrity: sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==} - '@smithy/eventstream-codec@4.2.0': - resolution: {integrity: sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==} - engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@3.0.14': resolution: {integrity: sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==} engines: {node: '>=16.0.0'} @@ -3895,10 +3870,6 @@ packages: resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} engines: {node: '>=16.0.0'} - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} - engines: {node: '>=18.0.0'} - '@smithy/md5-js@3.0.11': resolution: {integrity: sha512-3NM0L3i2Zm4bbgG6Ymi9NBcxXhryi3uE8fIfHJZIOfZVxOkGdjdgjR9A06SFIZCfnEIWKXZdm6Yq5/aPXFFhsQ==} @@ -3970,10 +3941,6 @@ packages: resolution: {integrity: sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.6.0': - resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} - engines: {node: '>=18.0.0'} - '@smithy/url-parser@3.0.11': resolution: {integrity: sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==} @@ -3996,10 +3963,6 @@ packages: resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} engines: {node: '>=16.0.0'} - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} - engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@3.0.0': resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} @@ -4020,10 +3983,6 @@ packages: resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} - engines: {node: '>=18.0.0'} - '@smithy/util-middleware@3.0.11': resolution: {integrity: sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==} engines: {node: '>=16.0.0'} @@ -4048,10 +4007,6 @@ packages: resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} engines: {node: '>=16.0.0'} - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} - engines: {node: '>=18.0.0'} - '@smithy/util-waiter@3.2.0': resolution: {integrity: sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==} engines: {node: '>=16.0.0'} @@ -5235,9 +5190,6 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - aws4fetch@1.0.20: - resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -10268,22 +10220,6 @@ snapshots: '@adobe/css-tools@4.3.3': {} - '@ai-sdk/amazon-bedrock@3.0.35(zod@3.25.56)': - dependencies: - '@ai-sdk/anthropic': 2.0.27(zod@3.25.56) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.56) - '@smithy/eventstream-codec': 4.2.0 - '@smithy/util-utf8': 4.2.0 - aws4fetch: 1.0.20 - zod: 3.25.56 - - '@ai-sdk/anthropic@2.0.27(zod@3.25.56)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.56) - zod: 3.25.56 - '@ai-sdk/azure@2.0.47(zod@3.25.56)': dependencies: '@ai-sdk/openai': 2.0.46(zod@3.25.56) @@ -10317,13 +10253,6 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.56 - '@ai-sdk/provider-utils@3.0.12(zod@3.25.56)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 - eventsource-parser: 3.0.6 - zod: 3.25.56 - '@ai-sdk/provider@2.0.0': dependencies: json-schema: 0.4.0 @@ -14083,13 +14012,6 @@ snapshots: '@smithy/util-hex-encoding': 3.0.0 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.6.0 - '@smithy/util-hex-encoding': 4.2.0 - tslib: 2.8.1 - '@smithy/eventstream-serde-browser@3.0.14': dependencies: '@smithy/eventstream-serde-universal': 3.0.13 @@ -14154,10 +14076,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.0': - dependencies: - tslib: 2.8.1 - '@smithy/md5-js@3.0.11': dependencies: '@smithy/types': 3.7.2 @@ -14277,10 +14195,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/types@4.6.0': - dependencies: - tslib: 2.8.1 - '@smithy/url-parser@3.0.11': dependencies: '@smithy/querystring-parser': 3.0.11 @@ -14311,11 +14225,6 @@ snapshots: '@smithy/is-array-buffer': 3.0.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.0': - dependencies: - '@smithy/is-array-buffer': 4.2.0 - tslib: 2.8.1 - '@smithy/util-config-provider@3.0.0': dependencies: tslib: 2.8.1 @@ -14348,10 +14257,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-hex-encoding@4.2.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-middleware@3.0.11': dependencies: '@smithy/types': 3.7.2 @@ -14388,11 +14293,6 @@ snapshots: '@smithy/util-buffer-from': 3.0.0 tslib: 2.8.1 - '@smithy/util-utf8@4.2.0': - dependencies: - '@smithy/util-buffer-from': 4.2.0 - tslib: 2.8.1 - '@smithy/util-waiter@3.2.0': dependencies: '@smithy/abort-controller': 3.1.9 @@ -15724,8 +15624,6 @@ snapshots: '@fastify/error': 4.0.0 fastq: 1.17.1 - aws4fetch@1.0.20: {} - axios@1.9.0: dependencies: follow-redirects: 1.15.6