From 8728a808ac8edf22c28a1cd1e2f3a687d0b62e44 Mon Sep 17 00:00:00 2001 From: czlonkowski <56956555+czlonkowski@users.noreply.github.com> Date: Sat, 8 Nov 2025 18:24:10 +0100 Subject: [PATCH] fix: AI Agent validator not executing due to nodeType format mismatch (Critical) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed critical bug where AI Agent validator never executed, missing 179 configuration errors (30% of all telemetry-identified failures). The Bug: - Switch case checked for '@n8n/n8n-nodes-langchain.agent' (full package format) - But nodeType was normalized to 'nodes-langchain.agent' before reaching switch - Result: AI Agent validator never matched, never executed The Fix: - Changed case to 'nodes-langchain.agent' to match normalized format - Now correctly catches prompt configuration, maxIterations, error handling issues Files Changed: - src/services/enhanced-config-validator.ts:322 - Fixed nodeType format - tests/unit/services/enhanced-config-validator.test.ts - Added validateAIAgent to mock and verification test - CHANGELOG.md - Added bug fix section to 2.22.13 (not separate version) Testing: - npm test -- tests/unit/services/enhanced-config-validator.test.ts - ✓ All 51 tests pass including new AI Agent validation test Discovery: Discovered by n8n-mcp-tester agent during post-deployment verification of 2.22.13 improvements. The agent attempted to validate an AI Agent node configuration and discovered the validator was never being called. Impact: - Without fix: 179 AI Agent configuration errors (30%) go undetected - With fix: All AI Agent validation rules now execute correctly Version: 2.22.13 (kept under same version as original implementation) Concieved by Romuald Członkowski - www.aiadvisors.pl/en --- CHANGELOG.md | 16 ++++++++ data/nodes.db | Bin 70729728 -> 70729728 bytes src/services/enhanced-config-validator.ts | 2 +- .../enhanced-config-validator.test.ts | 37 +++++++++++++++++- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6aede3e..d5daa11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -139,6 +139,22 @@ Each node must have a unique ID. Generate a new UUID using crypto.randomUUID() - Conceived by Romuald Członkowski - [www.aiadvisors.pl/en](https://www.aiadvisors.pl/en) +### 🐛 Bug Fixes + +**Critical: AI Agent Validator Not Executing** + +Fixed nodeType format mismatch bug that prevented the AI Agent validator (Quick Win #3 above) from ever executing. + +**The Bug**: Switch case checked for `@n8n/n8n-nodes-langchain.agent` but nodeType was normalized to `nodes-langchain.agent` first, so validator never matched. + +**Fix**: Changed `enhanced-config-validator.ts:322` from `case '@n8n/n8n-nodes-langchain.agent':` to `case 'nodes-langchain.agent':` + +**Impact**: Without this fix, the AI Agent validator code from Quick Win #3 would never execute, missing 179 configuration errors (30% of failures). + +**Testing**: Added verification test in `enhanced-config-validator.test.ts:1137-1169` to ensure validator executes. + +**Discovery**: Found by n8n-mcp-tester agent during post-deployment verification of Quick Win #3. + ## [2.22.12] - 2025-01-08 ### 🐛 Bug Fixes diff --git a/data/nodes.db b/data/nodes.db index 288b78a92d92a2c76f8179ae73a9c6b1403e0d47..caaa50b5e8e7438b76aea94dae45e0c1b349656a 100644 GIT binary patch delta 4094 zcmWmD)3O){00hz4wr$(CZBA_4oFq54ZQHhO+qSX259bHEss|3dlXxJ;$BkS*P@tk+ z0|m-jD^Q@20f7SNjWZ!#*1+Wl$qH-*v4UE`tl(A%E2I_53T=h4!dl_1@KyvXq7})C zY(=r6TG6cNRtzhq70Zfk#j)aA@vQh(0xO}F$VzM_v65QJtmIY-E2WjnN^PaF(pu@P z^i~Edqm{|ZY-O>sTG_1ZRt_ttmCMR)<+1Ww`KT__qE*SNY*n$UTGg!TRt>ABRm-Yv)v@YY^{o0<1FNA$pGH<=tBKXr zYGyUJT39WuR#t1Pjn&p_XSKIFSRJiSR%fe=)z#`|b+>w0J*{3=Z>x{h*Xn2Ww+2`P ztwGjcYlt<}vNg;aZjG=4tdZ6zYqT}S8f%TS##|8_jn*b>v$e(AYHhQ& zTRW_s)-G$ewa40P?X&h<2dsnEA?vVp#5!snvyNLQtdrI$>$G*oI%}P?&RZ9(i`FIU zvUSC}YF)FgTQ{tm)-CI{b;r7E-Lvjn53GmQBkQsC#CmEyvz}Wote4g+>$Ua9dTYJ2 z-di86kJcyav-QRLYJIc5TR*Iy)-UU~^~d^a{R>dwF$#B>4ju?oEScr`{h>LiLj|51FL`aMzNQz`gjuc3VR7j09NQ-nxj||9& zOvsEZ$ck*pjvUB|T*!?)$cuc)j{+!&LMV(PD2iezjuI$|QYeiwD2s9^j|!-WN~nw~ zsETT+jvACfiG(&T=KufejYqUXIv_pGzKu2^!XLLbV zbVGOaKu`2SZ}dT5^h19Pz(5SbU<|=f7{f3eBM^X*7=_UogRvNg@tA;#n1sogf~lB> z>6n3;n1$JxgSnW8`B;F3ScJt`f~8o7$riNxP{xe zgS)tg`*?tdc!bAzf~R5v{7kP(@X8Cj4O*^nJMkQ2F(8+niy`H&w4P!NSs7)4MN z#ZVk2P!gq38f8!x?&yJ@=!M?sgTCm8{uqFP7=*zXf}t>mVK_!0 z03$I9qcH|!F%IJ~0TVF^lQ9KTF%8o(12ZuTvoQyAF%R>x01L4Qi?IYtu?)+x0xPi! ztFZ=au@3980UNOio3RC3u?^d?13R$`yRip*u@C!k00(ghhj9c)aSX?C0w-|_r*Q^n zaSrEk0T*!zmvIGGaShjT12=ICw{Zt|aS!+L01xp9kMRUg@eI%L0x$6juki+N@ec3t z0Uz-RpYa7>@eSYc13&Q#zwrlu@h?b#g0eq?ASi+%I6@#KLLoH5AS}WmJR%?>A|W!O zAS$9EI$|IuVj(u-ATHt|J`x}y5+N~?ASsd|IZ_}cQXw_cAT81%Ju)C8G9fdvAS<#V zJ8~c=av?YJATRPEKMJ5A3ZXEHpeTx=I7*--N})8$pe)LvJSw0fDxor}pem}NI%=RM zYN0mjpf2j6J{q7Q{_o!ijnM>6(G1Pe0xi)Bt4({R}?&AR- z;t?L>37+B^p5p~x;uT)w4c_7%-s1y4;uAjO3%=qTzT*de;un775B}m`&;SKve*{5L z1VeCyKuCl_XoNvnghO~lKtx1BWJEz!L_>7MKup9!Y{Wra#6x@}Ktd!!VkALQBtvqf kKuV-SYNSD0q(gdSKt^OjW@JHDWJ7l32)0K#gUv7aA12B4ZU6uP delta 4094 zcmWmD)3O){00hz4wr$(CZBA_4oFq54ZQHhO+qSX259bHEss|3dlXxJ;$BkS(P@tk+ z0|m-jD^Q@20f7SN`8y$9*1*LF$qH-*v4UE`tl(A%E2I_53T=h4!dl_1@KyvXq7})C zY(=r6TG6cNRtzhq70Zfk#j)aA@vQh(0xO}F$VzM_v65QJtmIY-E2WjnN^PaF(pu@P z^i~Edqm{|ZY-O>sTG_1ZRt_ttmCMR)<+1Ww`KT__qE*SNY*n$UTGg!TRt>ABRm-Yv)v@YY^{o0<1FNA$pGH<=tBKXr zYGyUJT39WuR#t1Pjn&p_XSKIFSRJiSR%fe=)z#`|b+>w0J*{3=Z>x{h*Xn2Ww+2`P ztwGjcYlt<}vNg;aZjG=4tdZ6zYqT}S8f%TS##|8_jn*b>v$e(AYHhQ& zTRW_s)-G$ewa40P?X&h<2dsnEA?vVp#5!snvyNLQtdrI$>$G*oI%}P?&RZ9(i`FIU zvUSC}YF)FgTQ{tm)-CI{b;r7E-Lvjn53GmQBkQsC#CmEyvz}Wote4g+>$Ua9dTYJ2 z-di86kJcyav-QRLYJIc5TR*Iy)-UU~^~d^a{R>dwF$#B>4ju?oEScr`{h>LiLj|51FL`aMzNQz`gjuc3VR7j09NQ-nxj||9& zOvsEZ$ck*pjvUB|T*!?)$cuc)j{+!&LMV(PD2iezjuI$|QYeiwD2s9^j|!-WN~nw~ zsETT+jvACfiG(&T=KufejYqUXIv_pGzKu2^!XLLbV zbVGOaKu`2SZ}dT5^h19Pz(5SbU<|=f7{f3eBM^X*7=_UogRvNg@tA;#n1sogf~lB> z>6n3;n1$JxgSnW8`B;F3ScJt`f~8o7$riNxP{xe zgS)tg`*?tdc!bAzf~R5v{7kP(@X8Cj4O*^nJMkQ2F(8+niy`H&w4P!NSs7)4MN z#ZVk2P!gq38f8!x?&yJ@=!M?sgTCm8{uqFP7=*zXf}t>mVK_!0 z03$I9qcH|!F%IJ~0TVF^lQ9KTF%8o(12ZuTvoQyAF%R>x01L4Qi?IYtu?)+x0xPi! ztFZ=au@3980UNOio3RC3u?^d?13R$`yRip*u@C!k00(ghhj9c)aSX?C0w-|_r*Q^n zaSrEk0T*!zmvIGGaShjT12=ICw{Zt|aS!+L01xp9kMRUg@eI%L0x$6juki+N@ec3t z0Uz-RpYa7>@eSYc13&Q#zwrlu@h?b#g0eq?ASi+%I6@#KLLoH5AS}WmJR%?>A|W!O zAS$9EI$|IuVj(u-ATHt|J`x}y5+N~?ASsd|IZ_}cQXw_cAT81%Ju)C8G9fdvAS<#V zJ8~c=av?YJATRPEKMJ5A3ZXEHpeTx=I7*--N})8$pe)LvJSw0fDxor}pem}NI%=RM zYN0mjpf2j6J{q7Q{_o!ijnM>6(G1Pe0xi)Bt4({R}?&AR- z;t?L>37+B^p5p~x;uT)w4c_7%-s1y4;uAjO3%=qTzT*de;un775B}m`&;SKve*{5L z1VeCyKuCl_XoNvnghO~lKtx1BWJEz!L_>7MKup9!Y{Wra#6x@}Ktd!!VkALQBtvqf kKuV-SYNSD0q(gdSKt^OjW@JHDWJ7l32)0K#gUv7aA3sd>K>z>% diff --git a/src/services/enhanced-config-validator.ts b/src/services/enhanced-config-validator.ts index 6c9c90f..3effd29 100644 --- a/src/services/enhanced-config-validator.ts +++ b/src/services/enhanced-config-validator.ts @@ -319,7 +319,7 @@ export class EnhancedConfigValidator extends ConfigValidator { NodeSpecificValidators.validateMySQL(context); break; - case '@n8n/n8n-nodes-langchain.agent': + case 'nodes-langchain.agent': NodeSpecificValidators.validateAIAgent(context); break; diff --git a/tests/unit/services/enhanced-config-validator.test.ts b/tests/unit/services/enhanced-config-validator.test.ts index 64df123..ac667cf 100644 --- a/tests/unit/services/enhanced-config-validator.test.ts +++ b/tests/unit/services/enhanced-config-validator.test.ts @@ -14,7 +14,8 @@ vi.mock('@/services/node-specific-validators', () => ({ validateMongoDB: vi.fn(), validateWebhook: vi.fn(), validatePostgres: vi.fn(), - validateMySQL: vi.fn() + validateMySQL: vi.fn(), + validateAIAgent: vi.fn() } })); @@ -1132,5 +1133,39 @@ describe('EnhancedConfigValidator', () => { }).not.toThrow(); }); }); + + describe('AI Agent node validation', () => { + it('should call validateAIAgent for AI Agent nodes', () => { + const nodeType = 'nodes-langchain.agent'; + const config = { + promptType: 'define', + text: 'You are a helpful assistant' + }; + const properties = [ + { name: 'promptType', type: 'options', required: true }, + { name: 'text', type: 'string', required: false } + ]; + + EnhancedConfigValidator.validateWithMode( + nodeType, + config, + properties, + 'operation', + 'ai-friendly' + ); + + // Verify the validator was called (fix for issue where it wasn't being called at all) + expect(NodeSpecificValidators.validateAIAgent).toHaveBeenCalledTimes(1); + + // Verify it was called with a context object containing our config + const callArgs = (NodeSpecificValidators.validateAIAgent as any).mock.calls[0][0]; + expect(callArgs).toHaveProperty('config'); + expect(callArgs.config).toEqual(config); + expect(callArgs).toHaveProperty('errors'); + expect(callArgs).toHaveProperty('warnings'); + expect(callArgs).toHaveProperty('suggestions'); + expect(callArgs).toHaveProperty('autofix'); + }); + }); }); }); \ No newline at end of file