fix: field normalization, AI connection validation, autofix filter (#581) (#638)

- Normalize name→nodeName and id→nodeId for node-targeting operations in
  the Zod schema transform, so LLMs using natural field names no longer
  get "Node not found" errors
- Replace hardcoded ALL_CONNECTION_TYPES with dynamic iteration so AI
  sub-nodes (ai_outputParser, ai_document, ai_textSplitter, etc.) are
  not flagged as disconnected during save
- Add .catchall() to workflowConnectionSchema and extend connection
  reference validation to cover all connection types, not just main
- Fix filterOperationsByFixes ID-vs-name mismatch: typeversion-upgrade
  operations now include nodeName alongside nodeId, and the filter checks
  both fields

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Romuald Członkowski
2026-03-15 14:32:14 +01:00
committed by GitHub
parent 65ab94deb2
commit f7a1cfe8bf
41 changed files with 657 additions and 154 deletions

View File

@@ -196,7 +196,7 @@ class N8nApiClient {
}
async activateWorkflow(id) {
try {
const response = await this.client.post(`/workflows/${id}/activate`);
const response = await this.client.post(`/workflows/${id}/activate`, {});
return response.data;
}
catch (error) {
@@ -205,7 +205,7 @@ class N8nApiClient {
}
async deactivateWorkflow(id) {
try {
const response = await this.client.post(`/workflows/${id}/deactivate`);
const response = await this.client.post(`/workflows/${id}/deactivate`, {});
return response.data;
}
catch (error) {
@@ -365,6 +365,15 @@ class N8nApiClient {
throw (0, n8n_errors_1.handleN8nApiError)(error);
}
}
async updateWorkflowTags(workflowId, tagIds) {
try {
const response = await this.client.put(`/workflows/${workflowId}/tags`, tagIds.filter(id => id).map(id => ({ id })));
return response.data;
}
catch (error) {
throw (0, n8n_errors_1.handleN8nApiError)(error);
}
}
async getSourceControlStatus() {
try {
const response = await this.client.get('/source-control/status');