diff --git a/packages/@n8n/nodes-langchain/package.json b/packages/@n8n/nodes-langchain/package.json index 0eb74d0e50..fa89fe6cb5 100644 --- a/packages/@n8n/nodes-langchain/package.json +++ b/packages/@n8n/nodes-langchain/package.json @@ -195,7 +195,7 @@ "form-data": "catalog:", "generate-schema": "2.6.0", "html-to-text": "9.0.5", - "https-proxy-agent": "^7.0.6", + "https-proxy-agent": "catalog:", "jsdom": "23.0.1", "langchain": "0.3.11", "lodash": "catalog:", diff --git a/packages/core/package.json b/packages/core/package.json index 22dec528f3..db4ae647e1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -32,6 +32,7 @@ "@types/jsonwebtoken": "catalog:", "@types/lodash": "catalog:", "@types/mime-types": "^2.1.0", + "@types/proxy-from-env": "^1.0.4", "@types/uuid": "catalog:", "@types/xml2js": "catalog:" }, @@ -52,6 +53,8 @@ "fast-glob": "catalog:", "file-type": "16.5.4", "form-data": "catalog:", + "http-proxy-agent": "catalog:", + "https-proxy-agent": "catalog:", "iconv-lite": "catalog:", "jsonwebtoken": "catalog:", "lodash": "catalog:", @@ -63,6 +66,7 @@ "p-cancelable": "2.1.1", "picocolors": "catalog:", "pretty-bytes": "5.6.0", + "proxy-from-env": "^1.1.0", "qs": "6.11.0", "ssh2": "1.15.0", "uuid": "catalog:", diff --git a/packages/core/src/execution-engine/node-execution-context/utils/__tests__/request-helper-functions.test.ts b/packages/core/src/execution-engine/node-execution-context/utils/__tests__/request-helper-functions.test.ts index a8dcaf08aa..023f570229 100644 --- a/packages/core/src/execution-engine/node-execution-context/utils/__tests__/request-helper-functions.test.ts +++ b/packages/core/src/execution-engine/node-execution-context/utils/__tests__/request-helper-functions.test.ts @@ -1,5 +1,7 @@ import FormData from 'form-data'; -import type { Agent } from 'https'; +import { HttpProxyAgent } from 'http-proxy-agent'; +import { Agent } from 'https'; +import { HttpsProxyAgent } from 'https-proxy-agent'; import { mock } from 'jest-mock-extended'; import type { IHttpRequestMethods, @@ -19,6 +21,7 @@ import { applyPaginationRequestData, convertN8nRequestToAxios, createFormDataObject, + getAgentWithProxy, httpRequest, invokeAxios, parseRequestObject, @@ -28,7 +31,7 @@ import { describe('Request Helper Functions', () => { describe('proxyRequestToAxios', () => { - const baseUrl = 'http://example.de'; + const baseUrl = 'https://example.de'; const workflow = mock(); const hooks = mock(); const additionalData = mock({ hooks }); @@ -66,7 +69,7 @@ describe('Request Helper Functions', () => { expect(error.options).toMatchObject({ headers: { Accept: '*/*' }, method: 'get', - url: 'http://example.de/test', + url: 'https://example.de/test', }); expect(error.config).toBeUndefined(); expect(error.message).toEqual('403 - "Forbidden"'); @@ -165,7 +168,7 @@ describe('Request Helper Functions', () => { }); describe('invokeAxios', () => { - const baseUrl = 'http://example.de'; + const baseUrl = 'https://example.de'; beforeEach(() => { nock.cleanAll(); @@ -346,7 +349,11 @@ describe('Request Helper Functions', () => { const axiosOptions = await parseRequestObject(requestObject); expect(axiosOptions.beforeRedirect).toBeDefined; // eslint-disable-next-line @typescript-eslint/no-explicit-any - const redirectOptions: Record = { agents: {}, hostname: 'example.de' }; + const redirectOptions: Record = { + agents: {}, + hostname: 'example.de', + href: requestObject.uri, + }; axiosOptions.beforeRedirect!(redirectOptions, mock()); expect(redirectOptions.agent).toEqual(redirectOptions.agents.https); expect((redirectOptions.agent as Agent).options).toEqual({ @@ -862,4 +869,82 @@ describe('Request Helper Functions', () => { scope.done(); }); }); + + describe('getAgentWithProxy', () => { + const baseUrlHttps = 'https://example.com'; + const baseUrlHttp = 'http://example.com'; + const proxyUrlHttps = 'http://proxy-for-https.com:8080/'; + const proxyUrlHttp = 'http://proxy-for-http.com:8080/'; + + test('should return a regular agent when no proxy is set', async () => { + const { agent, protocol } = getAgentWithProxy({ + targetUrl: baseUrlHttps, + }); + expect(protocol).toEqual('https'); + expect(agent).toBeInstanceOf(Agent); + }); + + test('should use a proxyConfig object', async () => { + const { agent, protocol } = getAgentWithProxy({ + targetUrl: baseUrlHttps, + proxyConfig: { + host: 'proxy-for-https.com', + port: 8080, + }, + }); + expect(protocol).toEqual('https'); + expect((agent as HttpsProxyAgent).proxy.href).toEqual(proxyUrlHttps); + }); + + test('should use a proxyConfig string', async () => { + const { agent, protocol } = getAgentWithProxy({ + targetUrl: baseUrlHttps, + proxyConfig: proxyUrlHttps, + }); + expect(agent).toBeInstanceOf(HttpsProxyAgent); + expect(protocol).toEqual('https'); + expect((agent as HttpsProxyAgent).proxy.href).toEqual(proxyUrlHttps); + }); + + describe('environment variables', () => { + let originalEnv: NodeJS.ProcessEnv; + + beforeAll(() => { + originalEnv = { ...process.env }; + process.env.HTTP_PROXY = proxyUrlHttp; + process.env.HTTPS_PROXY = proxyUrlHttps; + process.env.NO_PROXY = 'should-not-proxy.com'; + }); + + afterAll(() => { + process.env = originalEnv; + }); + + test('should proxy http requests (HTTP_PROXY)', async () => { + const { agent, protocol } = getAgentWithProxy({ + targetUrl: baseUrlHttp, + }); + expect(protocol).toEqual('http'); + expect(agent).toBeInstanceOf(HttpProxyAgent); + expect((agent as HttpsProxyAgent).proxy.href).toEqual(proxyUrlHttp); + }); + + test('should proxy https requests (HTTPS_PROXY)', async () => { + const { agent, protocol } = getAgentWithProxy({ + targetUrl: baseUrlHttps, + }); + expect(protocol).toEqual('https'); + expect(agent).toBeInstanceOf(HttpsProxyAgent); + expect((agent as HttpsProxyAgent).proxy.href).toEqual(proxyUrlHttps); + }); + + test('should not proxy some hosts based on NO_PROXY', async () => { + const { agent, protocol } = getAgentWithProxy({ + targetUrl: 'https://should-not-proxy.com/foo', + }); + expect(protocol).toEqual('https'); + expect(agent).toBeInstanceOf(Agent); + }); + }); + }); }); diff --git a/packages/core/src/execution-engine/node-execution-context/utils/request-helper-functions.ts b/packages/core/src/execution-engine/node-execution-context/utils/request-helper-functions.ts index 366d8571ef..ea3e4b468f 100644 --- a/packages/core/src/execution-engine/node-execution-context/utils/request-helper-functions.ts +++ b/packages/core/src/execution-engine/node-execution-context/utils/request-helper-functions.ts @@ -20,11 +20,24 @@ import axios from 'axios'; import crypto, { createHmac } from 'crypto'; import FormData from 'form-data'; import { IncomingMessage } from 'http'; -import { Agent, type AgentOptions } from 'https'; +import { HttpProxyAgent } from 'http-proxy-agent'; +import { type AgentOptions, Agent as HttpsAgent } from 'https'; +import { Agent as HttpAgent } from 'https'; +import { HttpsProxyAgent } from 'https-proxy-agent'; import get from 'lodash/get'; import isEmpty from 'lodash/isEmpty'; import merge from 'lodash/merge'; import pick from 'lodash/pick'; +import { + NodeApiError, + NodeOperationError, + NodeSslError, + isObjectEmpty, + ExecutionBaseError, + jsonParse, + ApplicationError, + sleep, +} from 'n8n-workflow'; import type { GenericValue, IAdditionalCredentialOptions, @@ -49,21 +62,11 @@ import type { Workflow, WorkflowExecuteMode, } from 'n8n-workflow'; -import { - NodeApiError, - NodeOperationError, - NodeSslError, - isObjectEmpty, - ExecutionBaseError, - jsonParse, - ApplicationError, - sleep, -} from 'n8n-workflow'; import type { Token } from 'oauth-1.0a'; import clientOAuth1 from 'oauth-1.0a'; +import proxyFromEnv from 'proxy-from-env'; import { stringify } from 'qs'; import { Readable } from 'stream'; -import url, { URL, URLSearchParams } from 'url'; import type { IResponseError } from '@/interfaces'; @@ -81,15 +84,11 @@ axios.defaults.paramsSerializer = (params) => { } return stringify(params, { arrayFormat: 'indices' }); }; -axios.interceptors.request.use((config) => { - // If no content-type is set by us, prevent axios from force-setting the content-type to `application/x-www-form-urlencoded` - if (config.data === undefined) { - config.headers.setContentType(false, false); - } - return config; -}); +// Disable axios proxy, we handle it ourselves +// Axios proxy option has problems: https://github.com/axios/axios/issues/4531 +axios.defaults.proxy = false; -const validateUrl = (url?: string): boolean => { +function validateUrl(url?: string): boolean { if (!url) return false; try { @@ -98,8 +97,106 @@ const validateUrl = (url?: string): boolean => { } catch (error) { return false; } +} + +function getUrlFromProxyConfig(proxyConfig: IHttpRequestOptions['proxy'] | string): string | null { + if (typeof proxyConfig === 'string') { + if (!validateUrl(proxyConfig)) { + return null; + } + return proxyConfig; + } + + if (!proxyConfig?.host) { + return null; + } + + const { protocol, host, port, auth } = proxyConfig; + const safeProtocol = protocol?.endsWith(':') ? protocol.replace(':', '') : (protocol ?? 'http'); + + try { + const url = new URL(`${safeProtocol}://${host}`); + + if (port !== undefined) { + url.port = String(port); + } + + if (auth?.username) { + url.username = auth.username; + url.password = auth.password ?? ''; + } + + return url.href; + } catch (error) { + return null; + } +} + +function getTargetUrlFromAxiosConfig(axiosConfig: AxiosRequestConfig): string { + const { url, baseURL } = axiosConfig; + + try { + return new URL(url ?? '', baseURL).href; + } catch { + return ''; + } +} + +type AgentInfo = { protocol: 'http' | 'https'; agent: HttpAgent }; + +export function getAgentWithProxy({ + agentOptions, + proxyConfig, + targetUrl, +}: { + agentOptions?: AgentOptions; + proxyConfig?: IHttpRequestOptions['proxy'] | string; + targetUrl: string; +}): AgentInfo { + // If no proxy is set in config, use HTTP_PROXY/HTTPS_PROXY/ALL_PROXY from env depending on target URL + // Also respect NO_PROXY to disable the proxy for certain hosts + const proxyUrl = getUrlFromProxyConfig(proxyConfig) ?? proxyFromEnv.getProxyForUrl(targetUrl); + const protocol = targetUrl.startsWith('https://') ? 'https' : 'http'; + + if (proxyUrl) { + const ProxyAgent = protocol === 'http' ? HttpProxyAgent : HttpsProxyAgent; + return { protocol, agent: new ProxyAgent(proxyUrl, agentOptions) }; + } + + const Agent = protocol === 'http' ? HttpAgent : HttpsAgent; + return { protocol, agent: new Agent(agentOptions) }; +} + +const applyAgentToAxiosConfig = ( + config: AxiosRequestConfig, + { agent, protocol }: AgentInfo, +): AxiosRequestConfig => { + if (protocol === 'http') { + config.httpAgent = agent; + } else { + config.httpsAgent = agent; + } + + return config; }; +axios.interceptors.request.use((config) => { + // If no content-type is set by us, prevent axios from force-setting the content-type to `application/x-www-form-urlencoded` + if (config.data === undefined) { + config.headers.setContentType(false, false); + } + + if (!config.httpsAgent && !config.httpAgent) { + const agent = getAgentWithProxy({ + targetUrl: getTargetUrlFromAxiosConfig(config), + }); + + applyAgentToAxiosConfig(config, agent); + } + + return config; +}); + function searchForHeader(config: AxiosRequestConfig, headerName: string) { if (config.headers === undefined) { return undefined; @@ -126,17 +223,30 @@ const getHostFromRequestObject = ( }; const getBeforeRedirectFn = - (agentOptions: AgentOptions, axiosConfig: AxiosRequestConfig) => + ( + agentOptions: AgentOptions, + axiosConfig: AxiosRequestConfig, + proxyConfig: IHttpRequestOptions['proxy'] | string | undefined, + ) => // eslint-disable-next-line @typescript-eslint/no-explicit-any (redirectedRequest: Record) => { - const redirectAgent = new Agent({ + const redirectAgentOptions = { ...agentOptions, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment servername: redirectedRequest.hostname, + }; + const redirectAgent = getAgentWithProxy({ + agentOptions: redirectAgentOptions, + proxyConfig, + targetUrl: redirectedRequest.href, }); - redirectedRequest.agent = redirectAgent; - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - redirectedRequest.agents.https = redirectAgent; + + redirectedRequest.agent = redirectAgent.agent; + if (redirectAgent.protocol === 'http') { + redirectedRequest.agents.http = redirectAgent.agent; + } else { + redirectedRequest.agents.https = redirectAgent.agent; + } if (axiosConfig.headers?.Authorization) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access @@ -171,8 +281,8 @@ function digestAuthAxiosConfig( .createHash('md5') .update(`${auth?.username as string}:${realm}:${auth?.password as string}`) .digest('hex'); - const urlURL = new url.URL(axios.getUri(axiosConfig)); - const path = urlURL.pathname + urlURL.search; + const url = new URL(axios.getUri(axiosConfig)); + const path = url.pathname + url.search; const ha2 = crypto .createHash('md5') .update(`${axiosConfig.method ?? 'GET'}:${path}`) @@ -511,77 +621,19 @@ export async function parseRequestObject(requestObject: IRequestOptions) { agentOptions.secureOptions = crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT; } - axiosConfig.httpsAgent = new Agent(agentOptions); - - axiosConfig.beforeRedirect = getBeforeRedirectFn(agentOptions, axiosConfig); - if (requestObject.timeout !== undefined) { axiosConfig.timeout = requestObject.timeout; } - if (requestObject.proxy !== undefined) { - // try our best to parse the url provided. - if (typeof requestObject.proxy === 'string') { - try { - const url = new URL(requestObject.proxy); - // eslint-disable-next-line @typescript-eslint/no-shadow - const host = url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname; - axiosConfig.proxy = { - host, - port: parseInt(url.port, 10), - protocol: url.protocol, - }; - if (!url.port) { - // Sets port to a default if not informed - if (url.protocol === 'http') { - axiosConfig.proxy.port = 80; - } else if (url.protocol === 'https') { - axiosConfig.proxy.port = 443; - } - } - if (url.username || url.password) { - axiosConfig.proxy.auth = { - username: url.username, - password: url.password, - }; - } - } catch (error) { - // Not a valid URL. We will try to simply parse stuff - // such as user:pass@host:port without protocol (we'll assume http) - if (requestObject.proxy.includes('@')) { - const [userpass, hostport] = requestObject.proxy.split('@'); - const [username, password] = userpass.split(':'); - const [hostname, port] = hostport.split(':'); - // eslint-disable-next-line @typescript-eslint/no-shadow - const host = hostname.startsWith('[') ? hostname.slice(1, -1) : hostname; - axiosConfig.proxy = { - host, - port: parseInt(port, 10), - protocol: 'http', - auth: { - username, - password, - }, - }; - } else if (requestObject.proxy.includes(':')) { - const [hostname, port] = requestObject.proxy.split(':'); - axiosConfig.proxy = { - host: hostname, - port: parseInt(port, 10), - protocol: 'http', - }; - } else { - axiosConfig.proxy = { - host: requestObject.proxy, - port: 80, - protocol: 'http', - }; - } - } - } else { - axiosConfig.proxy = requestObject.proxy; - } - } + const agent = getAgentWithProxy({ + agentOptions, + proxyConfig: requestObject.proxy, + targetUrl: getTargetUrlFromAxiosConfig(axiosConfig), + }); + + applyAgentToAxiosConfig(axiosConfig, agent); + + axiosConfig.beforeRedirect = getBeforeRedirectFn(agentOptions, axiosConfig, requestObject.proxy); if (requestObject.useStream) { axiosConfig.responseType = 'stream'; @@ -730,7 +782,6 @@ export function convertN8nRequestToAxios(n8nRequest: IHttpRequestOptions): Axios method, timeout, auth, - proxy, url, maxBodyLength: Infinity, maxContentLength: Infinity, @@ -762,9 +813,14 @@ export function convertN8nRequestToAxios(n8nRequest: IHttpRequestOptions): Axios if (n8nRequest.skipSslCertificateValidation === true) { agentOptions.rejectUnauthorized = false; } - axiosRequest.httpsAgent = new Agent(agentOptions); + const agent = getAgentWithProxy({ + agentOptions, + proxyConfig: proxy, + targetUrl: getTargetUrlFromAxiosConfig(axiosRequest), + }); + applyAgentToAxiosConfig(axiosRequest, agent); - axiosRequest.beforeRedirect = getBeforeRedirectFn(agentOptions, axiosRequest); + axiosRequest.beforeRedirect = getBeforeRedirectFn(agentOptions, axiosRequest, n8nRequest.proxy); if (n8nRequest.arrayFormat !== undefined) { axiosRequest.paramsSerializer = (params) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c6dbc5da9..4221a4ea76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,6 +63,12 @@ catalogs: form-data: specifier: 4.0.0 version: 4.0.0 + http-proxy-agent: + specifier: 7.0.2 + version: 7.0.2 + https-proxy-agent: + specifier: 7.0.6 + version: 7.0.6 iconv-lite: specifier: 0.6.3 version: 0.6.3 @@ -760,7 +766,7 @@ importers: version: 4.3.0 '@getzep/zep-cloud': specifier: 1.0.12 - version: 1.0.12(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(6e4aa47666b8dfceb9beddf0b146b9ac)) + version: 1.0.12(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(2ecef5dd5ce3e0c6dee7163d14def631)) '@getzep/zep-js': specifier: 0.9.0 version: 0.9.0 @@ -787,7 +793,7 @@ importers: version: 0.3.2(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) '@langchain/community': specifier: 'catalog:' - version: 0.3.24(8d6d0c7c173d79d9dc61e6a9334e3ecc) + version: 0.3.24(a7747bc06767d45b4fc71d69250d6ec9) '@langchain/core': specifier: 'catalog:' version: 0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) @@ -885,14 +891,14 @@ importers: specifier: 9.0.5 version: 9.0.5 https-proxy-agent: - specifier: ^7.0.6 + specifier: 'catalog:' version: 7.0.6 jsdom: specifier: 23.0.1 version: 23.0.1 langchain: specifier: 0.3.11 - version: 0.3.11(6e4aa47666b8dfceb9beddf0b146b9ac) + version: 0.3.11(2ecef5dd5ce3e0c6dee7163d14def631) lodash: specifier: 'catalog:' version: 4.17.21 @@ -1544,6 +1550,12 @@ importers: form-data: specifier: 'catalog:' version: 4.0.0 + http-proxy-agent: + specifier: 'catalog:' + version: 7.0.2 + https-proxy-agent: + specifier: 'catalog:' + version: 7.0.6 iconv-lite: specifier: 'catalog:' version: 0.6.3 @@ -1577,6 +1589,9 @@ importers: pretty-bytes: specifier: 5.6.0 version: 5.6.0 + proxy-from-env: + specifier: ^1.1.0 + version: 1.1.0 qs: specifier: 6.11.0 version: 6.11.0 @@ -1611,6 +1626,9 @@ importers: '@types/mime-types': specifier: ^2.1.0 version: 2.1.1 + '@types/proxy-from-env': + specifier: ^1.0.4 + version: 1.0.4 '@types/uuid': specifier: 'catalog:' version: 10.0.0 @@ -6707,6 +6725,9 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/proxy-from-env@1.0.4': + resolution: {integrity: sha512-TPR9/bCZAr3V1eHN4G3LD3OLicdJjqX1QRXWuNcCYgE66f/K8jO2ZRtHxI2D9MbnuUP6+qiKSS8eUHp6TFHGCw==} + '@types/psl@1.1.0': resolution: {integrity: sha512-HhZnoLAvI2koev3czVPzBNRYvdrzJGLjQbWZhqFmS9Q6a0yumc5qtfSahBGb5g+6qWvA8iiQktqGkwoIXa/BNQ==} @@ -7269,10 +7290,6 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -9764,6 +9781,10 @@ packages: resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} engines: {node: '>= 14'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http-signature@1.4.0: resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} @@ -16731,7 +16752,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 @@ -16796,7 +16817,7 @@ snapshots: '@gar/promisify@1.1.3': optional: true - '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(6e4aa47666b8dfceb9beddf0b146b9ac))': + '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(2ecef5dd5ce3e0c6dee7163d14def631))': dependencies: form-data: 4.0.0 node-fetch: 2.7.0(encoding@0.1.13) @@ -16805,7 +16826,7 @@ snapshots: zod: 3.24.1 optionalDependencies: '@langchain/core': 0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) - langchain: 0.3.11(6e4aa47666b8dfceb9beddf0b146b9ac) + langchain: 0.3.11(2ecef5dd5ce3e0c6dee7163d14def631) transitivePeerDependencies: - encoding @@ -16895,7 +16916,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -17329,7 +17350,7 @@ snapshots: - aws-crt - encoding - '@langchain/community@0.3.24(8d6d0c7c173d79d9dc61e6a9334e3ecc)': + '@langchain/community@0.3.24(a7747bc06767d45b4fc71d69250d6ec9)': dependencies: '@browserbasehq/stagehand': 1.9.0(@playwright/test@1.49.1)(deepmerge@4.3.1)(dotenv@16.5.0)(encoding@0.1.13)(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))(zod@3.24.1) '@ibm-cloud/watsonx-ai': 1.1.2 @@ -17340,7 +17361,7 @@ snapshots: flat: 5.0.2 ibm-cloud-sdk-core: 5.3.2 js-yaml: 4.1.0 - langchain: 0.3.11(6e4aa47666b8dfceb9beddf0b146b9ac) + langchain: 0.3.11(2ecef5dd5ce3e0c6dee7163d14def631) langsmith: 0.2.15(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) openai: 4.78.1(encoding@0.1.13)(zod@3.24.1) uuid: 10.0.0 @@ -17355,7 +17376,7 @@ snapshots: '@aws-sdk/credential-provider-node': 3.808.0 '@azure/storage-blob': 12.26.0 '@browserbasehq/sdk': 2.6.0(encoding@0.1.13) - '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(6e4aa47666b8dfceb9beddf0b146b9ac)) + '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(2ecef5dd5ce3e0c6dee7163d14def631)) '@getzep/zep-js': 0.9.0 '@google-ai/generativelanguage': 2.6.0(encoding@0.1.13) '@google-cloud/storage': 7.12.1(encoding@0.1.13) @@ -19816,6 +19837,10 @@ snapshots: '@types/prop-types@15.7.14': {} + '@types/proxy-from-env@1.0.4': + dependencies: + '@types/node': 20.17.57 + '@types/psl@1.1.0': {} '@types/qs@6.9.15': {} @@ -20037,7 +20062,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.8.2) '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.8.2) - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.0.1(typescript@5.8.2) optionalDependencies: @@ -20068,7 +20093,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -20126,7 +20151,7 @@ snapshots: '@typespec/ts-http-runtime@0.2.2': dependencies: - http-proxy-agent: 7.0.0 + http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 tslib: 2.8.1 transitivePeerDependencies: @@ -20544,17 +20569,11 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - agent-base@7.1.3: {} agentkeepalive@4.2.1: dependencies: - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) depd: 1.1.2 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -20874,6 +20893,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.9.0: + dependencies: + follow-redirects: 1.15.9(debug@4.3.6) + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axios@1.9.0(debug@4.3.6): dependencies: follow-redirects: 1.15.9(debug@4.3.6) @@ -20892,7 +20919,7 @@ snapshots: axios@1.9.0(debug@4.4.1): dependencies: - follow-redirects: 1.15.9(debug@4.3.6) + follow-redirects: 1.15.9(debug@4.4.1) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -23024,7 +23051,7 @@ snapshots: '@babel/parser': 7.26.10 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) acorn-walk: 8.3.4 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 simple-bin-help: 1.8.0 transitivePeerDependencies: @@ -23062,6 +23089,10 @@ snapshots: optionalDependencies: debug: 4.4.0 + follow-redirects@1.15.9(debug@4.4.1): + optionalDependencies: + debug: 4.4.1(supports-color@8.1.1) + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -23616,7 +23647,14 @@ snapshots: http-proxy-agent@7.0.0: dependencies: - agent-base: 7.1.0 + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -23646,7 +23684,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -23675,7 +23713,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.9.0(debug@4.4.1)) + retry-axios: 2.6.0(axios@1.9.0) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -23740,7 +23778,7 @@ snapshots: infisical-node@1.3.0: dependencies: - axios: 1.9.0(debug@4.4.1) + axios: 1.9.0 dotenv: 16.3.1 tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 @@ -24665,7 +24703,7 @@ snapshots: kuler@2.0.0: {} - langchain@0.3.11(6e4aa47666b8dfceb9beddf0b146b9ac): + langchain@0.3.11(2ecef5dd5ce3e0c6dee7163d14def631): dependencies: '@langchain/core': 0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) '@langchain/openai': 0.3.17(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) @@ -24689,7 +24727,7 @@ snapshots: '@langchain/groq': 0.1.3(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) '@langchain/mistralai': 0.2.0(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))) '@langchain/ollama': 0.1.4(@langchain/core@0.3.48(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))) - axios: 1.9.0(debug@4.4.1) + axios: 1.9.0 cheerio: 1.0.0 handlebars: 4.7.8 transitivePeerDependencies: @@ -26487,7 +26525,7 @@ snapshots: posthog-node@3.2.1: dependencies: - axios: 1.9.0(debug@4.4.1) + axios: 1.9.0 rusha: 0.8.14 transitivePeerDependencies: - debug @@ -27064,9 +27102,9 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-axios@2.6.0(axios@1.9.0(debug@4.4.1)): + retry-axios@2.6.0(axios@1.9.0): dependencies: - axios: 1.9.0(debug@4.4.1) + axios: 1.9.0 retry-request@7.0.2(encoding@0.1.13): dependencies: @@ -27528,7 +27566,7 @@ snapshots: asn1.js: 5.4.1 asn1.js-rfc2560: 5.0.1(asn1.js@5.4.1) asn1.js-rfc5280: 3.0.0 - axios: 1.9.0(debug@4.4.1) + axios: 1.9.0 big-integer: 1.6.52 bignumber.js: 9.1.2 binascii: 0.0.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3e1635ca80..9e9d370f6b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -21,6 +21,8 @@ catalog: fast-glob: 3.2.12 flatted: 3.2.7 form-data: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 iconv-lite: 0.6.3 jsonwebtoken: 9.0.2 js-base64: 3.7.2