Skip to content

feat(core): Introduce CredentialDependency entity to track credential dependencies - #27151

Merged
alielkhateeb merged 23 commits into
masterfrom
LIGO-230-introduce-credential-dependency-entity
Mar 23, 2026
Merged

alielkhateeb merged 23 commits into
masterfrom
LIGO-230-introduce-credential-dependency-entity

Conversation

@alielkhateeb

@alielkhateeb alielkhateeb commented Mar 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Introduces a new CredentialDependency entity and supporting infrastructure to track which external secret providers a credential depends on.

https://www.loom.com/share/27e084b98d7945aeb4308a1de505de0a

Changes

  • New CredentialDependency entity (packages/@n8n/db): Stores credentialId, dependencyType (externalSecretProvider), and dependencyId with a unique constraint and cascade delete on credential removal.
  • DB migration (1773000000000-CreateCredentialDependencyTable): Creates the credential_dependency table for both SQLite and PostgreSQL.
  • New CredentialDependencyRepository: Provides findCredentialIdsByDependencyId, upsertDependenciesForCredential, and syncDependenciesForCredential methods.
  • Updated CredentialsService: Parses credential data on create/update to extract and persist external secret provider dependencies.
  • Updated validation.ts: Adds helpers to extract dependency IDs from credential values.
  • Updated repositories for CredentialsRepository and SecretsProviderConnectionRepository to support dependency-aware queries.
  • Tests: Updated and extended tests for CredentialsService, CredentialsController, and the public API credentials service.

How to test

Create flow

  1. Create a credential that references an external secret provider value (e.g. ={{ $secrets.myVault.myKey }}).
  2. Verify a row is created in credential_dependency with dependencyType = 'externalSecretProvider'.

Update flow

  1. Update the credential to add a new external secret provider reference — verify a new dependency row is inserted.
  2. Update the credential to remove an existing external secret provider reference — verify the corresponding dependency row is deleted.
  3. Update the credential to swap one external secret provider reference for another — verify the old row is removed and the new one is inserted.
  4. Update the credential without changing any references — verify the dependency rows are unchanged.

Delete flow

  1. Delete the credential and verify all associated dependency rows are cascade-deleted.

Related Linear tickets, Github issues, and Community forum posts

https://linear.app/n8n/issue/LIGO-230/be-switch-to-index-based-query-for-getting-all-credentials-referencing

Review / Merge checklist

  • PR title and summary are descriptive. (conventions)
  • Docs updated or follow-up ticket created.
  • Tests included.
  • PR Labeled with release/backport (if the PR is an urgent fix that needs to be backported)

@n8n-assistant n8n-assistant Bot added core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team labels Mar 17, 2026
@alielkhateeb
alielkhateeb force-pushed the LIGO-230-introduce-credential-dependency-entity branch from b0cec0b to 7a73194 Compare March 18, 2026 16:14

const credentialDependencyTable = 'credential_dependency';
const externalSecretProviderDependencyType = 'externalSecretProvider';
const providerKeyPattern = '[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*';

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sort of a duplicate of

const PROVIDER_KEY_PATTERN = '[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*';
but since migrations should be self-contained I created a new one here

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The utilities in this file might give the impression of duplicate code, that's because it is duplicate code 😂 somehow

Usually migrations are meant to be self contained with minimal dependencies to avoid breaking when business logic change over time, if this is not the right way here at n8n I'm happy to amend and reuse the existing utility methods :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's good that migrations don't import code but rather duplicate it 👍
I wouldn't want the behaviour of the migration to change if we change the util implementation in the future (or at least I wouldn't expect as a dev that changing a function in our code will affect a migration that was built in the past).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@konstantintieber Awesome, thanks for reassuring me 🫶

@alielkhateeb
alielkhateeb marked this pull request as ready for review March 18, 2026 16:18
@alielkhateeb
alielkhateeb requested a review from a team March 18, 2026 16:18

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 18 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/@n8n/db/src/repositories/credentials.repository.ts">

<violation number="1" location="packages/@n8n/db/src/repositories/credentials.repository.ts:302">
P1: According to linked Linear issue LIGO-230, this path must handle filtering across ~120k credential IDs. Expanding `credentialIds` into `IN (:...credentialIds)` can exceed DB parameter limits (and degrade heavily before that), causing large queries to fail rather than scale.</violation>
</file>
Architecture diagram
sequenceDiagram
    participant U as User/Client
    participant Ctrl as CredentialsController
    participant Svc as CredentialsService
    participant V as Validation/Helpers
    participant SecRepo as SecretsProviderConnectionRepo
    participant DepRepo as CredentialDependencyRepo
    participant CredRepo as CredentialsRepo
    participant DB as Database

    Note over U,DB: Flow: Create or Update Credential with Secret References

    U->>Ctrl: POST/PATCH /credentials (data: "{{ $secrets.vault.key }}")
    Ctrl->>Svc: update() / save()
    
    Svc->>V: NEW: extractExternalSecretProviderKeys(decryptedData)
    V-->>Svc: ['vault']
    
    Svc->>SecRepo: NEW: findIdsByProviderKeys(['vault'])
    SecRepo-->>Svc: ['provider-uuid-123']

    rect rgb(30, 41, 59)
        Note right of Svc: Transaction Started
        Svc->>CredRepo: Save/Update Credential Entity
        CredRepo->>DB: INSERT/UPDATE credentials_entity
        
        Svc->>DepRepo: NEW: syncDependenciesForCredential(credId, ['provider-uuid-123'])
        DepRepo->>DB: DELETE removed / INSERT NEW dependencies
        Note right of DB: Table: credential_dependency
    end

    Svc-->>Ctrl: Updated Credential
    Ctrl-->>U: 200/201 Response

    Note over U,DB: Flow: List Credentials filtered by Secret Provider

    U->>Ctrl: GET /credentials?externalSecretsStore=vault
    Ctrl->>Svc: getMany(filter: { externalSecretsStore: 'vault' })

    Svc->>SecRepo: NEW: findIdByProviderKey('vault')
    SecRepo-->>Svc: 'provider-uuid-123'

    Svc->>DepRepo: NEW: findCredentialIdsByDependencyId('provider-uuid-123')
    DepRepo-->>Svc: ['cred-id-A', 'cred-id-B']

    alt Found matching IDs
        Svc->>CredRepo: CHANGED: getManyAndCountWithSharingSubquery(credentialIds: [...])
        CredRepo->>DB: SELECT * FROM credentials_entity WHERE id IN (...)
        DB-->>CredRepo: Rows
        CredRepo-->>Svc: Credentials[]
    else No matches
        Svc-->>Ctrl: []
    end

    Svc-->>Ctrl: Enriched Credentials
    Ctrl-->>U: JSON List
Loading

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread packages/@n8n/db/src/repositories/credentials.repository.ts Outdated
Comment thread packages/cli/src/credentials/credential-dependency.service.ts Outdated
@alielkhateeb
alielkhateeb force-pushed the LIGO-230-introduce-credential-dependency-entity branch from c40bcdb to bb52f50 Compare March 19, 2026 10:42
)
: undefined;

return await this.credentialsRepository.manager.transaction(async (transactionManager) => {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wrapping update in transaction now so the dependency sync is atomic with the credential update

Comment thread packages/cli/src/credentials/validation.ts Outdated
Comment thread packages/cli/src/credentials/credentials.service.ts Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️ Love this refactoring

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 7 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/cli/src/credentials/external-secrets.utils.ts">

<violation number="1" location="packages/cli/src/credentials/external-secrets.utils.ts:43">
P2: Dot-notation provider regex can extract partial provider IDs, causing incorrect dependency mapping.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread packages/cli/src/credentials/external-secrets.utils.ts Outdated
@alielkhateeb
alielkhateeb enabled auto-merge March 19, 2026 12:39
: undefined;

if (externalSecretsStore && !dependencyFilter) {
return [];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we throw an error here telling the user that we couldn't query by the provided external secret provider key, because no secret provider with that key exists?

@alielkhateeb alielkhateeb Mar 19, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@konstantintieber I would see this as a filter, so if the secret provider doesn't exist we return an empty array, just like searching a list of items by a keyword that matches nothing

But I definitely see a potential refactoring here, basically the params aren't clear, I'll amend and send the commit hash here for another round and to get your opinion

@konstantintieber konstantintieber Mar 19, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah you're right. a "get many credentials" endpoint is likely not the place to validate that the external secret provider key that was passed in has a match in our db.

We're essentially saying: if you're looking for credentials that use a vault that doesn't exist, then you also won't find any credentials 👍

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

59176ed I think this makes the filter more explicit, IMO, what do u think?

@konstantintieber konstantintieber Mar 19, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm I'm indecisive on that one. Is includeGlobal not a filter? Classic naming things...

@konstantintieber

konstantintieber commented Mar 19, 2026 •

Copy link
Copy Markdown
Contributor

Found one thing: when I delete a secrets vault that is used in a credential, any rows in credential_dependency that reference this deleted secret vault are not cleaned up.
The credential_dependency row is only deleted when the associated credential is deleted.

EDIT:
maybe we should not go for the combination of dependencyType and dependencyId after all, since that way won't allow us to use foreign keys.
We can cascade deletes of secret vaults on the credential_dependency table if we change the schema to this:

@Column({ type: 'int' }) // today, this will not be nullable, but in the future, if we have another dependency column, it may be
secretsProviderConnectionId: number;

@ManyToOne('SecretsProviderConnection', { onDelete: 'CASCADE' })
@JoinColumn({ name: 'secretsProviderConnectionId' })
secretsProviderConnection: Relation<SecretsProviderConnection>;

If we stick to the current schema, we could also add a call to a method like CredentialDependencyRepository.deleteOnDependencyDelete({ type: CredentialDependencyType, dependencyId: string }) inside SecretsProviderConnectionsService.deleteConnection to unblock the current PR (and maybe even keep it that way 🤷 )

dependencyType: CredentialDependencyType;

@Column({ length: 255 })
dependencyId: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: While I'm fine with the dependencyId, the existing WorkflowDependency entity calls this dependencyKey

@konstantintieber konstantintieber Mar 19, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That might be specific to the fact that a workflow has more varied kinds of dependencies though (e.g. node type).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Initially I had it as dependencyKey to follow the same as workflowDepdency and I've given this a thought, and I didn't want people to mistakenly insert providerKey instead of secretConnectionId, this is the only reason why I went with dependencyId rather than dependencyKey

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call 👍

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/cli/src/credentials/credentials.controller.ts">

<violation number="1" location="packages/cli/src/credentials/credentials.controller.ts:79">
P2: Add a controller test that asserts `getMany()` forwards `externalSecretsStore` under `filters`. Without that coverage, this request-shape change can regress while the service tests still pass.

(Based on your team's feedback about controller unit tests for query-shape changes.) [FEEDBACK_USED]</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

includeGlobal: query.includeGlobal,
externalSecretsStore: query.externalSecretsStore,
filters: {
externalSecretsStore: query.externalSecretsStore,

@cubic-dev-ai cubic-dev-ai Bot Mar 19, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Add a controller test that asserts getMany() forwards externalSecretsStore under filters. Without that coverage, this request-shape change can regress while the service tests still pass.

(Based on your team's feedback about controller unit tests for query-shape changes.)

View Feedback

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/cli/src/credentials/credentials.controller.ts, line 79:

<comment>Add a controller test that asserts `getMany()` forwards `externalSecretsStore` under `filters`. Without that coverage, this request-shape change can regress while the service tests still pass.

(Based on your team's feedback about controller unit tests for query-shape changes.) </comment>

<file context>
@@ -75,7 +75,9 @@ export class CredentialsController {
 			includeGlobal: query.includeGlobal,
-			externalSecretsStore: query.externalSecretsStore,
+			filters: {
+				externalSecretsStore: query.externalSecretsStore,
+			},
 		});
</file context>
Fix with Cubic

@alielkhateeb

Copy link
Copy Markdown
Contributor Author

@konstantintieber Really good observation, I have missed that one
I will fix it right after eating 😂

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 5 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/cli/src/modules/external-secrets.ee/secrets-providers-connections.service.ee.ts">

<violation number="1" location="packages/cli/src/modules/external-secrets.ee/secrets-providers-connections.service.ee.ts:210">
P0: Custom agent: **Security Review**

**Missing connection deletion**: `deleteConnectionForProject` never actually removes the connection entity from the database. The old `removeByProviderKeyAndProjectId` was replaced with `findByProviderKeyAndProjectId`, but `entityManager.remove(connection)` was never added to the transaction (unlike the correctly-implemented `deleteConnection` method above). This means external secrets provider connections with encrypted vault credentials will persist in the DB after a user tries to delete them.</violation>

<violation number="2" location="packages/cli/src/modules/external-secrets.ee/secrets-providers-connections.service.ee.ts:503">
P2: Custom agent: **Quality & Performance Review**

**Duplicate project access deletion**: Both `entityManager.delete(this.projectAccessRepository.target, { secretsProviderConnectionId: connectionId })` and `this.projectAccessRepository.deleteByConnectionId(connectionId, entityManager)` delete the same project access rows within the same transaction. One of these should be removed. The `deleteConnection` method above only uses `deleteByConnectionId`.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 4 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/cli/src/modules/external-secrets.ee/secrets-providers-connections.service.ee.ts">

<violation number="1" location="packages/cli/src/modules/external-secrets.ee/secrets-providers-connections.service.ee.ts:213">
P1: `deleteConnectionForProject()` lost transactional atomicity for multi-table deletes, so partial failures can corrupt dependency/access state.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

await this.repository.remove(connection);
await this.repository.manager.transaction(async (entityManager) => {
await this.projectAccessRepository.deleteByConnectionId(connection.id, entityManager);
await this.credentialDependencyService.deleteDependencyById({

@cubic-dev-ai cubic-dev-ai Bot Mar 20, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: deleteConnectionForProject() lost transactional atomicity for multi-table deletes, so partial failures can corrupt dependency/access state.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/cli/src/modules/external-secrets.ee/secrets-providers-connections.service.ee.ts, line 213:

<comment>`deleteConnectionForProject()` lost transactional atomicity for multi-table deletes, so partial failures can corrupt dependency/access state.</comment>

<file context>
@@ -209,12 +210,12 @@ export class SecretsProvidersConnectionsService {
 		await this.repository.manager.transaction(async (entityManager) => {
 			await this.projectAccessRepository.deleteByConnectionId(connection.id, entityManager);
-			await this.credentialDependencyRepository.deleteByDependency({
+			await this.credentialDependencyService.deleteDependencyById({
 				dependencyType: EXTERNAL_SECRET_PROVIDER_DEPENDENCY_TYPE,
 				dependencyId,
</file context>
Fix with Cubic

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How did deleteConnectionForProject lose transactional atomicity? In this PR this is unchanged compared to master isn't it?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for flagging that—I'll recheck the diff to confirm whether anything changed in deleteConnectionForProject; if it’s unchanged from master, I’ll update or withdraw the comment accordingly.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think what this bot means is that these three statements should be in one transaction:

await this.credentialDependencyService.deleteDependencyById({
	dependencyType: EXTERNAL_SECRET_PROVIDER_DEPENDENCY_TYPE,
	dependencyId: connectionId.toString(),
});
await this.projectAccessRepository.deleteByConnectionId(connectionId);
await this.repository.delete({ id: connectionId });

Because the first two depend on the successful deletion in the third statement.

So even on master right now, the fact that await this.projectAccessRepository.deleteByConnectionId and await this.repository.delete are not in a transaction is not our usual way of implementing this.
I also wonder why we're not using onDelete: 'cascade' on the ManyToOne project relation of ProjectSecretsProviderAccess.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the feedback! I've saved this as a new learning to improve future reviews.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing that out—looks like it’s already addressed in that change. I’ll update the review accordingly.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the link—confirmed it’s already fixed there; I’ll mark this as resolved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Weird, but the bot is talking about a different piece of code. The one I mentioned is in SecretsProvidersConnectionsService.deleteConnectionForProject, while the bot commented about SecretsProvidersConnectionsService.deleteConnection 🤔

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the feedback! I've saved this as a new learning to improve future reviews.

@konstantintieber konstantintieber left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

};
} = {},
): Promise<CredentialsEntity[]> {
const { includeData = false, filters } = options;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TIL how default values in JS's destructuring syntax works 👍

@guillaumejacquart guillaumejacquart left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one nit comment, but looks good, thanks 🚀

.withIndexOn(['credentialId'])
.withIndexOn(['dependencyType', 'dependencyId']).withCreatedAt;

await createIndex(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why the separate createIndex ? why not another .withIndexOn( ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That’s an absolutely valid question ✅

The main reason is that I found it hard to clearly spot unique indexes when they’re defined alongside non-unique ones using withIndexOn. For example:

.withIndexOn(['credentialId'])
.withIndexOn(['dependencyType', 'dependencyId'])
.withIndexOn(['credentialId', 'dependencyType', 'dependencyId'], true);

Here, the true is quite subtle and easy to miss when scanning the code.

Since this is a migration file (and not something we expect to revisit or refactor), I preferred to make the unique index explicit. This makes it easier for reviewers and future readers to spot which index enforces uniqueness vs which ones are just for performance.

Also… the fact that you pointed it out probably means my plan worked 😂 haha

@alielkhateeb
alielkhateeb added this pull request to the merge queue Mar 23, 2026
Merged via the queue into master with commit 835094c Mar 23, 2026
47 checks passed
@alielkhateeb
alielkhateeb deleted the LIGO-230-introduce-credential-dependency-entity branch March 23, 2026 14:56
@n8n-assistant n8n-assistant Bot mentioned this pull request Mar 24, 2026
@n8n-assistant n8n-assistant Bot mentioned this pull request Mar 24, 2026
@n8n-assistant

n8n-assistant Bot commented Mar 24, 2026

Copy link
Copy Markdown
Contributor

Got released with n8n@2.14.0

linktrend added a commit to linktrend/link-n8n that referenced this pull request Mar 31, 2026
* ci: Unify QA metrics pipeline to single webhook, format, and BigQuery table (no-changelog) (n8n-io#27111)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(core): Add chat hub settings to disable Responses API and change memory context window (n8n-io#26525)

* fix: Partial execution of Chat node and Chat tool (n8n-io#26334)

* fix(editor): Update StopManyExecs modal formatting, (n8n-io#26994)

* fix(editor): Show warning toast when executed node was not reached (n8n-io#27094)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: Update PR template with new backport labels (n8n-io#27123)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* feat(core): Wire builtin globals onto __data in VM expression isolate (n8n-io#26954)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(editor): Prevent clicks on pinned rows in data tables (n8n-io#26347)

* fix(core): Retry multi-main follower license check during startup (n8n-io#26990)

* chore(core): Add additional validation on resolver config and better error specs (n8n-io#27013)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(core): Preserve nested proxy/redirect shape in log streaming webhook (n8n-io#27109)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(editor): Command bar wasn't finding any workflows (n8n-io#26788)

* chore(editor): Add A/A exp to validate experimentation system (no-changelog) (n8n-io#26387)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Romeo Balta <7095569+romeobalta@users.noreply.github.com>

* fix(editor): Remove inconsistent scrim on node creator open (n8n-io#27086)

* fix(core): Emit `leader-takeover` on leadership mismatch in `checkLeader` (n8n-io#27126)

* chore: Add 1.x branch compatibility to workflow scripts (n8n-io#27153)

* refactor(core): Extract global axios config into axios-config.ts (no-changelog) (n8n-io#26852)

* fix(core): Handle external hook file paths on Windows (n8n-io#26983)

Co-authored-by: Danny Martini <danny@n8n.io>

* build: Pin `uuid` in `n8n-workflow` to catalog version (n8n-io#27129)

* docs(editor): Add shared design-system AI style review rules (no-changelog) (n8n-io#27008)

* fix(editor): Adjust external secrets input styling (n8n-io#27110)

* chore(editor): Differentiate canvas and chat hub events (n8n-io#27100)

* feat: Enable secure invite links (n8n-io#27107)

* fix(core): Add missing fields to public API workflow schema (n8n-io#27157)

* fix(editor): Add data to a data table by csv upload (n8n-io#26495)

Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix: Fix issue with hideOnCloud not working for node display options (n8n-io#27124)

Co-authored-by: RomanDavydchuk <roman.davydchuk@n8n.io>

* fix(Postgres Node): Expressions are not resolved in v1 (n8n-io#26496)

Co-authored-by: yehorkardash <yehor.kardash@n8n.io>

* ci: Schedule creation of minor and patch PRs (n8n-io#27199)

* ci: Create github releases from mjs scripts (n8n-io#27121)

* fix(ai-builder): Show feedback buttons in variant (no-changelog) (n8n-io#27201)

* refactor(editor): Migrate NDV panel components to `workflowDocumentStore` (no-changelog) (n8n-io#27158)

* refactor(editor): Migrate NDV settings and runData to `workflowDocumentStore` (no-changelog) (n8n-io#27140)

* fix(core): Add plain text body to password reset and notification emails (n8n-io#27125)

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>

* refactor(editor): Migrate shared editors and context menu to injectWorkflowDocumentStore (no-changelog) (n8n-io#27207)

* fix(core): Use published version for error workflow execution (n8n-io#27196)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(core): Apply execution redaction to real-time push events (no-changelog) (n8n-io#27102)

* feat(core): Send user agent for public api events (no-changelog) (n8n-io#27217)

* perf(core): Fix slow user mock in cli tests (no-changelog) (n8n-io#27205)

* ci: Strip backport information from commit labels on changelog (n8n-io#27203)

* feat: Add design principles section to AGENTS.md with the security guidelines (n8n-io#25997)

* feat(core): Add structured error responses for authorization failures (n8n-io#27170)

* feat(editor): Use server-side search for project sharing dropdowns (n8n-io#27093)

* refactor(editor): Re-organise and label design-system stories (no-changelog) (n8n-io#27179)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* feat(core): Batch public API telemetry events on pulse cycle (n8n-io#27226)

Co-authored-by: Daria Staferova <daria.staferova@n8n.io>

* fix(editor): Clear resource locator cache after URL redirect creation (n8n-io#27175)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(Execute Workflow Node): Fallback to latest draft if there no active sub-workflow version (n8n-io#27134)

* feat(editor): Migrate node composables to use `workflowDocumentStore` directly (no-changelog) (n8n-io#27159)

* refactor(editor): Extract workflow document connections facade composable (no-changelog) (n8n-io#27221)

Co-authored-by: r00gm <raul00gm@gmail.com>

* feat(core): Add filtering parameters to get_execution MCP tool (n8n-io#27192)

* fix(editor): Fix markdown list item wrapping in chat messages (no-changelog) (n8n-io#27082)

* feat(core): Add search_projects, search_folders MCP tools and folderId to create_workflow (n8n-io#27248)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(core): Stop auto applying credentials for updated MCP workflows (n8n-io#27258)

* fix(Jira Node): Add continueOnFail support for all operations (n8n-io#27108)

* refactor(editor): Migrate execution and logs composables to `workflowDocumentStore` (no-changelog) (n8n-io#27162)

* feat(editor): Display workflow, credential and data table dependencies (n8n-io#26912)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* feat(editor): Add history version info to execution page (n8n-io#26768)

* fix(core): Allow expressions in tool default values on chat hub tools (n8n-io#27167)

* fix(editor): Remove toast bottom offset when AI chat panel is open (n8n-io#27132)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* ci: Propagate dependency bumps transitively (n8n-io#27270)

* refactor(editor): Migrate canvas operations to `workflowDocumentStore` (no-changelog) (n8n-io#26947)

* refactor(editor): Migrate NDV stores and views to `workflowDocumentStore` (no-changelog) (n8n-io#27138)

* feat: Add new execution filter by workflow version (n8n-io#26904)

* fix(Anthropic Node): Update credential test to use available model (n8n-io#27234)

* feat(core): Add project context to execution log metadata (n8n-io#27169)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* feat(core): Introduce expression-based role resolver for SSO claim mapping (no-changelog) (n8n-io#27240)

* refactor(editor): Migrate integrations, evaluation, and experiments to `workflowDocumentStore` (no-changelog) (n8n-io#27163)

* fix: Fix credential displayNames with missing spaces (n8n-io#27259)

* fix(core): Move OIDC SSO provisioning outside user creation transaction (n8n-io#27279)

* feat(core): Add node that allows checking dynamic credentials inside node (n8n-io#27165)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(editor): Unify input component background surfaces (n8n-io#27237)

* feat(core): Always expose mcp sdk reference as a tool (no-changelog) (n8n-io#27271)

* docs: Add .env.local.example template and dotenvx for local dev setup (no-changelog) (n8n-io#27241)

* feat(API): Add GET /api/v1/discover endpoint for capability discovery (n8n-io#27014)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(editor): Fix tooltip on credits counter info icon (n8n-io#27244)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(core): Fix unhandled rejection in task broker on runner disconnect (n8n-io#27278)

* feat(editor): AI workflow builder setup wizard (n8n-io#26832)

Co-authored-by: Charlie Kolb <charlie@n8n.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(Perplexity Node): Update Perplexity node for full API coverage (n8n-io#26970)

Co-authored-by: Dimitri Lavrenük <20122620+dlavrenuek@users.noreply.github.com>

* feat: Add publish workflow to node-cli (n8n-io#27288)

* test: fix scope-lockdown violations in page objects (n8n-io#27326)

* ci: Prevent new version patches, if only content is ci changes (n8n-io#27329)

* fix(editor): Properly align line after bullet point in Sticky markdown (n8n-io#27231)

* chore: Bump @langchain/core to latest (n8n-io#27252)

* fix(editor): Properly align line after bullet point in Sticky markdown (n8n-io#27231)

* feat: Add `@n8n/cli`: a client CLI to manage n8n from the terminal (n8n-io#26943)

Co-authored-by: Daria Staferova <daria.staferova@n8n.io>
Co-authored-by: Nikhil Kuriakose <nikhil.kuriakose@n8n.io>

* fix(editor): Improve colorings update logic in resolvableHighlighter … (n8n-io#27331)

* fix(editor): Fix workflow tag filtering excluding workflows inside folders (n8n-io#27333)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(HTTP Request Node): Fail on non-2xx status codes during pagination with "other" completion (n8n-io#27352)

* perf(core): Make webhook cache writes non-blocking (n8n-io#27360)

* feat(editor): Pass telemetry source for ai workflow builder executions from setup (no-changelog) (n8n-io#27358)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(core): Fix an issue with workflow execution status (n8n-io#27349)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(Extract from File Node): Skip empty lines in CSV parsing to prevent errors (n8n-io#26511)

Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>

* feat(databricks Node): Add basic databricks node (n8n-io#27004)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(Microsoft Agent 365 Trigger Node): Mcp tools logs (n8n-io#27215)

* fix(core): Allow expressions in OAuth credential URL fields (n8n-io#27354)

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>

* fix(editor):  Fix type mismatch (n8n-io#27324)

* fix(editor): Support per-corner border radius in N8nInput (n8n-io#27321)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* fix(editor): Fix stop button size mismatch in split-trigger mode (n8n-io#27328)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(editor): Restore animation duration units for design system dialogs (n8n-io#27320)

* chore: Add create-issue skill for Linear tickets and GitHub issues (n8n-io#27285)

* fix(core): Force full execution data fetching for evaluation test runs (n8n-io#27335)

* chore: Update ssh2-sftp-client to 12.1.0 (n8n-io#27210)

* fix(AWS Bedrock Chat Model Node): Extract region from modelName ARNs (n8n-io#26972)

* refactor(editor): Migrate canvas operations to workflowDocumentStore connections (no-changelog) (n8n-io#27280)

* refactor(editor): Migrate NDV settings to workflowDocumentStore connections (no-changelog) (n8n-io#27261)

* refactor(editor): Migrate NDV stores and views to `workflowDocumentStore` (no-changelog) (n8n-io#27281)

* fix(core): Fix IDOR in test-runs endpoint by consolidating access checks (n8n-io#27305)

* refactor(editor): Migrate workflow composables to workflowDocumentStore (connections) (no-changelog) (n8n-io#27263)

* feat(core): Add signing key and certificate fields to SAML preferences with encryption and validation (n8n-io#27316)

* fix(core): Assign webhook ID to API-created webhook nodes (n8n-io#27161)

* feat(core): Add signature validation for waiting webhooks and forms (n8n-io#24159)

Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>

* feat(core): Remove license check for API key scopes (n8n-io#27306)

Co-authored-by: Svetoslav Dekov <svetoslav.dekov@n8n.io>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(editor): Sort loop node outputs by execution order in setup panel (n8n-io#27418)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ai-builder): Include langsmith threadId on traces in code-builder (no-changelog) (n8n-io#27424)

* fix(AI Agent Node): Extract tool name correctly for MCP tool calls (n8n-io#27345)

* fix(core): Send client_id and client_secret in body for OAuth2 PKCE flow (n8n-io#27366)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(core): Add lint rules for missing node and credential icons (n8n-io#27340)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(Gmail Node): Update draft resource hint (n8n-io#27435)

* fix(core): Confirm messages immediately when no destination is listening (n8n-io#27334)

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>

* feat(core): Introduce CredentialDependency entity to track credential dependencies (n8n-io#27151)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Irénée <irenee.ajeneza@n8n.io>

* docs: Add security fix hygiene guidelines for public artifacts (n8n-io#27441)

* refactor(editor): Migrate AI assistant stores to workflowDocumentStore (no-changelog) (n8n-io#26713)

* fix(editor): Node references in expressions not updated when the renamed node has quotes (n8n-io#27371)

* fix(editor): Add inner content padding to Popover stories (no-changelog) (n8n-io#27430)

* fix(core): Disable dynamic banners when diagnostics are disabled (n8n-io#26741)

* fix(core): VM test Group G — RCE prevention & expression fixture fixes (n8n-io#27178)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(editor): Prevent toggle animation on Security & Policies page load (n8n-io#27350)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(editor): Show redacted state in execution viewer with reveal flow (n8n-io#26543)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(core): Clean up resolver references on deletion (n8n-io#26524)

* ci: Modify immutable commit subject via spreading (n8n-io#27467)

* build: Add `import-x/no-extraneous-dependencies` lint rule to `n8n-workflow` (n8n-io#27155)

* refactor(editor): Migrate node composables to workflowDocumentStore (connections) (no-changelog) (n8n-io#27318)

* chore: Remove mariadb specific code paths (n8n-io#26996)

* fix(editor): Use new move-to-folder modal in canvas header (n8n-io#27091)

* refactor(core): Extract axios utility helpers into axios-utils (n8n-io#27022)

* chore: Lock @types/node to a version in @n8n/cli (n8n-io#27473)

* 🚀 Release 2.14.0 (n8n-io#27479)

Co-authored-by: Matsuuu <16068444+Matsuuu@users.noreply.github.com>

* ci: Ensure release candidates in release pipeline using the app token (n8n-io#27489)

* ci: Remove prerelease tag when promoting previous beta to latest (n8n-io#27490)

* feat: Add role mapping rule scopes (n8n-io#27476)

* feat(editor): Add canvas-only mode (n8n-io#27184)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: nik8n <niklas@n8n.io>

* fix(editor): Fix callout dismiss action in NDV (n8n-io#27496)

* fix(core): Add ownership check to MCP OAuth client deletion (n8n-io#27446)

* chore: Mark @n8n/cli as beta in package description (n8n-io#27500)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: Remove unneeded peer dependency (n8n-io#27501)

* chore: Add create-skill agent skill (n8n-io#27448)

* docs: Add README for @n8n/cli package (n8n-io#27510)

* fix(core): Correct `process.version` in expression sandbox (n8n-io#26550)

Co-authored-by: manusjs <manusjs@users.noreply.github.com>

* ci: Create stable release on GitHub promotion (n8n-io#27492)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: Bundle 2026-W9 (n8n-io#27532)

Co-authored-by: Matsu <matias.huhta@n8n.io>
Co-authored-by: Dimitri Lavrenük <20122620+dlavrenuek@users.noreply.github.com>
Co-authored-by: Charlie Kolb <charlie@n8n.io>
Co-authored-by: RomanDavydchuk <roman.davydchuk@n8n.io>
Co-authored-by: Jaakko Husso <jaakko@n8n.io>
Co-authored-by: Dawid Myslak <dawid.myslak@gmail.com>
Co-authored-by: Svetoslav Dekov <svetoslav.dekov@n8n.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Guillaume Jacquart <jacquart.guillaume@gmail.com>
Co-authored-by: Sandra Zollner <sandra.zollner@n8n.io>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>

* fix(core): Add format validation to source control branch name (n8n-io#27518)

* refactor(editor): Migrate workflow composables to use `workflowDocumentStore` (no-changelog) (n8n-io#27265)

* fix(core): Include custom headers when loading OpenAI models (n8n-io#27534)

* fix(Structured Output Parser Node): Show descriptive error when structured output parser receives empty response (n8n-io#27443)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ci: Replace vars context with runner.name in composite action (n8n-io#27535)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(editor): Improve workflow diff design feedback (n8n-io#27494)

* fix(editor): Populate workflowDocumentStore in execution preview iframe (n8n-io#27540)

* fix(Basic LLM Chain Node): Fix abort signal handling (n8n-io#27520)

* refactor(editor): Migrate shared editors and setup panel connections to workflowDocumentStore (no-changelog) (n8n-io#27423)

* fix(editor): Clean up quick connect feature flag and fix first load (n8n-io#27286)

* fix(core): Fix execution history when flow includes wait node (n8n-io#27357)

* feat(core): Add RoleMappingRule entity and database tables (n8n-io#27440)

* fix(editor): Use direct store reference for connections in initializeWorkspace (n8n-io#27552)

* fix(core): Fix hard-coded path style in external storage configuration (n8n-io#27553)

* feat: PostHog feature flags resolution caching & group support (n8n-io#27525)

* feat(core): Workflow level otel (n8n-io#27528)

* feat(core): Add Slack signature identifier for dynamic credentials (no-changelog) (n8n-io#27484)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(core): Implement MemoryInstanceStorage for single-instance deployments (no-changelog) (n8n-io#27460)

* fix(API): Skip sharing license check when isGlobal value is unchanged (n8n-io#27567)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(core): Replace unbounded expression code cache with LRU (n8n-io#27477)

Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(editor): Correct navigation to evaluation tab (n8n-io#27509)

* fix: Implement raw query parameters field for Microsoft SQL node (n8n-io#26355)

* fix(Salesforce Node): Fix private key field stripping newlines in JWT credential (n8n-io#27517)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(core): Refresh OAuth2 tokens on 401 during MCP tool calls (n8n-io#26463)

Co-authored-by: aikido-pr-checks[bot] <169896070+aikido-pr-checks[bot]@users.noreply.github.com>
Co-authored-by: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com>

* ci: Run pnpm pack --dry-run on CI to catch workspace errors (n8n-io#27480)

* fix(core): Fix race condition when stopping jobs in queue mode (n8n-io#27211)

* chore: Add node-add-oauth skill (no-changelog) (n8n-io#27447)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(Wordpress Node): Add support for OAuth2 (n8n-io#27113)

* ci: Add 1.x sync and bundle branch automation for n8n-private (n8n-io#27594)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: Type and order uniqueness (n8n-io#27600)

* feat(core): Add Slack signature extractor hook for dynamic credentials (no-changelog) (n8n-io#27485)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(core): Resolve $().item expressions in partial executions (n8n-io#27338)

* feat: Add @n8n/agents package (n8n-io#27560)

* ci: Don't error on release candidate cleanup when branch is missing (n8n-io#27602)

* ci: Use track-specific npm dist-tags on publish (n8n-io#27598)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: Add security publish fix workflow for 1.x branch (n8n-io#27604)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: Detect new unpublished packages after merge and add manual publish workflow (n8n-io#27611)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(editor): Fix `/diff` route loading in demo mode (n8n-io#27610)

* feat: POST / PATCH /role-mapping-rule endpoints (n8n-io#27569)

* fix(Microsoft Outlook Trigger Node): Wrap folder filter in parentheses to ensure correct OData operator precedence (n8n-io#27605)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: Fix issue with multi line string handling (n8n-io#27176)

* chore: Add n8n Claude Code plugin with setup-mcps skill (n8n-io#27589)

* perf(core): Optimize execution deletions for throughput (n8n-io#27336)

* feat(core): Add OTEL unhappy path handling and safe trace exporter (n8n-io#27568)

Co-authored-by: James Gee <1285296+geemanjs@users.noreply.github.com>

* feat(Zammad Node): Add support for updating tickets (n8n-io#16800)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: Jon <jonathan.bennetts@gmail.com>

* ci: Pin action to commit SHA and pass secrets via env vars (n8n-io#27622)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: Allow manual execution of release-schedule-patch-prs (n8n-io#27653)

* ci: Set initial npm publish to function with it's own token (n8n-io#27620)

* feat(core): Implement Test workflow MCP tool (n8n-io#27348)

* fix(editor): Fix empty project ID when creating resources using RLC (n8n-io#27544)

* feat: GET /role-mapping-rule endpoint (n8n-io#27609)

* feat(editor): Implement preview tag for MCP (no-changelog) (n8n-io#27630)

* fix(editor): Remove unused options from NDV settings for agent model nodes (n8n-io#27364)

* fix(editor): Truncate long workflow names in insights table (n8n-io#27631)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat: Environment var to disable forms pages sandboxing (n8n-io#27409)

* feat(core): Move id extraction logic into resolver (no-changelog) (n8n-io#27655)

* feat: DELETE /role-mapping-rule endpoint (n8n-io#27608)

* fix: Fix issue preventing community nodes re-installing when using a custom registry (n8n-io#26599)

* chore: Update n8n-plan skill to save plans and link them in PRs (no-changelog) (n8n-io#27495)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Csaba Tuncsik <csaba.tuncsik@gmail.com>

* feat(editor): Replace restore/changes UI with inline version cards (n8n-io#27522)

* feat(core): Add Slack credential resolver for dynamic credentials (no-changelog) (n8n-io#27486)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(core): Add public API endpoints for workflow archive and unarchive (n8n-io#27513)

* feat: Add normalization after create, update, delete (n8n-io#27669)

* chore: Update node popularity data (n8n-io#27400)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(core): Use toString() instead of type cast for password field check (n8n-io#27662)

* feat(editor): Support error workflows in workflow dependency (n8n-io#27542)

* refactor(core): Extract CommunityPackagesLifecycleService from controller (n8n-io#27636)

* feat(editor): Make AI builder test data opt-in via follow-up actions (no-changelog) (n8n-io#27425)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: Track workflow archive/unarchive endpoints in API coverage manifest (n8n-io#27738)

* feat(ai-builder): Support dataset context and conversation history in evaluations (no-changelog) (n8n-io#27618)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* chore(core): Query executions using a single query intead of two (n8n-io#27081)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* feat(core): Add configurable minimum password length via N8N_PASSWORD_MIN_LENGTH (n8n-io#26953)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(editor): Group agent subnodes into multi-node setup cards (n8n-io#27570)

Co-authored-by: Charlie Kolb <charlie@n8n.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(editor): Avoid resource locator cache pollution (n8n-io#27493)

* fix(editor): Restore templates sidebar click tracking                                                                                                                                   (n8n-io#27623)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(editor): Show tooltip on dependency pill (n8n-io#27545)

* feat(core): Add POST /role-mapping-rule/:id/move endpoint for reordering rules (n8n-io#27677)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(editor): Handle chat trigger waiting state in setup cards (n8n-io#27682)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ci: Disable chromatic, if not in main repo (n8n-io#27747)

* refactor: Remove persistBuilderSessions feature flag (n8n-io#27481)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(editor): Use execution data instead of stale NDV state for chat trigger check (n8n-io#27752)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(editor): Update mcp eligibility requirements in workflow settings (no-changelog) (n8n-io#27502)

* fix(core): Treat sub-node connections as non-blocking for partial execution root detection (n8n-io#27759)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(core): Fix `/healthz` endpoint when using `N8N_PATH` (n8n-io#27665)

* fix(core): Rename data table columns during source control pull (n8n-io#27746)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* ci: Parse pnpm ls with jq to prevent buffer overload (n8n-io#27770)

* ci: Prevent buffer overflow in other helper scripts (n8n-io#27774)

* fix(core): Remaining VM test fixes — error propagation, proxy traps, and cross-realm assertions (n8n-io#27541)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: Pin provenance to version, not SHA (n8n-io#27785)

* 🚀 Release 2.15.0 (n8n-io#27787)

Co-authored-by: Matsuuu <16068444+Matsuuu@users.noreply.github.com>

---------

Co-authored-by: Declan Carroll <declan@n8n.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Jaakko Husso <jaakko@n8n.io>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: Charlie Kolb <charlie@n8n.io>
Co-authored-by: Svetoslav Dekov <svetoslav.dekov@n8n.io>
Co-authored-by: Matsu <huhta.matias@gmail.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: Tomi Turtiainen <10324676+tomi@users.noreply.github.com>
Co-authored-by: Guillaume Jacquart <jacquart.guillaume@gmail.com>
Co-authored-by: Paul Issert <paul@n8n.io>
Co-authored-by: Romeo Balta <7095569+romeobalta@users.noreply.github.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Rob Hough <robhough180@gmail.com>
Co-authored-by: Stephen Wright <sjw948@gmail.com>
Co-authored-by: Daria <daria.staferova@n8n.io>
Co-authored-by: Nikhil Kuriakose <nikhilkuria@gmail.com>
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: Jon <jonathan.bennetts@gmail.com>
Co-authored-by: RomanDavydchuk <roman.davydchuk@n8n.io>
Co-authored-by: yehorkardash <yehor.kardash@n8n.io>
Co-authored-by: Benjamin Schroth <68321970+schrothbn@users.noreply.github.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
Co-authored-by: Raúl Gómez Morales <raul00gm@gmail.com>
Co-authored-by: Andreas Fitzek <andreas.fitzek@n8n.io>
Co-authored-by: Albert Alises <albert.alises@gmail.com>
Co-authored-by: Alexander Gekov <40495748+alexander-gekov@users.noreply.github.com>
Co-authored-by: Eugene <eugene@n8n.io>
Co-authored-by: Claire <claire.knight@krider.co.uk>
Co-authored-by: Elias Meire <elias@meire.dev>
Co-authored-by: phyllis-noester <102315132+phyllis-noester@users.noreply.github.com>
Co-authored-by: José Braulio González Valido <josebragv@gmail.com>
Co-authored-by: Kesku <62210496+kesku@users.noreply.github.com>
Co-authored-by: Dimitri Lavrenük <20122620+dlavrenuek@users.noreply.github.com>
Co-authored-by: Garrit Franke <32395585+garritfra@users.noreply.github.com>
Co-authored-by: Jacob Lee <jacoblee93@gmail.com>
Co-authored-by: Nikhil Kuriakose <nikhil.kuriakose@n8n.io>
Co-authored-by: Sandra Zollner <sandra.zollner@n8n.io>
Co-authored-by: José Braulio González Valido <jose.gonzalez@n8n.io>
Co-authored-by: Arvin A <51036481+DeveloperTheExplorer@users.noreply.github.com>
Co-authored-by: krisn0x <10799186+krisn0x@users.noreply.github.com>
Co-authored-by: Ali Elkhateeb <ali.elkhateeb@n8n.io>
Co-authored-by: Irénée <irenee.ajeneza@n8n.io>
Co-authored-by: Dawid Myslak <dawid.myslak@gmail.com>
Co-authored-by: Pinar Kaya <35434040+pkaya89@users.noreply.github.com>
Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
Co-authored-by: n8n-assistant[bot] <100856346+n8n-assistant[bot]@users.noreply.github.com>
Co-authored-by: Matsuuu <16068444+Matsuuu@users.noreply.github.com>
Co-authored-by: nik8n <niklas@n8n.io>
Co-authored-by: manusjs <g.mygenie@gmail.com>
Co-authored-by: manusjs <manusjs@users.noreply.github.com>
Co-authored-by: Matsu <matias.huhta@n8n.io>
Co-authored-by: Krystian Slowik <113608678+krystianslowik@users.noreply.github.com>
Co-authored-by: jeanpaul <jeanpaul@users.noreply.github.com>
Co-authored-by: Joco-95 <jonathan.codas@n8n.io>
Co-authored-by: James Gee <1285296+geemanjs@users.noreply.github.com>
Co-authored-by: aikido-pr-checks[bot] <169896070+aikido-pr-checks[bot]@users.noreply.github.com>
Co-authored-by: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com>
Co-authored-by: Ria Scholz <123465523+riascho@users.noreply.github.com>
Co-authored-by: Marc Littlemore <MarcL@users.noreply.github.com>
Co-authored-by: Csaba Tuncsik <csaba.tuncsik@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Denisf88 <35726765+Denisf88@users.noreply.github.com>
ThorStarlord pushed a commit to ThorStarlord/n8n that referenced this pull request Apr 24, 2026
… dependencies (n8n-io#27151)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Irénée <irenee.ajeneza@n8n.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team Released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants