diff --git a/packages/cli/src/modules/community-packages/__tests__/community-node-types.service.test.ts b/packages/cli/src/modules/community-packages/__tests__/community-node-types.service.test.ts index 89123800685..6b399a54c88 100644 --- a/packages/cli/src/modules/community-packages/__tests__/community-node-types.service.test.ts +++ b/packages/cli/src/modules/community-packages/__tests__/community-node-types.service.test.ts @@ -625,6 +625,57 @@ describe('CommunityNodeTypesService', () => { expect(result.find((n) => n.name === 'n8n-nodes-test3.test3Tool')).toBeUndefined(); }); + it('should not create AI tool version for nodes with trigger group', async () => { + const mockNodeTypes = [ + { + name: 'n8n-nodes-wcrm.wCRMTrigger', + packageName: 'n8n-nodes-wcrm', + nodeDescription: { + name: 'n8n-nodes-wcrm.wCRMTrigger', + displayName: 'wCRM Trigger', + group: ['trigger'], + inputs: [], + outputs: ['main'], + usableAsTool: true, + }, + }, + ]; + + (getCommunityNodeTypes as jest.Mock).mockResolvedValueOnce(mockNodeTypes); + + const result = await service.getCommunityNodeTypes(); + + expect(result.length).toBe(1); // only original, no tool version + expect(result.find((n) => n.name === 'n8n-nodes-wcrm.wCRMTriggerTool')).toBeUndefined(); + }); + + it('should create AI tool version for nodes with "trigger" in the name but not in the group', async () => { + // e.g. a node for the trigger.dev service — name contains "trigger" but it's not a trigger node + const mockNodeTypes = [ + { + name: 'n8n-nodes-triggerdev.triggerDevAction', + packageName: 'n8n-nodes-triggerdev', + nodeDescription: { + name: 'n8n-nodes-triggerdev.triggerDevAction', + displayName: 'Trigger.dev Action', + group: [], + inputs: ['main'], + outputs: ['main'], + usableAsTool: true, + }, + }, + ]; + + (getCommunityNodeTypes as jest.Mock).mockResolvedValueOnce(mockNodeTypes); + + const result = await service.getCommunityNodeTypes(); + + expect(result.length).toBe(2); // original + tool version + expect( + result.find((n) => n.name === 'n8n-nodes-triggerdev.triggerDevActionTool'), + ).toBeDefined(); + }); + it('should not mutate original node type when creating tool version', async () => { const mockNodeTypes = [ { diff --git a/packages/cli/src/modules/community-packages/community-node-types.service.ts b/packages/cli/src/modules/community-packages/community-node-types.service.ts index 5ba2c7338db..7fb44dcc9d8 100644 --- a/packages/cli/src/modules/community-packages/community-node-types.service.ts +++ b/packages/cli/src/modules/community-packages/community-node-types.service.ts @@ -148,7 +148,10 @@ export class CommunityNodeTypesService { private createAiTools() { const usableAsTools = Array.from(this.communityNodeTypes.values()).filter( - (nodeType) => nodeType.nodeDescription.usableAsTool && !isToolType(nodeType.name), + (nodeType) => + nodeType.nodeDescription.usableAsTool && + !isToolType(nodeType.name) && + !nodeType.nodeDescription.group?.includes('trigger'), ); const forbiddenCategories = ['Recommended Tools']; for (const nodeType of usableAsTools) {