From ebe91b668f8efe6747628c7dfdf71aa9ccd1c35a Mon Sep 17 00:00:00 2001 From: redanthrax Date: Sat, 24 Oct 2026 08:35:33 -0700 Subject: [PATCH] chore(security): query OSV for malicious packages in supply chain check The static blocklist only covered the May 2026 Mini Shai-Hulud wave. The check now asks OSV for MAL- records on every locked package (fails closed; SUPPLY_CHAIN_OFFLINE=1 skips it), and clears current audit/OSV findings in dev-only dependencies. --- SECURITY.md | 9 +- osv-scanner.toml | 11 +++ pnpm-lock.yaml | 165 +++++++++++++++++---------------- pnpm-workspace.yaml | 7 +- scripts/check-supply-chain.mjs | 90 +++++++++++++++++- 5 files changed, 191 insertions(+), 91 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index cb31fd0..9b6bbfe 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,7 +10,7 @@ This repository uses defenses against npm supply-chain worms such as **Mini Shai - **Frozen lockfile** — `pnpm-lock.yaml` is committed; CI uses `pnpm install --frozen-lockfile`. - **pnpm workspace config** — supply-chain settings live in `pnpm-workspace.yaml` (pnpm 10+ ignores `package.json` → `pnpm`). - **Blocked install scripts** — only packages in `pnpm-workspace.yaml` → `onlyBuiltDependencies` may run lifecycle scripts (currently `isolated-vm` for dev tooling). Other packages with scripts are listed in `ignoredBuiltDependencies` (e.g. `unrs-resolver`, `eslint-plugin-n8n-nodes-base`). `strictDepBuilds: true` fails on unreviewed scripts. -- **Blocklist scan** — `pnpm run audit:supply-chain` checks the lockfile against `security/compromised-packages.json` and validates pnpm config. +- **Blocklist scan** — `pnpm run audit:supply-chain` checks the lockfile against `security/compromised-packages.json`, queries [OSV](https://osv.dev) for malicious-package (`MAL-`) records on every locked package, and validates pnpm config. The OSV query needs network access and fails closed; set `SUPPLY_CHAIN_OFFLINE=1` to run with the static blocklist only. - **Delayed updates** — `minimumReleaseAge` (24h, strict) reduces exposure to freshly published malicious versions. - **No exotic transitive deps** — `blockExoticSubdeps` blocks git/tarball transitive resolutions. - **Version overrides** — CVE mitigations use **exact pins** in `pnpm-workspace.yaml` (e.g. `lodash`, `uuid`, `minimatch`). Do not use `>=`/`^`/`~` ranges in overrides; bump versions deliberately with an updated lockfile and passing audit. @@ -56,9 +56,10 @@ Check for persistence artifacts: `.claude/router_runtime.js`, malicious `.vscode ### Blocklist maintenance -- Full Mini Shai-Hulud package list: `security/compromised-packages-blocklist.json` (172 packages). +- Malicious versions from new campaigns (e.g. the August 2026 keyv/cacheable "ChainDrop" worm) are picked up automatically through the OSV query; no list update is needed for those. +- Offline fallback list (May 2026 Mini Shai-Hulud only): `security/compromised-packages-blocklist.json` (172 packages). - IOC strings and metadata: `security/compromised-packages.json`. -- After new advisories, update the blocklist JSON and run `pnpm run audit:supply-chain`. +- Add lockfile IOC strings for new campaigns to `lockfileIndicators`, then run `pnpm run audit:supply-chain`. ### Reporting vulnerabilities @@ -66,4 +67,4 @@ Email **red@4c.gg** or open a private security advisory on GitHub. Do not file p ### Updating the blocklist -After new campaign advisories, extend `security/compromised-packages.json` and re-run `pnpm run audit:supply-chain`. +Compromised versions are covered by the OSV query. After new campaign advisories, add any lockfile IOC strings to `security/compromised-packages.json` and re-run `pnpm run audit:supply-chain`. diff --git a/osv-scanner.toml b/osv-scanner.toml index a6be5a7..7d83559 100644 --- a/osv-scanner.toml +++ b/osv-scanner.toml @@ -15,3 +15,14 @@ own build glob patterns. Not overridable: no patched braces release exists. Also ignored for pnpm audit via auditConfig.ignoreGhsas in pnpm-workspace.yaml. Drop both entries once braces publishes a fix. """ + +[[IgnoredVulns]] +id = "GHSA-mrhx-c7xc-m3w5" +ignoreUntil = 2027-01-24 +reason = """ +zod <4.6.6 (memory exhaustion on oversized constrained collections). zod 3.x is a +dev-only peer of n8n-workflow, never shipped (package.json "files" excludes it), and +n8n-workflow still requires zod 3, for which no patched release exists. +Also ignored for pnpm audit via auditConfig.ignoreGhsas in pnpm-workspace.yaml. +Drop both entries once n8n-workflow moves to zod >=4.6.6. +""" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a759ca..171e17e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,7 +14,8 @@ overrides: axios: 1.20.0 qs: 6.16.0 handlebars: 4.7.10 - stream-json: 3.6.0 + stream-json: 3.7.0 + zod@4: 4.6.7 n8n-workflow: 2.22.3 importers: @@ -23,10 +24,10 @@ importers: devDependencies: '@n8n/eslint-plugin-community-nodes': specifier: 0.36.0 - version: 0.36.0(eslint@10.13.0)(n8n-workflow@2.22.3(zod@4.4.3))(typescript@6.0.3) + version: 0.36.0(eslint@10.13.0)(n8n-workflow@2.22.3(zod@4.6.7))(typescript@6.0.3) '@n8n/node-cli': specifier: 0.53.1 - version: 0.53.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(@typescript-eslint/utils@8.71.2(eslint@10.13.0)(typescript@6.0.3))(eslint@10.13.0)(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(n8n-workflow@2.22.3(zod@4.4.3))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(playwright@1.60.0)(typescript@6.0.3)(ws@8.22.0) + version: 0.53.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(@typescript-eslint/utils@8.71.2(eslint@10.13.0)(typescript@6.0.3))(eslint@10.13.0)(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(n8n-workflow@2.22.3(zod@4.6.7))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(playwright@1.60.0)(typescript@6.0.3)(ws@8.22.0) '@types/node': specifier: 26.6.5 version: 26.6.5 @@ -41,7 +42,7 @@ importers: version: 5.0.1 n8n-workflow: specifier: 2.22.3 - version: 2.22.3(zod@4.4.3) + version: 2.22.3(zod@4.6.7) prettier: specifier: 3.9.10 version: 3.9.10 @@ -600,7 +601,7 @@ packages: engines: {node: '>=18'} peerDependencies: '@langchain/core': ^1.1.48 - zod: ^3.25.32 || ^4.2.0 + zod: 4.6.7 '@langchain/openai@1.4.1': resolution: {integrity: sha512-jaHk4TnLqWrQ1KYmavvwCImW6x8pBy6LLTK73tzSMg7HBLbq0g/l7EkpMcxZWDOvyufuCXUqO2bj47apcOhw6Q==} @@ -2283,7 +2284,7 @@ packages: '@smithy/hash-node': '>=4.3.0 <5' '@smithy/signature-v4': '>=5.4.0 <6' ws: ^8.18.0 - zod: ^3.25 || ^4.0 + zod: 4.6.7 peerDependenciesMeta: '@aws-sdk/credential-provider-node': optional: true @@ -2636,8 +2637,8 @@ packages: stream-exhaust@1.0.2: resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} - stream-json@3.6.0: - resolution: {integrity: sha512-NiJdqxKyau579z/E8vfqcjWfSDWxW/AT99javFXdPXF147Z5za85LRXSHEmSX9TKOakB7gaIccfD0fOIctb7KQ==} + stream-json@3.7.0: + resolution: {integrity: sha512-rCSBdcBP/bPk6T8QFcxAj1MSzAuc5i49cYW6IE7sYObNEPccBJIUiL6fU9c9BWt40aJK0siVynLX7lWaW8alXw==} streamx@2.25.0: resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} @@ -2955,13 +2956,13 @@ packages: zod-to-json-schema@3.25.2: resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: - zod: ^3.25.28 || ^4 + zod: 4.6.7 zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} snapshots: @@ -2996,17 +2997,17 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3)': + '@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7)': dependencies: '@anthropic-ai/sdk': 0.27.3 '@browserbasehq/sdk': 2.22.0 '@playwright/test': 1.60.0 deepmerge: 4.3.1 dotenv: 16.4.5 - openai: 6.49.0(ws@8.22.0)(zod@4.4.3) + openai: 6.49.0(ws@8.22.0)(zod@4.6.7) ws: 8.22.0 - zod: 4.4.3 - zod-to-json-schema: 3.25.2(zod@4.4.3) + zod: 4.6.7 + zod-to-json-schema: 3.25.2(zod@4.6.7) transitivePeerDependencies: - bufferutil - encoding @@ -3134,20 +3135,20 @@ snapshots: '@keyv/serialize@1.1.1': {} - '@langchain/classic@1.0.27(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0)': + '@langchain/classic@1.0.27(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0)': dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) - '@langchain/openai': 1.4.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(ws@8.22.0) - '@langchain/textsplitters': 1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0)) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) + '@langchain/openai': 1.4.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(ws@8.22.0) + '@langchain/textsplitters': 1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0)) handlebars: 4.7.10 js-yaml: 4.3.2 jsonpointer: 5.0.1 openapi-types: 12.1.3 uuid: 11.1.1 yaml: 2.9.1 - zod: 4.4.3 + zod: 4.6.7 optionalDependencies: - langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - '@opentelemetry/api' @@ -3158,22 +3159,22 @@ snapshots: - openai - ws - '@langchain/community@1.1.27(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(lodash@4.18.1)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(pdf-parse@2.4.5)(playwright@1.60.0)(ws@8.22.0)': + '@langchain/community@1.1.27(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(lodash@4.18.1)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(pdf-parse@2.4.5)(playwright@1.60.0)(ws@8.22.0)': dependencies: - '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3) + '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7) '@ibm-cloud/watsonx-ai': 1.7.13 - '@langchain/classic': 1.0.27(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) - '@langchain/openai': 1.4.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(ws@8.22.0) + '@langchain/classic': 1.0.27(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) + '@langchain/openai': 1.4.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(ws@8.22.0) binary-extensions: 2.3.0 flat: 5.0.2 ibm-cloud-sdk-core: 5.4.20 js-yaml: 4.3.2 - langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) math-expression-evaluator: 2.0.7 - openai: 6.49.0(ws@8.22.0)(zod@4.4.3) + openai: 6.49.0(ws@8.22.0)(zod@4.6.7) uuid: 11.1.1 - zod: 4.4.3 + zod: 4.6.7 optionalDependencies: '@browserbasehq/sdk': 2.22.0 ignore: 7.0.12 @@ -3189,15 +3190,15 @@ snapshots: - '@smithy/hash-node' - peggy - '@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0)': + '@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0)': dependencies: '@cfworker/json-schema': 4.1.1 '@standard-schema/spec': 1.1.0 js-tiktoken: 1.0.21 - langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) mustache: 4.2.0 p-queue: 6.6.2 - zod: 4.4.3 + zod: 4.6.7 transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' @@ -3205,48 +3206,48 @@ snapshots: - openai - ws - '@langchain/langgraph-checkpoint@1.2.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))': + '@langchain/langgraph-checkpoint@1.2.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))': dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) - '@langchain/langgraph-sdk@1.12.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))': + '@langchain/langgraph-sdk@1.12.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))': dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) '@langchain/protocol': 0.0.19 '@types/json-schema': 7.0.15 p-queue: 9.3.5 p-retry: 7.1.1 - '@langchain/langgraph@1.5.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(zod@4.4.3)': + '@langchain/langgraph@1.5.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(zod@4.6.7)': dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) - '@langchain/langgraph-checkpoint': 1.2.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0)) - '@langchain/langgraph-sdk': 1.12.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0)) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) + '@langchain/langgraph-checkpoint': 1.2.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0)) + '@langchain/langgraph-sdk': 1.12.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0)) '@langchain/protocol': 0.0.19 '@standard-schema/spec': 1.1.0 - zod: 4.4.3 + zod: 4.6.7 transitivePeerDependencies: - react - react-dom - '@langchain/openai@1.4.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(ws@8.22.0)': + '@langchain/openai@1.4.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(ws@8.22.0)': dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) js-tiktoken: 1.0.21 - openai: 6.49.0(ws@8.22.0)(zod@4.4.3) - zod: 4.4.3 + openai: 6.49.0(ws@8.22.0)(zod@4.6.7) + zod: 4.6.7 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - '@smithy/hash-node' - '@smithy/signature-v4' - ws - '@langchain/openai@1.4.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(ws@8.22.0)': + '@langchain/openai@1.4.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(ws@8.22.0)': dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) js-tiktoken: 1.0.21 - openai: 6.49.0(ws@8.22.0)(zod@4.4.3) - zod: 4.4.3 + openai: 6.49.0(ws@8.22.0)(zod@4.6.7) + zod: 4.6.7 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - '@smithy/hash-node' @@ -3255,14 +3256,14 @@ snapshots: '@langchain/protocol@0.0.19': {} - '@langchain/textsplitters@1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))': + '@langchain/textsplitters@1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))': dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) js-tiktoken: 1.0.21 - '@n8n/ai-node-sdk@0.34.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(playwright@1.60.0)(ws@8.22.0)': + '@n8n/ai-node-sdk@0.34.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(playwright@1.60.0)(ws@8.22.0)': dependencies: - '@n8n/ai-utilities': 0.37.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(playwright@1.60.0)(ws@8.22.0) + '@n8n/ai-utilities': 0.37.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(playwright@1.60.0)(ws@8.22.0) transitivePeerDependencies: - '@arcjet/redact' - '@aws-crypto/sha256-js' @@ -3394,20 +3395,20 @@ snapshots: - ws - youtubei.js - '@n8n/ai-utilities@0.37.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(playwright@1.60.0)(ws@8.22.0)': + '@n8n/ai-utilities@0.37.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(playwright@1.60.0)(ws@8.22.0)': dependencies: - '@langchain/classic': 1.0.27(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) - '@langchain/community': 1.1.27(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(lodash@4.18.1)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(pdf-parse@2.4.5)(playwright@1.60.0)(ws@8.22.0) - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) - '@langchain/openai': 1.4.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(ws@8.22.0) - '@langchain/textsplitters': 1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0)) + '@langchain/classic': 1.0.27(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) + '@langchain/community': 1.1.27(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(lodash@4.18.1)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(pdf-parse@2.4.5)(playwright@1.60.0)(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) + '@langchain/openai': 1.4.4(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(ws@8.22.0) + '@langchain/textsplitters': 1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0)) '@n8n/api-types': 1.44.1(zod@3.25.76) '@n8n/backend-network': 1.18.1 '@n8n/typescript-config': 1.12.0 '@n8n/utils': 1.51.0 '@thednp/dommatrix': 3.1.2 js-tiktoken: 1.0.21 - langchain: 1.2.30(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + langchain: 1.2.30(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) lodash: 4.18.1 n8n-workflow: 2.22.3(zod@3.25.76) pdf-parse: 2.4.5 @@ -3568,7 +3569,7 @@ snapshots: logform: 2.6.1 n8n-workflow: 2.22.3(zod@3.25.76) picocolors: 1.0.1 - stream-json: 3.6.0 + stream-json: 3.7.0 winston: 3.14.2 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -3624,14 +3625,14 @@ snapshots: dependencies: callsites: 3.1.0 - '@n8n/eslint-plugin-community-nodes@0.36.0(eslint@10.13.0)(n8n-workflow@2.22.3(zod@4.4.3))(typescript@6.0.3)': + '@n8n/eslint-plugin-community-nodes@0.36.0(eslint@10.13.0)(n8n-workflow@2.22.3(zod@4.6.7))(typescript@6.0.3)': dependencies: '@n8n/utils': 1.51.0 '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) '@typescript-eslint/utils': 8.70.0(eslint@10.13.0)(typescript@6.0.3) eslint: 10.13.0 fastest-levenshtein: 1.0.16 - n8n-workflow: 2.22.3(zod@4.4.3) + n8n-workflow: 2.22.3(zod@4.6.7) transitivePeerDependencies: - supports-color - typescript @@ -3650,12 +3651,12 @@ snapshots: title-case: 3.0.3 transliteration: 2.3.5 - '@n8n/node-cli@0.53.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(@typescript-eslint/utils@8.71.2(eslint@10.13.0)(typescript@6.0.3))(eslint@10.13.0)(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(n8n-workflow@2.22.3(zod@4.4.3))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(playwright@1.60.0)(typescript@6.0.3)(ws@8.22.0)': + '@n8n/node-cli@0.53.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(@typescript-eslint/utils@8.71.2(eslint@10.13.0)(typescript@6.0.3))(eslint@10.13.0)(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(n8n-workflow@2.22.3(zod@4.6.7))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(playwright@1.60.0)(typescript@6.0.3)(ws@8.22.0)': dependencies: '@clack/prompts': 0.11.0 '@eslint/js': 9.39.5 - '@n8n/ai-node-sdk': 0.34.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(zod@4.4.3))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(playwright@1.60.0)(ws@8.22.0) - '@n8n/eslint-plugin-community-nodes': 0.36.0(eslint@10.13.0)(n8n-workflow@2.22.3(zod@4.4.3))(typescript@6.0.3) + '@n8n/ai-node-sdk': 0.34.1(@browserbasehq/sdk@2.22.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.60.0)(deepmerge@4.3.1)(dotenv@16.4.5)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(zod@4.6.7))(@ibm-cloud/watsonx-ai@1.7.13)(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(ibm-cloud-sdk-core@5.4.20)(ignore@7.0.12)(jsonwebtoken@9.0.3)(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(playwright@1.60.0)(ws@8.22.0) + '@n8n/eslint-plugin-community-nodes': 0.36.0(eslint@10.13.0)(n8n-workflow@2.22.3(zod@4.6.7))(typescript@6.0.3) '@oclif/core': 4.14.0 change-case: 5.4.4 eslint: 10.13.0 @@ -5231,14 +5232,14 @@ snapshots: kuler@2.0.0: {} - langchain@1.2.30(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0): + langchain@1.2.30(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0): dependencies: - '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) - '@langchain/langgraph': 1.5.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0))(zod@4.4.3) - '@langchain/langgraph-checkpoint': 1.2.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0)) - langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0) + '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) + '@langchain/langgraph': 1.5.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0))(zod@4.6.7) + '@langchain/langgraph-checkpoint': 1.2.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0)) + langsmith: 0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0) uuid: 11.1.1 - zod: 4.4.3 + zod: 4.6.7 transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' @@ -5248,13 +5249,13 @@ snapshots: - react-dom - ws - langsmith@0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.4.3))(ws@8.22.0): + langsmith@0.11.0(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.49.0(ws@8.22.0)(zod@4.6.7))(ws@8.22.0): dependencies: p-queue: 6.6.2 optionalDependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) - openai: 6.49.0(ws@8.22.0)(zod@4.4.3) + openai: 6.49.0(ws@8.22.0)(zod@4.6.7) ws: 8.22.0 last-run@2.0.0: {} @@ -5394,7 +5395,7 @@ snapshots: xml2js: 0.6.2 zod: 3.25.76 - n8n-workflow@2.22.3(zod@4.4.3): + n8n-workflow@2.22.3(zod@4.6.7): dependencies: '@n8n/errors': 0.8.0 '@n8n/expression-runtime': 0.14.2 @@ -5415,7 +5416,7 @@ snapshots: transliteration: 2.3.5 uuid: 11.1.1 xml2js: 0.6.2 - zod: 4.4.3 + zod: 4.6.7 nanoid@3.3.18: {} @@ -5481,10 +5482,10 @@ snapshots: dependencies: fn.name: 1.1.0 - openai@6.49.0(ws@8.22.0)(zod@4.4.3): + openai@6.49.0(ws@8.22.0)(zod@4.6.7): optionalDependencies: ws: 8.22.0 - zod: 4.4.3 + zod: 4.6.7 openapi-types@12.1.3: {} @@ -5792,7 +5793,7 @@ snapshots: stream-exhaust@1.0.2: {} - stream-json@3.6.0: + stream-json@3.7.0: dependencies: stream-chain: 4.2.6 @@ -6177,10 +6178,10 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.25.2(zod@4.4.3): + zod-to-json-schema@3.25.2(zod@4.6.7): dependencies: - zod: 4.4.3 + zod: 4.6.7 zod@3.25.76: {} - zod@4.4.3: {} + zod@4.6.7: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index eca7bf9..bdbb465 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -16,7 +16,9 @@ overrides: # GHSA-p8wg-vrv2-v86f, GHSA-8r5x-fm3f-whwj (JavaScript injection) — dev-only transitive via @n8n/node-cli handlebars: '4.7.10' # GHSA-528h-pc64-c93x + 3.5.0 advisories (prototype pollution, JSONC re-scan) — dev-only transitive via @n8n/node-cli - stream-json: '3.6.0' + stream-json: '3.7.0' + # GHSA-mrhx-c7xc-m3w5 (memory exhaustion) — zod 4 dev-only transitive via @n8n/node-cli (langchain/openai) + zod@4: '4.6.7' # npm dist-tag stable; block 2.23+ beta-channel releases n8n-workflow: '2.22.3' @@ -26,6 +28,9 @@ auditConfig: # braces <=3.0.3 stack-exhaustion DoS; no patched release exists. Dev-only via # @n8n/node-cli and gulp, only fed our own glob patterns. Remove once braces ships a fix. - GHSA-vfj7-8cjw-p6xm + # zod <4.6.6 memory exhaustion; zod 3.x has no patched release. Dev-only peer of + # n8n-workflow, never shipped. Revisit by 2027-01-24 or once n8n-workflow moves to zod >=4.6.6. + - GHSA-mrhx-c7xc-m3w5 # Only these packages may run install/build lifecycle scripts (Mini Shai-Hulud defense). onlyBuiltDependencies: diff --git a/scripts/check-supply-chain.mjs b/scripts/check-supply-chain.mjs index 7f1c401..9454a3b 100644 --- a/scripts/check-supply-chain.mjs +++ b/scripts/check-supply-chain.mjs @@ -1,7 +1,10 @@ #!/usr/bin/env node /** * Scans pnpm-lock.yaml for Mini Shai-Hulud (and related) compromised versions - * and suspicious install-script / C2 indicators. + * and suspicious install-script / C2 indicators, and queries OSV for known + * malicious (MAL-) records on every locked package. + * + * Set SUPPLY_CHAIN_OFFLINE=1 to skip the OSV query (static blocklist only). */ import { readFileSync, existsSync } from 'node:fs'; import { execSync } from 'node:child_process'; @@ -24,6 +27,10 @@ const REQUIRED_WORKSPACE_SETTINGS = [ 'overrides:', ]; +const OSV_QUERYBATCH_URL = 'https://api.osv.dev/v1/querybatch'; +const OSV_BATCH_SIZE = 1000; +const OSV_TIMEOUT_MS = 30_000; + const FORBIDDEN_LOCKFILES = ['package-lock.json', 'yarn.lock', 'npm-shrinkwrap.json', 'bun.lockb', 'bun.lock']; function verifyPnpmOnlyRepository() { @@ -196,7 +203,63 @@ function parseLockfilePackages(lockfile) { return packages; } -function main() { +function uniquePackages(installed) { + const seen = new Map(); + for (const { name, version } of installed) { + // Snapshot keys carry peer suffixes, e.g. 1.3.1(keyv@5.6.0) + const bare = version.split('(')[0]; + seen.set(`${name}@${bare}`, { name, version: bare }); + } + return [...seen.values()]; +} + +async function queryOsvBatch(queries) { + const response = await fetch(OSV_QUERYBATCH_URL, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ queries }), + signal: AbortSignal.timeout(OSV_TIMEOUT_MS), + }); + if (!response.ok) { + throw new Error(`OSV returned HTTP ${response.status}`); + } + return (await response.json()).results ?? []; +} + +async function findOsvMalicious(packages) { + const errors = []; + + let pending = packages.map((pkg) => ({ pkg, pageToken: undefined })); + while (pending.length) { + const next = []; + for (let i = 0; i < pending.length; i += OSV_BATCH_SIZE) { + const chunk = pending.slice(i, i + OSV_BATCH_SIZE); + const results = await queryOsvBatch( + chunk.map(({ pkg, pageToken }) => ({ + package: { name: pkg.name, ecosystem: 'npm' }, + version: pkg.version, + ...(pageToken ? { page_token: pageToken } : {}), + })), + ); + results.forEach((result, j) => { + const { pkg } = chunk[j]; + for (const vuln of result.vulns ?? []) { + if (vuln.id.startsWith('MAL-')) { + errors.push(`OSV malicious package: ${pkg.name}@${pkg.version} (${vuln.id})`); + } + } + if (result.next_page_token) { + next.push({ pkg, pageToken: result.next_page_token }); + } + }); + } + pending = next; + } + + return errors; +} + +async function main() { const errors = []; const warnings = []; @@ -227,6 +290,25 @@ function main() { } } + const unique = uniquePackages(installed); + let osvSummary; + if (process.env.SUPPLY_CHAIN_OFFLINE === '1') { + warnings.push( + 'SUPPLY_CHAIN_OFFLINE=1 — skipped OSV malicious-package query (static blocklist only)', + ); + osvSummary = 'OSV skipped'; + } else { + try { + errors.push(...(await findOsvMalicious(unique))); + osvSummary = `${unique.length} packages checked against OSV`; + } catch (error) { + // Fail closed: an unreachable OSV must not look like a clean result + errors.push( + `OSV malicious-package query failed: ${error.message} (set SUPPLY_CHAIN_OFFLINE=1 to run without it)`, + ); + } + } + if (!existsSync(resolve(root, 'node_modules'))) { warnings.push('node_modules not present — run pnpm install before relying on local install checks'); } @@ -252,8 +334,8 @@ function main() { } console.log( - `Supply chain check passed (${installed.length} locked packages, ${packageCount} blocklist entries from ${blocklistFileCount || 1} file(s), updated ${blocklist.updated}).`, + `Supply chain check passed (${installed.length} locked packages, ${packageCount} blocklist entries from ${blocklistFileCount || 1} file(s), updated ${blocklist.updated}; ${osvSummary}).`, ); } -main(); +await main();