From bb04032b1d8d5a89c4d36a058a0a8bdb185e48ae Mon Sep 17 00:00:00 2001 From: Joel Dierkes Date: Wed, 8 Jul 2026 13:06:22 -0700 Subject: [PATCH] feat: add max chunk size --- .changeset/chunk-size-and-file-context.md | 5 ++ packages/cli/package.json | 2 +- packages/cli/src/commands/store/create.ts | 12 +++- packages/cli/src/commands/store/search.ts | 30 +++++++--- packages/cli/src/commands/store/sync.ts | 10 ++++ packages/cli/src/commands/store/upload.ts | 15 ++++- packages/cli/src/utils/store.ts | 21 +++++-- packages/cli/src/utils/sync.ts | 8 ++- packages/cli/src/utils/upload.ts | 37 ++++++++----- .../cli/tests/commands/store/create.test.ts | 43 +++++++++++++++ .../cli/tests/commands/store/files.test.ts | 4 ++ .../cli/tests/commands/store/search.test.ts | 55 ++++++++++--------- .../cli/tests/commands/store/sync.test.ts | 28 ++++++++++ packages/cli/tests/utils/upload.test.ts | 3 +- pnpm-lock.yaml | 11 ++-- 15 files changed, 217 insertions(+), 67 deletions(-) create mode 100644 .changeset/chunk-size-and-file-context.md diff --git a/.changeset/chunk-size-and-file-context.md b/.changeset/chunk-size-and-file-context.md new file mode 100644 index 0000000..39231af --- /dev/null +++ b/.changeset/chunk-size-and-file-context.md @@ -0,0 +1,5 @@ +--- +"@mixedbread/cli": minor +--- + +Add `--max-chunk-size` to `store sync` and `store upload` to control the chunk size used when processing files, and `--with-file-context` to `store create` to enable LLM file contextualization at the store level. Update `@mixedbread/sdk` to 0.77. diff --git a/packages/cli/package.json b/packages/cli/package.json index 3702473..b3b71a3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -50,7 +50,7 @@ }, "dependencies": { "@clack/prompts": "^1.0.1", - "@mixedbread/sdk": "^0.57.0", + "@mixedbread/sdk": "^0.77.0", "@pnpm/tabtab": "^0.5.4", "chalk": "^5.6.2", "cli-table3": "^0.6.5", diff --git a/packages/cli/src/commands/store/create.ts b/packages/cli/src/commands/store/create.ts index bdffa2c..5e3d997 100644 --- a/packages/cli/src/commands/store/create.ts +++ b/packages/cli/src/commands/store/create.ts @@ -20,6 +20,9 @@ const CreateStoreSchema = extendGlobalOptions({ description: z.string().optional(), public: z.union([z.boolean(), z.string()]).optional(), contextualization: z.union([z.boolean(), z.string()]).optional(), + withFileContext: z + .boolean({ error: '"with-file-context" must be a boolean' }) + .optional(), expiresAfter: z.coerce .number({ error: '"expires-after" must be a number' }) .int({ error: '"expires-after" must be an integer' }) @@ -42,6 +45,10 @@ export function createCreateCommand(): Command { "--contextualization [fields]", "Enable contextualization, optionally with specific metadata fields (comma-separated)" ) + .option( + "--with-file-context", + "Use an LLM to situate each text chunk within the full document during ingestion" + ) .option("--expires-after ", "Expire after number of days") .option("--metadata ", "Additional metadata as JSON string") ); @@ -66,7 +73,10 @@ export function createCreateCommand(): Command { name: parsedOptions.name, description: parsedOptions.description, is_public: parsePublicFlag(parsedOptions.public), - config: buildStoreConfig(parsedOptions.contextualization), + config: buildStoreConfig( + parsedOptions.contextualization, + parsedOptions.withFileContext + ), expires_after: parsedOptions.expiresAfter ? { anchor: "last_active_at", diff --git a/packages/cli/src/commands/store/search.ts b/packages/cli/src/commands/store/search.ts index f921b86..ce4f1af 100644 --- a/packages/cli/src/commands/store/search.ts +++ b/packages/cli/src/commands/store/search.ts @@ -35,18 +35,32 @@ type ParsedSearchOptions = z.infer & { storeIdentifier: string; }; +interface StoreFileSearchResponse { + data: Array<{ + filename: string; + score: number; + store_id: string; + chunk_index?: number; + metadata?: unknown; + }>; +} + async function searchStoreFiles( client: Mixedbread, parsedOptions: ParsedSearchOptions ) { - return await client.stores.files.search({ - query: parsedOptions.query, - store_identifiers: [parsedOptions.storeIdentifier], - top_k: parsedOptions.topK, - search_options: { - return_metadata: parsedOptions.returnMetadata, - score_threshold: parsedOptions.threshold, - rerank: parsedOptions.rerank, + // The file-level search endpoint is no longer exposed as a typed method on + // the SDK client, so call it directly. + return await client.post("/v1/stores/files/search", { + body: { + query: parsedOptions.query, + store_identifiers: [parsedOptions.storeIdentifier], + top_k: parsedOptions.topK, + search_options: { + return_metadata: parsedOptions.returnMetadata, + score_threshold: parsedOptions.threshold, + rerank: parsedOptions.rerank, + }, }, }); } diff --git a/packages/cli/src/commands/store/sync.ts b/packages/cli/src/commands/store/sync.ts index b443a69..d3baba4 100644 --- a/packages/cli/src/commands/store/sync.ts +++ b/packages/cli/src/commands/store/sync.ts @@ -29,6 +29,11 @@ const SyncStoreSchema = extendGlobalOptions({ .array(z.string()) .min(1, { error: "At least one pattern is required" }), strategy: z.enum(["fast", "high_quality"]).optional(), + maxChunkSize: z.coerce + .number({ error: '"max-chunk-size" must be a number' }) + .int({ error: '"max-chunk-size" must be an integer' }) + .positive({ error: '"max-chunk-size" must be positive' }) + .optional(), contextualization: z .boolean({ error: '"contextualization" must be a boolean' }) .optional(), @@ -69,6 +74,10 @@ export function createSyncCommand(): Command { "File patterns, folders, or paths to sync (supports ./** and folder names)" ) .option("--strategy ", "Upload strategy (fast|high_quality)") + .option( + "--max-chunk-size ", + "Maximum chunk size used when processing files" + ) .option( "--contextualization", "Deprecated (ignored): contextualization is now configured at the store level" @@ -231,6 +240,7 @@ export function createSyncCommand(): Command { // Execute changes const syncResults = await executeSyncChanges(client, store.id, analysis, { strategy: parsedOptions.strategy, + maxChunkSize: parsedOptions.maxChunkSize, metadata: additionalMetadata, gitInfo: gitInfo.isRepo ? gitInfo : undefined, parallel: parsedOptions.parallel, diff --git a/packages/cli/src/commands/store/upload.ts b/packages/cli/src/commands/store/upload.ts index 7224ee2..c1d63ed 100644 --- a/packages/cli/src/commands/store/upload.ts +++ b/packages/cli/src/commands/store/upload.ts @@ -1,5 +1,5 @@ import { stat } from "node:fs/promises"; -import type { FileCreateParams } from "@mixedbread/sdk/resources/stores"; +import type { StoreFileConfig } from "@mixedbread/sdk/resources/stores"; import chalk from "chalk"; import { Command } from "commander"; import { glob } from "glob"; @@ -32,6 +32,11 @@ const UploadStoreSchema = extendGlobalOptions({ error: '"strategy" must be either "fast" or "high_quality"', }) .optional(), + maxChunkSize: z.coerce + .number({ error: '"max-chunk-size" must be a number' }) + .int({ error: '"max-chunk-size" must be an integer' }) + .positive({ error: '"max-chunk-size" must be positive' }) + .optional(), contextualization: z .boolean({ error: '"contextualization" must be a boolean' }) .optional(), @@ -61,7 +66,8 @@ const UploadStoreSchema = extendGlobalOptions({ }); export interface UploadOptions extends GlobalOptions { - strategy?: FileCreateParams.Config["parsing_strategy"]; + strategy?: StoreFileConfig["parsing_strategy"]; + maxChunkSize?: number; contextualization?: boolean; metadata?: string; dryRun?: boolean; @@ -83,6 +89,10 @@ export function createUploadCommand(): Command { 'File patterns to upload (e.g., "*.md", "docs/**/*.pdf")' ) .option("--strategy ", "Processing strategy") + .option( + "--max-chunk-size ", + "Maximum chunk size used when processing files" + ) .option( "--contextualization", "Deprecated (ignored): contextualization is now configured at the store level" @@ -258,6 +268,7 @@ export function createUploadCommand(): Command { unique: parsedOptions.unique || false, existingFiles, parallel, + maxChunkSize: parsedOptions.maxChunkSize, multipartUpload, }); } catch (error) { diff --git a/packages/cli/src/utils/store.ts b/packages/cli/src/utils/store.ts index dea1d8a..a717782 100644 --- a/packages/cli/src/utils/store.ts +++ b/packages/cli/src/utils/store.ts @@ -1,6 +1,7 @@ import { isCancel, select } from "@clack/prompts"; import type { Mixedbread } from "@mixedbread/sdk"; import type { + ContextualizationConfig, FileListParams, Store, StoreFile, @@ -74,11 +75,13 @@ export function parsePublicFlag(value?: boolean | string): boolean | undefined { } export function buildStoreConfig( - contextualization?: boolean | string -): { contextualization: boolean | { with_metadata: string[] } } | undefined { - if (contextualization === undefined) { + contextualization?: boolean | string, + withFileContext?: boolean +): { contextualization: boolean | ContextualizationConfig } | undefined { + if (contextualization === undefined && !withFileContext) { return undefined; } + const config: ContextualizationConfig = {}; if (typeof contextualization === "string") { const fields = contextualization .split(",") @@ -89,9 +92,17 @@ export function buildStoreConfig( `Invalid value for --contextualization: "${contextualization}". Use a comma-separated list of metadata fields.` ); } - return { contextualization: { with_metadata: fields } }; + config.with_metadata = fields; + } else if (contextualization === true) { + if (!withFileContext) { + return { contextualization: true }; + } + config.with_metadata = true; + } + if (withFileContext) { + config.with_file_context = true; } - return { contextualization: true }; + return { contextualization: config }; } export async function checkExistingFiles( diff --git a/packages/cli/src/utils/sync.ts b/packages/cli/src/utils/sync.ts index b27616f..83f83e7 100644 --- a/packages/cli/src/utils/sync.ts +++ b/packages/cli/src/utils/sync.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import type Mixedbread from "@mixedbread/sdk"; -import type { FileCreateParams } from "@mixedbread/sdk/resources/stores"; +import type { StoreFileConfig } from "@mixedbread/sdk/resources/stores"; import chalk from "chalk"; import { glob } from "glob"; import pLimit from "p-limit"; @@ -264,7 +264,8 @@ export async function executeSyncChanges( storeIdentifier: string, analysis: SyncAnalysis, options: { - strategy?: FileCreateParams.Config["parsing_strategy"]; + strategy?: StoreFileConfig["parsing_strategy"]; + maxChunkSize?: number; metadata?: Record; gitInfo?: { commit: string; branch: string }; parallel?: number; @@ -385,6 +386,7 @@ export async function executeSyncChanges( await uploadFile(client, storeIdentifier, file.path, { metadata: finalMetadata, strategy: options.strategy, + maxChunkSize: options.maxChunkSize, externalId: file.path, multipartUpload: options.multipartUpload, onProgress: (progress: UploadProgress) => { @@ -455,7 +457,7 @@ export function displaySyncResultsSummary( gitInfo: { commit: string; branch: string; isRepo: boolean }, fromGit?: string, uploadOptions?: { - strategy?: FileCreateParams.Config["parsing_strategy"]; + strategy?: StoreFileConfig["parsing_strategy"]; } ): void { console.log(chalk.bold("\nSummary:")); diff --git a/packages/cli/src/utils/upload.ts b/packages/cli/src/utils/upload.ts index 9e00536..d63cb25 100644 --- a/packages/cli/src/utils/upload.ts +++ b/packages/cli/src/utils/upload.ts @@ -3,7 +3,7 @@ import { stat } from "node:fs/promises"; import { cpus, freemem } from "node:os"; import { basename, relative } from "node:path"; import type Mixedbread from "@mixedbread/sdk"; -import type { FileCreateParams } from "@mixedbread/sdk/resources/stores"; +import type { StoreFileConfig } from "@mixedbread/sdk/resources/stores"; import chalk from "chalk"; import { lookup } from "mime-types"; import pLimit from "p-limit"; @@ -126,7 +126,8 @@ export interface UploadProgress { export interface UploadFileOptions { metadata?: Record; - strategy?: FileCreateParams.Config["parsing_strategy"]; + strategy?: StoreFileConfig["parsing_strategy"]; + maxChunkSize?: number; externalId?: string; multipartUpload?: MultipartUploadOptions; onProgress?: (progress: UploadProgress) => void; @@ -134,10 +135,24 @@ export interface UploadFileOptions { export interface FileToUpload { path: string; - strategy: FileCreateParams.Config["parsing_strategy"]; + strategy: StoreFileConfig["parsing_strategy"]; metadata: Record; } +/** + * Build the file processing config for an upload request. `max_chunk_size` is + * accepted by the API but not yet part of the SDK's StoreFileConfig type. + */ +export function buildFileConfig( + strategy: StoreFileConfig["parsing_strategy"], + maxChunkSize?: number +): StoreFileConfig { + return { + parsing_strategy: strategy, + ...(maxChunkSize != null && { max_chunk_size: maxChunkSize }), + } as StoreFileConfig; +} + export interface UploadResults { uploaded: number; updated: number; @@ -189,6 +204,7 @@ export async function uploadFile( const { metadata = {}, strategy, + maxChunkSize, externalId, multipartUpload, onProgress, @@ -238,9 +254,7 @@ export async function uploadFile( file, body: { metadata, - config: { - parsing_strategy: strategy, - }, + config: buildFileConfig(strategy, maxChunkSize), ...(externalId ? { external_id: externalId } : {}), }, options: { timeout: UPLOAD_TIMEOUT }, @@ -279,6 +293,7 @@ export async function uploadFilesInBatch( existingFiles: Map; parallel: number; showStrategyPerFile?: boolean; + maxChunkSize?: number; multipartUpload?: MultipartUploadOptions; } ): Promise { @@ -287,6 +302,7 @@ export async function uploadFilesInBatch( existingFiles, parallel, showStrategyPerFile = false, + maxChunkSize, multipartUpload, } = options; @@ -372,10 +388,7 @@ export async function uploadFilesInBatch( ); } - const mpConfig = resolveMultipartConfig( - stats.size, - multipartUpload - ); + const mpConfig = resolveMultipartConfig(stats.size, multipartUpload); const totalFileBytes = stats.size; if (totalFileBytes >= mpConfig.threshold) { @@ -391,9 +404,7 @@ export async function uploadFilesInBatch( file: fileToUpload, body: { metadata: fileMetadata, - config: { - parsing_strategy: file.strategy, - }, + config: buildFileConfig(file.strategy, maxChunkSize), }, options: { timeout: UPLOAD_TIMEOUT }, multipartUpload: { diff --git a/packages/cli/tests/commands/store/create.test.ts b/packages/cli/tests/commands/store/create.test.ts index 37bfdca..6fe83d5 100644 --- a/packages/cli/tests/commands/store/create.test.ts +++ b/packages/cli/tests/commands/store/create.test.ts @@ -463,6 +463,49 @@ describe("Store Create Command", () => { }); }); + it("should combine --contextualization fields with --with-file-context", async () => { + const mockResponse = { + id: "550e8400-e29b-41d4-a716-446655440010", + name: "ctx-store", + description: null, + is_public: false, + config: { + contextualization: { + with_metadata: ["filePath"], + with_file_context: true, + }, + }, + expires_after: null, + metadata: {}, + created_at: "2021-01-01T00:00:00Z", + updated_at: "2021-01-01T00:00:00Z", + }; + + mockClient.stores.create.mockResolvedValue(mockResponse); + + await command.parseAsync([ + "node", + "create", + "ctx-store", + "--contextualization=filePath", + "--with-file-context", + ]); + + expect(mockClient.stores.create).toHaveBeenCalledWith({ + name: "ctx-store", + description: undefined, + is_public: undefined, + config: { + contextualization: { + with_metadata: ["filePath"], + with_file_context: true, + }, + }, + expires_after: undefined, + metadata: undefined, + }); + }); + it("should parse single field for --contextualization", async () => { const mockResponse = { id: "550e8400-e29b-41d4-a716-446655440010", diff --git a/packages/cli/tests/commands/store/files.test.ts b/packages/cli/tests/commands/store/files.test.ts index cfdf206..f5cdceb 100644 --- a/packages/cli/tests/commands/store/files.test.ts +++ b/packages/cli/tests/commands/store/files.test.ts @@ -94,6 +94,7 @@ describe("Files Command", () => { usage_bytes: 1048576, created_at: "2024-01-01T00:00:00Z", store_id: "550e8400-e29b-41d4-a716-446655440070", + content_url: "https://example.com/files/file_1", }, { id: "file_2", @@ -102,6 +103,7 @@ describe("Files Command", () => { usage_bytes: 2048, created_at: "2024-01-02T00:00:00Z", store_id: "550e8400-e29b-41d4-a716-446655440070", + content_url: "https://example.com/files/file_2", }, ]; @@ -281,6 +283,7 @@ describe("Files Command", () => { created_at: "2024-01-01T12:00:00Z", metadata: { author: "John Doe", version: "1.0" }, store_id: "550e8400-e29b-41d4-a716-446655440070", + content_url: "https://example.com/files/file_123", }; it("should get file details", async () => { @@ -484,6 +487,7 @@ describe("Files Command", () => { usage_bytes: 1024, created_at: "2024-01-01T00:00:00Z", store_id: "550e8400-e29b-41d4-a716-446655440070", + content_url: "https://example.com/files/file_1", }, ]; diff --git a/packages/cli/tests/commands/store/search.test.ts b/packages/cli/tests/commands/store/search.test.ts index ef413cd..1e405e6 100644 --- a/packages/cli/tests/commands/store/search.test.ts +++ b/packages/cli/tests/commands/store/search.test.ts @@ -8,7 +8,6 @@ import { } from "@jest/globals"; import type Mixedbread from "@mixedbread/sdk"; import type { StoreSearchResponse } from "@mixedbread/sdk/resources/index.mjs"; -import type { FileSearchResponse } from "@mixedbread/sdk/resources/stores.mjs"; import type { Command } from "commander"; import { createSearchCommand } from "../../../src/commands/store/search"; import * as clientUtils from "../../../src/utils/client"; @@ -42,10 +41,10 @@ const mockFormatOutput = outputUtils.formatOutput as jest.MockedFunction< describe("Store Search Command", () => { let command: Command; let mockClient: { + post: jest.MockedFunction< + (path: string, opts?: unknown) => Promise + >; stores: { - files: { - search: jest.MockedFunction; - }; search: jest.MockedFunction; }; }; @@ -53,10 +52,8 @@ describe("Store Search Command", () => { beforeEach(() => { command = createSearchCommand(); mockClient = { + post: jest.fn(), stores: { - files: { - search: jest.fn(), - }, search: jest.fn(), }, }; @@ -278,7 +275,7 @@ describe("Store Search Command", () => { describe("File search", () => { it("should search files when file-search flag is enabled", async () => { - const mockFileResults: FileSearchResponse = { + const mockFileResults = { data: [ { filename: "document1.pdf", @@ -300,7 +297,7 @@ describe("Store Search Command", () => { }, ], }; - mockClient.stores.files.search.mockResolvedValue(mockFileResults); + mockClient.post.mockResolvedValue(mockFileResults); await command.parseAsync([ "node", @@ -310,14 +307,16 @@ describe("Store Search Command", () => { "--file-search", ]); - expect(mockClient.stores.files.search).toHaveBeenCalledWith({ - query: "query", - store_identifiers: ["550e8400-e29b-41d4-a716-446655440080"], - top_k: 5, - search_options: { - return_metadata: undefined, - score_threshold: undefined, - rerank: false, + expect(mockClient.post).toHaveBeenCalledWith("/v1/stores/files/search", { + body: { + query: "query", + store_identifiers: ["550e8400-e29b-41d4-a716-446655440080"], + top_k: 5, + search_options: { + return_metadata: undefined, + score_threshold: undefined, + rerank: false, + }, }, }); @@ -327,7 +326,7 @@ describe("Store Search Command", () => { }); it("should search files with all options", async () => { - const mockFileResults: FileSearchResponse = { + const mockFileResults = { data: [ { filename: "document1.pdf", @@ -340,7 +339,7 @@ describe("Store Search Command", () => { }, ], }; - mockClient.stores.files.search.mockResolvedValue(mockFileResults); + mockClient.post.mockResolvedValue(mockFileResults); await command.parseAsync([ "node", @@ -356,14 +355,16 @@ describe("Store Search Command", () => { "--rerank", ]); - expect(mockClient.stores.files.search).toHaveBeenCalledWith({ - query: "query", - store_identifiers: ["550e8400-e29b-41d4-a716-446655440080"], - top_k: 15, - search_options: { - return_metadata: true, - score_threshold: 0.7, - rerank: true, + expect(mockClient.post).toHaveBeenCalledWith("/v1/stores/files/search", { + body: { + query: "query", + store_identifiers: ["550e8400-e29b-41d4-a716-446655440080"], + top_k: 15, + search_options: { + return_metadata: true, + score_threshold: 0.7, + rerank: true, + }, }, }); }); diff --git a/packages/cli/tests/commands/store/sync.test.ts b/packages/cli/tests/commands/store/sync.test.ts index d7d95ea..bbc6905 100644 --- a/packages/cli/tests/commands/store/sync.test.ts +++ b/packages/cli/tests/commands/store/sync.test.ts @@ -150,6 +150,34 @@ describe("Store Sync Command", () => { }); }); + it("should pass --max-chunk-size to executeSyncChanges", async () => { + mockAnalyzeChanges.mockResolvedValue({ + added: [{ path: "/test.txt", type: "added", size: 12 }], + modified: [], + deleted: [], + unchanged: 0, + totalFiles: 1, + totalSize: 12, + }); + + await command.parseAsync([ + "node", + "sync", + "test-store", + "*.txt", + "--yes", + "--max-chunk-size", + "500", + ]); + + expect(mockExecuteSyncChanges).toHaveBeenCalledWith( + expect.anything(), + "550e8400-e29b-41d4-a716-446655440040", + expect.anything(), + expect.objectContaining({ maxChunkSize: 500 }) + ); + }); + it("should work with other options when using -f", async () => { await command.parseAsync([ "node", diff --git a/packages/cli/tests/utils/upload.test.ts b/packages/cli/tests/utils/upload.test.ts index 289fe0f..e641876 100644 --- a/packages/cli/tests/utils/upload.test.ts +++ b/packages/cli/tests/utils/upload.test.ts @@ -13,8 +13,7 @@ import mockFs from "mock-fs"; // mock-fs does not intercept openAsBlob, so provide a shim that reads // the (mocked) file via readFileSync and wraps it in a Blob. jest.mock("node:fs", () => { - const actual = - jest.requireActual("node:fs"); + const actual = jest.requireActual("node:fs"); return { ...actual, openAsBlob: jest.fn(async (path: string) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f9bbac..5c18bd1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: ^1.0.1 version: 1.0.1 '@mixedbread/sdk': - specifier: ^0.57.0 - version: 0.57.0 + specifier: ^0.77.0 + version: 0.77.0 '@pnpm/tabtab': specifier: ^0.5.4 version: 0.5.4 @@ -759,8 +759,8 @@ packages: resolution: {integrity: sha512-B0Un0thpz4UKN69QVmgdVsCIgiz+jR4V+nxuCOgdm/P0Iie1NctqY092VQ/iobY/FSMzhHJofXij086y/9E5rg==} hasBin: true - '@mixedbread/sdk@0.57.0': - resolution: {integrity: sha512-twoZYKSuSHsR1yKDaiEDB+TRGSPUYC9gfOTMC4duSbSdXYN12mPWiihMXuDfdZT/JuWGh2cnQ73rle8FoG0+rw==} + '@mixedbread/sdk@0.77.0': + resolution: {integrity: sha512-OxVkpVoJpdCGSo1v1Nu6tDiSv7M17LXT9A0LOT97WnkiGaHTranfeTioUI1XuQYfqXiAftPWC6eznswW9AB0DA==} hasBin: true '@napi-rs/wasm-runtime@0.2.12': @@ -1301,6 +1301,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -4104,7 +4105,7 @@ snapshots: '@mixedbread/sdk@0.26.0': {} - '@mixedbread/sdk@0.57.0': {} + '@mixedbread/sdk@0.77.0': {} '@napi-rs/wasm-runtime@0.2.12': dependencies: