From fa1c87f503a28dc02bd0363cdce36bf71681946d Mon Sep 17 00:00:00 2001 From: Jaakko Husso Date: Wed, 10 Dec 2025 17:19:08 +0200 Subject: [PATCH] feat(core): Add new Chat hub feature for chatting with LLMs and your n8n agent workflows (#23035) --- .../src/modules/__tests__/module-registry.test.ts | 7 +++---- .../backend-common/src/modules/module-registry.ts | 1 + .../@n8n/backend-common/src/modules/modules.config.ts | 2 +- packages/cli/src/modules/chat-hub/chat-hub.module.ts | 11 ----------- .../src/features/ai/chatHub/module.descriptor.ts | 2 +- 5 files changed, 6 insertions(+), 17 deletions(-) diff --git a/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts b/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts index 81e097c5760..632cac2a69f 100644 --- a/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts +++ b/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts @@ -15,10 +15,7 @@ beforeEach(() => { describe('eligibleModules', () => { it('should consider all default modules eligible', () => { - // 'chat-hub' isn't (yet) an eligible module by default - const NON_DEFAULT_MODULES = ['chat-hub']; - const expectedModules = MODULE_NAMES.filter((name) => !NON_DEFAULT_MODULES.includes(name)); - expect(Container.get(ModuleRegistry).eligibleModules).toEqual(expectedModules); + expect(Container.get(ModuleRegistry).eligibleModules).toEqual(MODULE_NAMES); }); it('should consider a module ineligible if it was disabled via env var', () => { @@ -31,6 +28,7 @@ describe('eligibleModules', () => { 'provisioning', 'breaking-changes', 'dynamic-credentials', + 'chat-hub', ]); }); @@ -45,6 +43,7 @@ describe('eligibleModules', () => { 'provisioning', 'breaking-changes', 'dynamic-credentials', + 'chat-hub', ]); }); diff --git a/packages/@n8n/backend-common/src/modules/module-registry.ts b/packages/@n8n/backend-common/src/modules/module-registry.ts index 7fc9e591686..76da1477827 100644 --- a/packages/@n8n/backend-common/src/modules/module-registry.ts +++ b/packages/@n8n/backend-common/src/modules/module-registry.ts @@ -38,6 +38,7 @@ export class ModuleRegistry { 'provisioning', 'breaking-changes', 'dynamic-credentials', + 'chat-hub', ]; private readonly activeModules: string[] = []; diff --git a/packages/@n8n/backend-common/src/modules/modules.config.ts b/packages/@n8n/backend-common/src/modules/modules.config.ts index 6c2cb14dd85..23dc3b9f6ae 100644 --- a/packages/@n8n/backend-common/src/modules/modules.config.ts +++ b/packages/@n8n/backend-common/src/modules/modules.config.ts @@ -8,10 +8,10 @@ export const MODULE_NAMES = [ 'community-packages', 'data-table', 'mcp', - 'chat-hub', 'provisioning', 'breaking-changes', 'dynamic-credentials', + 'chat-hub', ] as const; export type ModuleName = (typeof MODULE_NAMES)[number]; diff --git a/packages/cli/src/modules/chat-hub/chat-hub.module.ts b/packages/cli/src/modules/chat-hub/chat-hub.module.ts index 8c0f68c96d0..1576e59df6c 100644 --- a/packages/cli/src/modules/chat-hub/chat-hub.module.ts +++ b/packages/cli/src/modules/chat-hub/chat-hub.module.ts @@ -1,21 +1,10 @@ -import { Logger } from '@n8n/backend-common'; import type { ModuleInterface } from '@n8n/decorators'; import { BackendModule, OnShutdown } from '@n8n/decorators'; import { Container } from '@n8n/di'; -const YELLOW = '\x1b[33m'; -const CLEAR = '\x1b[0m'; -const WARNING_MESSAGE = - "[Chat] 'chat-hub' module is experimental, undocumented and subject to change. " + - 'Before its official release any features may become inaccessible at any point, ' + - 'and using the module could compromise the stability of your system. Use at your own risk!'; - @BackendModule({ name: 'chat-hub' }) export class ChatHubModule implements ModuleInterface { async init() { - const logger = Container.get(Logger).scoped('chat-hub'); - logger.warn(`${YELLOW}${WARNING_MESSAGE}${CLEAR}`); - await import('./chat-hub.controller'); await import('./chat-hub.settings.controller'); } diff --git a/packages/frontend/editor-ui/src/features/ai/chatHub/module.descriptor.ts b/packages/frontend/editor-ui/src/features/ai/chatHub/module.descriptor.ts index a5bf0623c7e..895811c7fc9 100644 --- a/packages/frontend/editor-ui/src/features/ai/chatHub/module.descriptor.ts +++ b/packages/frontend/editor-ui/src/features/ai/chatHub/module.descriptor.ts @@ -22,7 +22,7 @@ const SettingsChatHubView = async () => export const ChatModule: FrontendModuleDescription = { id: 'chat-hub', name: 'Chat', - description: 'Interact with various LLM models or your n8n AI agents.', + description: 'Chat with LLM models or your n8n AI agents.', icon: 'chat', modals: [ {