@n8n/n8n-nodes-langchain 1.110.0 → 1.111.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../utils/N8nBinaryLoader.ts"],"sourcesContent":["import { CSVLoader } from '@langchain/community/document_loaders/fs/csv';\nimport { DocxLoader } from '@langchain/community/document_loaders/fs/docx';\nimport { EPubLoader } from '@langchain/community/document_loaders/fs/epub';\nimport { PDFLoader } from '@langchain/community/document_loaders/fs/pdf';\nimport type { Document } from '@langchain/core/documents';\nimport type { TextSplitter } from '@langchain/textsplitters';\nimport { createWriteStream } from 'fs';\nimport { JSONLoader } from 'langchain/document_loaders/fs/json';\nimport { TextLoader } from 'langchain/document_loaders/fs/text';\nimport type {\n\tIBinaryData,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n\tISupplyDataFunctions,\n} from 'n8n-workflow';\nimport { NodeOperationError, BINARY_ENCODING } from 'n8n-workflow';\nimport { pipeline } from 'stream/promises';\nimport { file as tmpFile, type DirectoryResult } from 'tmp-promise';\n\nimport { getMetadataFiltersValues } from './helpers';\n\nconst SUPPORTED_MIME_TYPES = {\n\tauto: ['*/*'],\n\tpdfLoader: ['application/pdf'],\n\tcsvLoader: ['text/csv'],\n\tepubLoader: ['application/epub+zip'],\n\tdocxLoader: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n\ttextLoader: ['text/plain', 'text/mdx', 'text/md'],\n\tjsonLoader: ['application/json'],\n};\n\nexport class N8nBinaryLoader {\n\tconstructor(\n\t\tprivate context: IExecuteFunctions | ISupplyDataFunctions,\n\t\tprivate optionsPrefix = '',\n\t\tprivate binaryDataKey = '',\n\t\tprivate textSplitter?: TextSplitter,\n\t) {}\n\n\tasync processAll(items?: INodeExecutionData[]): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\n\t\tif (!items) return [];\n\n\t\tfor (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t\t\tconst processedDocuments = await this.processItem(items[itemIndex], itemIndex);\n\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tprivate async validateMimeType(\n\t\tmimeType: string,\n\t\tselectedLoader: keyof typeof SUPPORTED_MIME_TYPES,\n\t): Promise<void> {\n\t\t// Check if loader matches the mime-type of the data\n\t\tif (selectedLoader !== 'auto' && !SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType)) {\n\t\t\tconst neededLoader = Object.keys(SUPPORTED_MIME_TYPES).find((loader) =>\n\t\t\t\tSUPPORTED_MIME_TYPES[loader as keyof typeof SUPPORTED_MIME_TYPES].includes(mimeType),\n\t\t\t);\n\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Mime type doesn't match selected loader. Please select under \"Loader Type\": ${neededLoader}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!Object.values(SUPPORTED_MIME_TYPES).flat().includes(mimeType)) {\n\t\t\tthrow new NodeOperationError(this.context.getNode(), `Unsupported mime type: ${mimeType}`);\n\t\t}\n\n\t\tif (\n\t\t\t!SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType) &&\n\t\t\tselectedLoader !== 'textLoader' &&\n\t\t\tselectedLoader !== 'auto'\n\t\t) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Unsupported mime type: ${mimeType} for selected loader: ${selectedLoader}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async getFilePathOrBlob(\n\t\tbinaryData: IBinaryData,\n\t\tmimeType: string,\n\t): Promise<string | Blob> {\n\t\tif (binaryData.id) {\n\t\t\tconst binaryBuffer = await this.context.helpers.binaryToBuffer(\n\t\t\t\tawait this.context.helpers.getBinaryStream(binaryData.id),\n\t\t\t);\n\t\t\treturn new Blob([binaryBuffer as BlobPart], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new Blob([Buffer.from(binaryData.data, BINARY_ENCODING)], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getLoader(\n\t\tmimeType: string,\n\t\tfilePathOrBlob: string | Blob,\n\t\titemIndex: number,\n\t): Promise<PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader> {\n\t\tswitch (mimeType) {\n\t\t\tcase 'application/pdf':\n\t\t\t\tconst splitPages = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}splitPages`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tfalse,\n\t\t\t\t) as boolean;\n\t\t\t\treturn new PDFLoader(filePathOrBlob, { splitPages });\n\t\t\tcase 'text/csv':\n\t\t\t\tconst column = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}column`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tnull,\n\t\t\t\t) as string;\n\t\t\t\tconst separator = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}separator`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t',',\n\t\t\t\t) as string;\n\t\t\t\treturn new CSVLoader(filePathOrBlob, { column: column ?? undefined, separator });\n\t\t\tcase 'application/epub+zip':\n\t\t\t\t// EPubLoader currently does not accept Blobs https://github.com/langchain-ai/langchainjs/issues/1623\n\t\t\t\tlet filePath: string;\n\t\t\t\tif (filePathOrBlob instanceof Blob) {\n\t\t\t\t\tconst tmpFileData = await tmpFile({ prefix: 'epub-loader-' });\n\t\t\t\t\tconst bufferData = await filePathOrBlob.arrayBuffer();\n\t\t\t\t\tawait pipeline([new Uint8Array(bufferData)], createWriteStream(tmpFileData.path));\n\t\t\t\t\treturn new EPubLoader(tmpFileData.path);\n\t\t\t\t} else {\n\t\t\t\t\tfilePath = filePathOrBlob;\n\t\t\t\t}\n\t\t\t\treturn new EPubLoader(filePath);\n\t\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n\t\t\t\treturn new DocxLoader(filePathOrBlob);\n\t\t\tcase 'text/plain':\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t\tcase 'application/json':\n\t\t\t\tconst pointers = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}pointers`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t'',\n\t\t\t\t) as string;\n\t\t\t\tconst pointersArray = pointers.split(',').map((pointer) => pointer.trim());\n\t\t\t\treturn new JSONLoader(filePathOrBlob, pointersArray);\n\t\t\tdefault:\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t}\n\t}\n\n\tprivate async loadDocuments(\n\t\tloader: PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader,\n\t): Promise<Document[]> {\n\t\treturn this.textSplitter\n\t\t\t? await this.textSplitter.splitDocuments(await loader.load())\n\t\t\t: await loader.load();\n\t}\n\n\tprivate async cleanupTmpFileIfNeeded(\n\t\tcleanupTmpFile: DirectoryResult['cleanup'] | undefined,\n\t): Promise<void> {\n\t\tif (cleanupTmpFile) {\n\t\t\tawait cleanupTmpFile();\n\t\t}\n\t}\n\n\tasync processItem(item: INodeExecutionData, itemIndex: number): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\t\tconst binaryMode = this.context.getNodeParameter('binaryMode', itemIndex, 'allInputData');\n\t\tif (binaryMode === 'allInputData') {\n\t\t\tconst binaryData = this.context.getInputData();\n\n\t\t\tfor (const data of binaryData) {\n\t\t\t\tif (data.binary) {\n\t\t\t\t\tconst binaryDataKeys = Object.keys(data.binary);\n\n\t\t\t\t\tfor (const fileKey of binaryDataKeys) {\n\t\t\t\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, fileKey);\n\t\t\t\t\t\tdocs.push(...processedDocuments);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, this.binaryDataKey);\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tasync processItemByKey(\n\t\titem: INodeExecutionData,\n\t\titemIndex: number,\n\t\tbinaryKey: string,\n\t): Promise<Document[]> {\n\t\tconst selectedLoader: keyof typeof SUPPORTED_MIME_TYPES = this.context.getNodeParameter(\n\t\t\t'loader',\n\t\t\titemIndex,\n\t\t\t'auto',\n\t\t) as keyof typeof SUPPORTED_MIME_TYPES;\n\n\t\tconst docs: Document[] = [];\n\t\tconst metadata = getMetadataFiltersValues(this.context, itemIndex);\n\n\t\tif (!item) return [];\n\n\t\tconst binaryData = this.context.helpers.assertBinaryData(itemIndex, binaryKey);\n\t\tconst { mimeType } = binaryData;\n\n\t\tawait this.validateMimeType(mimeType, selectedLoader);\n\n\t\tconst filePathOrBlob = await this.getFilePathOrBlob(binaryData, mimeType);\n\t\tconst cleanupTmpFile: DirectoryResult['cleanup'] | undefined = undefined;\n\t\tconst loader = await this.getLoader(mimeType, filePathOrBlob, itemIndex);\n\t\tconst loadedDoc = await this.loadDocuments(loader);\n\n\t\tdocs.push(...loadedDoc);\n\n\t\tif (metadata) {\n\t\t\tdocs.forEach((document) => {\n\t\t\t\tdocument.metadata = {\n\t\t\t\t\t...document.metadata,\n\t\t\t\t\t...metadata,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\tawait this.cleanupTmpFileIfNeeded(cleanupTmpFile);\n\n\t\treturn docs;\n\t}\n}\n"],"mappings":"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","names":["tmpFile"]}
1
+ {"version":3,"sources":["../../utils/N8nBinaryLoader.ts"],"sourcesContent":["import { CSVLoader } from '@langchain/community/document_loaders/fs/csv';\nimport { DocxLoader } from '@langchain/community/document_loaders/fs/docx';\nimport { EPubLoader } from '@langchain/community/document_loaders/fs/epub';\nimport { PDFLoader } from '@langchain/community/document_loaders/fs/pdf';\nimport type { Document } from '@langchain/core/documents';\nimport type { TextSplitter } from '@langchain/textsplitters';\nimport { createWriteStream } from 'fs';\nimport { JSONLoader } from 'langchain/document_loaders/fs/json';\nimport { TextLoader } from 'langchain/document_loaders/fs/text';\nimport type {\n\tIBinaryData,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n\tISupplyDataFunctions,\n} from 'n8n-workflow';\nimport { NodeOperationError, BINARY_ENCODING } from 'n8n-workflow';\nimport { pipeline } from 'stream/promises';\nimport { file as tmpFile, type DirectoryResult } from 'tmp-promise';\n\nimport { getMetadataFiltersValues } from './helpers';\n\nconst SUPPORTED_MIME_TYPES = {\n\tauto: ['*/*'],\n\tpdfLoader: ['application/pdf'],\n\tcsvLoader: ['text/csv'],\n\tepubLoader: ['application/epub+zip'],\n\tdocxLoader: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n\ttextLoader: ['text/plain', 'text/mdx', 'text/md', 'text/markdown'],\n\tjsonLoader: ['application/json'],\n};\n\nexport class N8nBinaryLoader {\n\tconstructor(\n\t\tprivate context: IExecuteFunctions | ISupplyDataFunctions,\n\t\tprivate optionsPrefix = '',\n\t\tprivate binaryDataKey = '',\n\t\tprivate textSplitter?: TextSplitter,\n\t) {}\n\n\tasync processAll(items?: INodeExecutionData[]): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\n\t\tif (!items) return [];\n\n\t\tfor (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t\t\tconst processedDocuments = await this.processItem(items[itemIndex], itemIndex);\n\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tprivate async validateMimeType(\n\t\tmimeType: string,\n\t\tselectedLoader: keyof typeof SUPPORTED_MIME_TYPES,\n\t): Promise<void> {\n\t\t// Check if loader matches the mime-type of the data\n\t\tif (selectedLoader !== 'auto' && !SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType)) {\n\t\t\tconst neededLoader = Object.keys(SUPPORTED_MIME_TYPES).find((loader) =>\n\t\t\t\tSUPPORTED_MIME_TYPES[loader as keyof typeof SUPPORTED_MIME_TYPES].includes(mimeType),\n\t\t\t);\n\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Mime type doesn't match selected loader. Please select under \"Loader Type\": ${neededLoader}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!Object.values(SUPPORTED_MIME_TYPES).flat().includes(mimeType)) {\n\t\t\tthrow new NodeOperationError(this.context.getNode(), `Unsupported mime type: ${mimeType}`);\n\t\t}\n\n\t\tif (\n\t\t\t!SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType) &&\n\t\t\tselectedLoader !== 'textLoader' &&\n\t\t\tselectedLoader !== 'auto'\n\t\t) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Unsupported mime type: ${mimeType} for selected loader: ${selectedLoader}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async getFilePathOrBlob(\n\t\tbinaryData: IBinaryData,\n\t\tmimeType: string,\n\t): Promise<string | Blob> {\n\t\tif (binaryData.id) {\n\t\t\tconst binaryBuffer = await this.context.helpers.binaryToBuffer(\n\t\t\t\tawait this.context.helpers.getBinaryStream(binaryData.id),\n\t\t\t);\n\t\t\treturn new Blob([binaryBuffer as BlobPart], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new Blob([Buffer.from(binaryData.data, BINARY_ENCODING)], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getLoader(\n\t\tmimeType: string,\n\t\tfilePathOrBlob: string | Blob,\n\t\titemIndex: number,\n\t): Promise<PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader> {\n\t\tswitch (mimeType) {\n\t\t\tcase 'application/pdf':\n\t\t\t\tconst splitPages = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}splitPages`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tfalse,\n\t\t\t\t) as boolean;\n\t\t\t\treturn new PDFLoader(filePathOrBlob, { splitPages });\n\t\t\tcase 'text/csv':\n\t\t\t\tconst column = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}column`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tnull,\n\t\t\t\t) as string;\n\t\t\t\tconst separator = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}separator`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t',',\n\t\t\t\t) as string;\n\t\t\t\treturn new CSVLoader(filePathOrBlob, { column: column ?? undefined, separator });\n\t\t\tcase 'application/epub+zip':\n\t\t\t\t// EPubLoader currently does not accept Blobs https://github.com/langchain-ai/langchainjs/issues/1623\n\t\t\t\tlet filePath: string;\n\t\t\t\tif (filePathOrBlob instanceof Blob) {\n\t\t\t\t\tconst tmpFileData = await tmpFile({ prefix: 'epub-loader-' });\n\t\t\t\t\tconst bufferData = await filePathOrBlob.arrayBuffer();\n\t\t\t\t\tawait pipeline([new Uint8Array(bufferData)], createWriteStream(tmpFileData.path));\n\t\t\t\t\treturn new EPubLoader(tmpFileData.path);\n\t\t\t\t} else {\n\t\t\t\t\tfilePath = filePathOrBlob;\n\t\t\t\t}\n\t\t\t\treturn new EPubLoader(filePath);\n\t\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n\t\t\t\treturn new DocxLoader(filePathOrBlob);\n\t\t\tcase 'text/plain':\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t\tcase 'application/json':\n\t\t\t\tconst pointers = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}pointers`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t'',\n\t\t\t\t) as string;\n\t\t\t\tconst pointersArray = pointers.split(',').map((pointer) => pointer.trim());\n\t\t\t\treturn new JSONLoader(filePathOrBlob, pointersArray);\n\t\t\tdefault:\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t}\n\t}\n\n\tprivate async loadDocuments(\n\t\tloader: PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader,\n\t): Promise<Document[]> {\n\t\treturn this.textSplitter\n\t\t\t? await this.textSplitter.splitDocuments(await loader.load())\n\t\t\t: await loader.load();\n\t}\n\n\tprivate async cleanupTmpFileIfNeeded(\n\t\tcleanupTmpFile: DirectoryResult['cleanup'] | undefined,\n\t): Promise<void> {\n\t\tif (cleanupTmpFile) {\n\t\t\tawait cleanupTmpFile();\n\t\t}\n\t}\n\n\tasync processItem(item: INodeExecutionData, itemIndex: number): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\t\tconst binaryMode = this.context.getNodeParameter('binaryMode', itemIndex, 'allInputData');\n\t\tif (binaryMode === 'allInputData') {\n\t\t\tconst binaryData = this.context.getInputData();\n\n\t\t\tfor (const data of binaryData) {\n\t\t\t\tif (data.binary) {\n\t\t\t\t\tconst binaryDataKeys = Object.keys(data.binary);\n\n\t\t\t\t\tfor (const fileKey of binaryDataKeys) {\n\t\t\t\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, fileKey);\n\t\t\t\t\t\tdocs.push(...processedDocuments);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, this.binaryDataKey);\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tasync processItemByKey(\n\t\titem: INodeExecutionData,\n\t\titemIndex: number,\n\t\tbinaryKey: string,\n\t): Promise<Document[]> {\n\t\tconst selectedLoader: keyof typeof SUPPORTED_MIME_TYPES = this.context.getNodeParameter(\n\t\t\t'loader',\n\t\t\titemIndex,\n\t\t\t'auto',\n\t\t) as keyof typeof SUPPORTED_MIME_TYPES;\n\n\t\tconst docs: Document[] = [];\n\t\tconst metadata = getMetadataFiltersValues(this.context, itemIndex);\n\n\t\tif (!item) return [];\n\n\t\tconst binaryData = this.context.helpers.assertBinaryData(itemIndex, binaryKey);\n\t\tconst { mimeType } = binaryData;\n\n\t\tawait this.validateMimeType(mimeType, selectedLoader);\n\n\t\tconst filePathOrBlob = await this.getFilePathOrBlob(binaryData, mimeType);\n\t\tconst cleanupTmpFile: DirectoryResult['cleanup'] | undefined = undefined;\n\t\tconst loader = await this.getLoader(mimeType, filePathOrBlob, itemIndex);\n\t\tconst loadedDoc = await this.loadDocuments(loader);\n\n\t\tdocs.push(...loadedDoc);\n\n\t\tif (metadata) {\n\t\t\tdocs.forEach((document) => {\n\t\t\t\tdocument.metadata = {\n\t\t\t\t\t...document.metadata,\n\t\t\t\t\t...metadata,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\tawait this.cleanupTmpFileIfNeeded(cleanupTmpFile);\n\n\t\treturn docs;\n\t}\n}\n"],"mappings":"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","names":["tmpFile"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n8n/n8n-nodes-langchain",
3
- "version": "1.110.0",
3
+ "version": "1.111.1",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -148,7 +148,7 @@
148
148
  "fast-glob": "3.2.12",
149
149
  "jest-mock-extended": "^3.0.4",
150
150
  "tsup": "^8.5.0",
151
- "n8n-core": "1.110.0"
151
+ "n8n-core": "1.111.0"
152
152
  },
153
153
  "dependencies": {
154
154
  "@aws-sdk/client-sso-oidc": "3.808.0",
@@ -164,7 +164,7 @@
164
164
  "@langchain/cohere": "0.3.4",
165
165
  "@langchain/community": "0.3.50",
166
166
  "@langchain/core": "0.3.68",
167
- "@langchain/google-genai": "0.2.13",
167
+ "@langchain/google-genai": "0.2.17",
168
168
  "@langchain/google-vertexai": "0.2.13",
169
169
  "@langchain/groq": "0.2.3",
170
170
  "@langchain/mistralai": "0.2.1",
@@ -197,7 +197,7 @@
197
197
  "ignore": "^5.2.0",
198
198
  "js-tiktoken": "^1.0.12",
199
199
  "jsdom": "23.0.1",
200
- "langchain": "0.3.30",
200
+ "langchain": "0.3.33",
201
201
  "lodash": "4.17.21",
202
202
  "mammoth": "1.7.2",
203
203
  "mime-types": "2.1.35",
@@ -216,11 +216,13 @@
216
216
  "zod": "3.25.67",
217
217
  "zod-to-json-schema": "3.23.3",
218
218
  "@n8n/client-oauth2": "0.29.0",
219
+ "@n8n/di": "0.9.0",
220
+ "@n8n/config": "1.55.0",
219
221
  "@n8n/errors": "^0.5.0",
222
+ "@n8n/typescript-config": "1.3.0",
223
+ "n8n-workflow": "1.109.0",
220
224
  "@n8n/json-schema-to-zod": "1.5.0",
221
- "n8n-workflow": "1.108.0",
222
- "n8n-nodes-base": "1.109.0",
223
- "@n8n/typescript-config": "1.3.0"
225
+ "n8n-nodes-base": "1.110.1"
224
226
  },
225
227
  "license": "SEE LICENSE IN LICENSE.md",
226
228
  "homepage": "https://n8n.io",