n8n-editor-ui
Version:
Workflow Editor UI for n8n
1,185 lines • 91.8 kB
JavaScript
;
(function () {
System.register(["./vue.runtime.esm-bundler-legacy--Sn1h8On.js", "./_MapCache-legacy-DlYNX_X1.js", "./src-legacy-uZTNWMC0.js", "./en-legacy-DJK4SpPN.js", "./preload-helper-legacy-CXRjoQ0T.js", "./_plugin-vue_export-helper-legacy-DZMI5HPp.js", "./truncate-legacy-BGje52Or.js", "./icon-legacy-CqVXaCIS.js", "./empty-legacy-CA9D6itE.js", "./useTelemetry-legacy-B3pzzkAE.js", "./useToast-legacy-C4Vu5mt9.js", "./sanitize-html-legacy-DLqXJu-U.js", "./CalendarDate-legacy-BUvNgcoo.js", "./path-browserify-legacy-C6ml8BkF.js", "./constants-legacy-TKxWCqvM.js", "./merge-legacy-8xjIc_ts.js", "./_baseOrderBy-legacy-CB2Dh5d_.js", "./dateformat-legacy-C4HUJTCr.js", "./useDebounce-legacy-CqZ-fJEm.js", "./useExternalHooks-legacy-8pg6K3ln.js", "./useStyles-legacy-E8NPEyeD.js", "./npsSurvey.store-legacy-mkSIzcGP.js", "./cloudPlan.store-legacy-U_Bztyyz.js", "./templates.store-legacy-BBcmaAs_.js", "./focusPanel.store-legacy-DdqLHRV1.js", "./retry-legacy-CTwsGM7o.js", "./executions.store-legacy-COqSks8S.js", "./usePinnedData-legacy-CfMMmXZ8.js", "./nodeCreator.store-legacy-BeEd3d8s.js", "./nodeIcon-legacy-D1wFvzkX.js", "./useClipboard-legacy-DEPZr2pv.js", "./useCanvasOperations-legacy-CXe_JeOj.js", "./folders.store-legacy-DbpbLgJq.js", "./NodeIcon-legacy-D0j2KPV5.js", "./versions.store-legacy-BtvVzXUy.js", "./banners.store-legacy-BstdBex0.js", "./dataTable.store-legacy-CZUet4xq.js", "./ProjectIcon-legacy-BKmF89ad.js", "./CredentialIcon-legacy-hdZE46El.js", "./TimeAgo-legacy-okNrPxgf.js", "./roles.store-legacy-DLKI2yRw.js", "./sso.store-legacy-Bv88fDKQ.js", "./router-legacy-jkqiJdjQ.js", "./insights.store-legacy-Ci1jdwui.js", "./insights.constants-legacy-CQF1GF20.js", "./insights.utils-legacy-3m1-63_a.js", "./mcp.constants-legacy-BkbTHrFy.js", "./constants-legacy-DjFSod4r.js", "./chat.store-legacy-2uSv5jQT.js", "./fileUtils-legacy-BbiGYBne.js", "./useRecentResources-legacy-acZiOM1Z.js", "./useMcp-legacy-DUAuzsHK.js", "./mcp.store-legacy-DtuA43Qr.js"], function (_export, _context) {
"use strict";
var computed, toDisplayString, createElementBlock, createCommentVNode, unref, ref, createVNode, defineComponent, createBlock, onMounted, renderSlot, normalizeStyle, withCtx, openBlock, createTextVNode, vShow, normalizeClass, createBaseVNode, withDirectives, useI18n, N8nActionBox_default, N8nNotice_default, N8nInfoTip_default, N8nButton_default, N8nInfoAccordion_default, N8nMarkdown_default, ElSwitch, N8nText_default, N8nIcon_default, N8nActionToggle_default, N8nTabs_default, N8nTooltip_default, N8nDataTableServer_default, N8nLoading_default, N8nLink_default, N8nHeading_default, __plugin_vue_export_helper_default, useDocumentTitle, useUsersStore, useWorkflowsStore, useTelemetry, useToast, VIEWS, useRootStore, useClipboard, isIconOrEmoji, ProjectIcon_default, TimeAgo_default, router_default, MCP_DOCS_PAGE_URL, LOADING_INDICATOR_TIMEOUT, useMcp, useMCPStore, __vite_style__, ConnectionParameter_vue_vue_type_script_setup_true_lang_default, container$4, ConnectionParameter_vue_vue_type_style_index_0_lang_module_default, cssModules$7, ConnectionParameter_default, _hoisted_1$2, _hoisted_2$1, _hoisted_3$1, OAuthClientsTable_vue_vue_type_script_setup_true_lang_default, header$1, OAuthClientsTable_vue_vue_type_style_index_0_lang_module_default, cssModules$6, OAuthClientsTable_default, OAuthConnectionInstructions_vue_vue_type_script_setup_true_lang_default, container$3, instructions$1, item$1, label$1, url$1, OAuthConnectionInstructions_vue_vue_type_style_index_0_lang_module_default, cssModules$5, OAuthConnectionInstructions_default, AccessTokenConnectionInstructions_vue_vue_type_script_setup_true_lang_default, container$2, instructions, item, label, url, connectionString, AccessTokenConnectionInstructions_vue_vue_type_style_index_0_lang_module_default, cssModules$4, AccessTokenConnectionInstructions_default, _hoisted_1$1, MCP_ENDPOINT, MCPConnectionInstructions_vue_vue_type_script_setup_true_lang_default, container$1, MCPConnectionInstructions_vue_vue_type_style_index_0_lang_module_default, cssModules$3, MCPConnectionInstructions_default, _hoisted_1, _hoisted_2, _hoisted_3, _hoisted_4, WorkflowsTable_vue_vue_type_script_setup_true_lang_default, header, separator, ellipsis, WorkflowsTable_vue_vue_type_style_index_0_lang_module_default, cssModules$2, WorkflowsTable_default, McpAccessToggle_vue_vue_type_script_setup_true_lang_default, McpAccessToggle_vue_vue_type_style_index_0_lang_module_default, cssModules$1, McpAccessToggle_default, SettingsMCPView_vue_vue_type_script_setup_true_lang_default, container, SettingsMCPView_vue_vue_type_style_index_0_lang_module_default, cssModules, SettingsMCPView_default;
return {
setters: [function (_vueRuntimeEsmBundlerLegacy003Js) {
computed = _vueRuntimeEsmBundlerLegacy003Js.C;
toDisplayString = _vueRuntimeEsmBundlerLegacy003Js.Cn;
createElementBlock = _vueRuntimeEsmBundlerLegacy003Js.D;
createCommentVNode = _vueRuntimeEsmBundlerLegacy003Js.E;
unref = _vueRuntimeEsmBundlerLegacy003Js.Gt;
ref = _vueRuntimeEsmBundlerLegacy003Js.It;
createVNode = _vueRuntimeEsmBundlerLegacy003Js.M;
defineComponent = _vueRuntimeEsmBundlerLegacy003Js.P;
createBlock = _vueRuntimeEsmBundlerLegacy003Js.T;
onMounted = _vueRuntimeEsmBundlerLegacy003Js.Z;
renderSlot = _vueRuntimeEsmBundlerLegacy003Js.at;
normalizeStyle = _vueRuntimeEsmBundlerLegacy003Js.bn;
withCtx = _vueRuntimeEsmBundlerLegacy003Js.bt;
openBlock = _vueRuntimeEsmBundlerLegacy003Js.et;
createTextVNode = _vueRuntimeEsmBundlerLegacy003Js.j;
vShow = _vueRuntimeEsmBundlerLegacy003Js.p;
normalizeClass = _vueRuntimeEsmBundlerLegacy003Js.vn;
createBaseVNode = _vueRuntimeEsmBundlerLegacy003Js.w;
withDirectives = _vueRuntimeEsmBundlerLegacy003Js.xt;
}, function (_MapCacheLegacy005Js) {
useI18n = _MapCacheLegacy005Js.gt;
}, function (_srcLegacy007Js) {
N8nActionBox_default = _srcLegacy007Js.Ct;
N8nNotice_default = _srcLegacy007Js.D;
N8nInfoTip_default = _srcLegacy007Js.F;
N8nButton_default = _srcLegacy007Js.Hn;
N8nInfoAccordion_default = _srcLegacy007Js.I;
N8nMarkdown_default = _srcLegacy007Js.M;
ElSwitch = _srcLegacy007Js.Tt;
N8nText_default = _srcLegacy007Js.Vn;
N8nIcon_default = _srcLegacy007Js.Wn;
N8nActionToggle_default = _srcLegacy007Js.et;
N8nTabs_default = _srcLegacy007Js.g;
N8nTooltip_default = _srcLegacy007Js.mt;
N8nDataTableServer_default = _srcLegacy007Js.s;
N8nLoading_default = _srcLegacy007Js.tt;
N8nLink_default = _srcLegacy007Js.ut;
N8nHeading_default = _srcLegacy007Js.zn;
}, function (_enLegacy00bJs) {}, function (_preloadHelperLegacy00dJs) {}, function (_pluginVue_exportHelperLegacy00fJs) {
__plugin_vue_export_helper_default = _pluginVue_exportHelperLegacy00fJs.t;
}, function (_truncateLegacy00hJs) {}, function (_iconLegacy00nJs) {}, function (_emptyLegacy00vJs) {}, function (_useTelemetryLegacy00HJs) {
useDocumentTitle = _useTelemetryLegacy00HJs.Tn;
useUsersStore = _useTelemetryLegacy00HJs.nr;
useWorkflowsStore = _useTelemetryLegacy00HJs.o;
useTelemetry = _useTelemetryLegacy00HJs.t;
}, function (_useToastLegacy00JJs) {
useToast = _useToastLegacy00JJs.t;
}, function (_sanitizeHtmlLegacy00LJs) {}, function (_CalendarDateLegacy00NJs) {}, function (_pathBrowserifyLegacy00RJs) {}, function (_constantsLegacy00TJs) {
VIEWS = _constantsLegacy00TJs.Io;
}, function (_mergeLegacy00VJs) {}, function (_baseOrderByLegacy00ZJs) {
useRootStore = _baseOrderByLegacy00ZJs.r;
}, function (_dateformatLegacy00$Js) {}, function (_useDebounceLegacy011Js) {}, function (_useExternalHooksLegacy013Js) {}, function (_useStylesLegacy015Js) {}, function (_npsSurveyStoreLegacy01bJs) {}, function (_cloudPlanStoreLegacy01dJs) {}, function (_templatesStoreLegacy01fJs) {}, function (_focusPanelStoreLegacy01hJs) {}, function (_retryLegacy01lJs) {}, function (_executionsStoreLegacy01nJs) {}, function (_usePinnedDataLegacy01rJs) {}, function (_nodeCreatorStoreLegacy01tJs) {}, function (_nodeIconLegacy01vJs) {}, function (_useClipboardLegacy01xJs) {
useClipboard = _useClipboardLegacy01xJs.t;
}, function (_useCanvasOperationsLegacy01zJs) {}, function (_foldersStoreLegacy01DJs) {}, function (_NodeIconLegacy01FJs) {}, function (_versionsStoreLegacy01LJs) {}, function (_bannersStoreLegacy01PJs) {}, function (_dataTableStoreLegacy01RJs) {}, function (_ProjectIconLegacy02fJs) {
isIconOrEmoji = _ProjectIconLegacy02fJs.n;
ProjectIcon_default = _ProjectIconLegacy02fJs.t;
}, function (_CredentialIconLegacy02lJs) {}, function (_TimeAgoLegacy02TJs) {
TimeAgo_default = _TimeAgoLegacy02TJs.t;
}, function (_rolesStoreLegacy02ZJs) {}, function (_ssoStoreLegacy039Js) {}, function (_routerLegacy03bJs) {
router_default = _routerLegacy03bJs.t;
}, function (_insightsStoreLegacy03dJs) {}, function (_insightsConstantsLegacy03fJs) {}, function (_insightsUtilsLegacy03hJs) {}, function (_mcpConstantsLegacy03jJs) {
MCP_DOCS_PAGE_URL = _mcpConstantsLegacy03jJs.n;
LOADING_INDICATOR_TIMEOUT = _mcpConstantsLegacy03jJs.t;
}, function (_constantsLegacy03lJs) {}, function (_chatStoreLegacy03nJs) {}, function (_fileUtilsLegacy03pJs) {}, function (_useRecentResourcesLegacy03rJs) {}, function (_useMcpLegacy03JJs) {
useMcp = _useMcpLegacy03JJs.t;
}, function (_mcpStoreLegacy04VJs) {
useMCPStore = _mcpStoreLegacy04VJs.t;
}],
execute: function () {
__vite_style__ = document.createElement('style');
__vite_style__.textContent = "/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._container_9i963_123 {\n display: flex;\n align-items: stretch;\n gap: var(--spacing--2xs);\n background: var(--color--background--light-3);\n border: var(--border);\n border-radius: var(--radius);\n font-size: var(--font-size--sm);\n overflow: hidden;\n}\n._container_9i963_123 button {\n border: none;\n border-radius: 0;\n}\n._container_9i963_123 button:hover {\n border-color: inherit;\n}\n._container_9i963_123 button + button {\n border-left: var(--border);\n}\n@media screen and (max-width: 820px) {\n._container_9i963_123 {\n word-wrap: break-word;\n margin-top: var(--spacing--2xs);\n}\n}\ncode {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: pre;\n padding: var(--spacing--2xs) var(--spacing--3xs);\n}\n._copy-button-wrapper_9i963_157 {\n display: flex;\n align-items: center;\n border-left: var(--border);\n}\n._copy-button_9i963_157 {\n border: none;\n border-radius: 0;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._header_yr8i2_123 {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._container_k3h69_123 {\n display: flex;\n flex-direction: column;\n padding: var(--spacing--xs) var(--spacing--xs) 0;\n}\n._instructions_k3h69_129 {\n display: flex;\n flex-direction: column;\n gap: var(--spacing--xs);\n padding-left: var(--spacing--lg);\n margin: var(--spacing--sm);\n}\n._instructions_k3h69_129 li {\n min-height: var(--spacing--lg);\n}\n._instructions_k3h69_129 ._item_k3h69_139 {\n display: flex;\n align-items: center;\n gap: var(--spacing--2xs);\n}\n._instructions_k3h69_129 ._item_k3h69_139 .n8n-loading div {\n height: 32px;\n width: 300px;\n margin: 0;\n}\n._instructions_k3h69_129 ._label_k3h69_149 {\n font-size: var(--font-size--sm);\n flex: none;\n}\n._instructions_k3h69_129 ._url_k3h69_153 {\n display: flex;\n align-items: stretch;\n gap: var(--spacing--2xs);\n background: var(--color--background--light-3);\n border: var(--border);\n border-radius: var(--radius);\n font-size: var(--font-size--sm);\n overflow: hidden;\n}\n._instructions_k3h69_129 ._url_k3h69_153 code {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: pre;\n padding: var(--spacing--2xs) var(--spacing--3xs);\n}\n._instructions_k3h69_129 ._url_k3h69_153 ._copy-url-wrapper_k3h69_169 {\n display: flex;\n align-items: center;\n border-left: var(--border);\n}\n._instructions_k3h69_129 ._url_k3h69_153 ._copy-url-button_k3h69_174 {\n border: none;\n border-radius: 0;\n}\n@media screen and (max-width: 820px) {\n._instructions_k3h69_129 ._url_k3h69_153 {\n word-wrap: break-word;\n margin-top: var(--spacing--2xs);\n}\n}\n._clients-table_k3h69_185 {\n padding: 0 var(--spacing--lg);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._container_1r8bk_123 {\n display: flex;\n flex-direction: column;\n padding: var(--spacing--xs);\n}\n._instructions-container_1r8bk_129 .notice {\n margin: var(--spacing--sm) var(--spacing--lg) var(--spacing--md);\n}\n._instructions_1r8bk_129 {\n display: flex;\n flex-direction: column;\n gap: var(--spacing--xs);\n padding-left: var(--spacing--lg);\n margin: var(--spacing--sm);\n}\n._instructions_1r8bk_129 li {\n min-height: var(--spacing--lg);\n}\n._instructions_1r8bk_129 ._item_1r8bk_143 {\n display: flex;\n align-items: center;\n gap: var(--spacing--2xs);\n}\n._instructions_1r8bk_129 ._item_1r8bk_143 .n8n-loading div {\n height: 32px;\n width: 300px;\n margin: 0;\n}\n._instructions_1r8bk_129 ._label_1r8bk_153 {\n font-size: var(--font-size--sm);\n flex: none;\n}\n._instructions_1r8bk_129 ._url_1r8bk_157 {\n display: flex;\n align-items: stretch;\n gap: var(--spacing--2xs);\n background: var(--color--background--light-3);\n border: var(--border);\n border-radius: var(--radius);\n font-size: var(--font-size--sm);\n overflow: hidden;\n}\n._instructions_1r8bk_129 ._url_1r8bk_157 code {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: pre;\n padding: var(--spacing--2xs) var(--spacing--3xs);\n}\n._instructions_1r8bk_129 ._url_1r8bk_157 ._copy-url-wrapper_1r8bk_173 {\n display: flex;\n align-items: center;\n border-left: var(--border);\n}\n._instructions_1r8bk_129 ._url_1r8bk_157 ._copy-url-button_1r8bk_178 {\n border: none;\n border-radius: 0;\n}\n@media screen and (max-width: 820px) {\n._instructions_1r8bk_129 ._url_1r8bk_157 {\n word-wrap: break-word;\n margin-top: var(--spacing--2xs);\n}\n}\n._connectionString_1r8bk_189 {\n flex-grow: 1;\n position: relative;\n padding: 0 var(--spacing--lg);\n margin-bottom: var(--spacing--sm);\n}\n._connectionString_1r8bk_189 .n8n-markdown {\n width: 100%;\n}\n._connectionString_1r8bk_189 code {\n font-size: var(--font-size--xs);\n tab-size: 1;\n}\n._connectionString_1r8bk_189:hover ._copy-json-button_1r8bk_202 {\n display: flex;\n}\n._copy-json-button_1r8bk_202 {\n position: absolute;\n top: var(--spacing--xl);\n right: var(--spacing--2xl);\n display: none;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._container_1n2r0_123 {\n display: flex;\n flex-direction: column;\n gap: var(--spacing--md);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._workflow-table-container_1c109_123 .table-pagination {\n display: none;\n}\n._header_1c109_127 {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n._workflow-table_1c109_123 tr:last-child {\n border-bottom: none !important;\n}\n._workflow-cell_1c109_137,\n._parent-folder_1c109_138 {\n display: flex;\n align-items: center;\n gap: var(--spacing--4xs);\n}\n._workflow-cell_1c109_137 ._separator_1c109_143,\n._workflow-cell_1c109_137 ._ellipsis_1c109_144,\n._parent-folder_1c109_138 ._separator_1c109_143,\n._parent-folder_1c109_138 ._ellipsis_1c109_144 {\n padding-bottom: 1px;\n color: var(--color--text--tint-1);\n}\n._description-cell_1c109_151 {\n display: -webkit-inline-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n line-clamp: 3;\n overflow: hidden;\n font-style: italic;\n}\n._description-popper_1c109_160 {\n min-width: 300px;\n}\n._table-link_1c109_164 {\n color: var(--color--text);\n}\n._table-link_1c109_164 .n8n-text {\n display: flex;\n align-items: center;\n gap: var(--spacing--3xs);\n}\n._table-link_1c109_164 .n8n-text ._link-icon_1c109_172 {\n display: none;\n}\n._table-link_1c109_164 .n8n-text:hover ._link-icon_1c109_172 {\n display: inline-flex;\n}\n._table-link_1c109_164._project-link_1c109_178 .n8n-text {\n gap: 0;\n}\n._table-link_1c109_164._project-link_1c109_178 ._link-icon_1c109_172 {\n margin-left: var(--spacing--3xs);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._mcp-access-toggle_p4msq_123 {\n display: flex;\n flex-direction: column;\n gap: var(--spacing--sm);\n width: 100%;\n}\n._main-toggle-container_p4msq_130 {\n display: flex;\n align-items: center;\n padding: var(--spacing--sm);\n justify-content: space-between;\n flex-shrink: 0;\n border-radius: var(--radius);\n border: var(--border);\n}\n._main-toggle-info_p4msq_140 {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n}\n._main-toggle_p4msq_130 {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n flex-shrink: 0;\n}\n._toggle-notice_p4msq_154 {\n display: flex;\n align-items: center;\n gap: var(--spacing--4xs);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._container_727ie_123 {\n display: flex;\n flex-direction: column;\n gap: var(--spacing--lg);\n}/*$vite$:1*/";
document.head.appendChild(__vite_style__);
//#region src/features/ai/mcpAccess/components/connectionInstructions/ConnectionParameter.vue?vue&type=script&setup=true&lang.ts
ConnectionParameter_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "ConnectionParameter",
props: {
value: {},
allowCopy: {
type: Boolean,
default: true
},
maxWidth: {
default: void 0
}
},
emits: ["copy"],
setup(__props, {
emit: __emit
}) {
const {
copy,
copied,
isSupported
} = useClipboard();
const i18n = useI18n();
const props = __props;
const emit = __emit;
const handleCopy = async value => {
await copy(value);
emit("copy", value);
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.container),
style: normalizeStyle({
maxWidth: props.maxWidth ? props.maxWidth + "px" : "none"
})
}, [createBaseVNode("code", null, toDisplayString(props.value), 1), createBaseVNode("div", {
class: normalizeClass(_ctx.$style["copy-button-wrapper"])
}, [renderSlot(_ctx.$slots, "customActions"), createVNode(unref(N8nTooltip_default), {
disables: !unref(isSupported),
content: unref(copied) ? unref(i18n).baseText("generic.copied") : unref(i18n).baseText("generic.copy"),
placement: "right"
}, {
default: withCtx(() => [props.allowCopy && unref(isSupported) ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 0,
type: "tertiary",
icon: unref(copied) ? "clipboard-check" : "clipboard",
square: true,
class: normalizeClass(_ctx.$style["copy-button"]),
onClick: _cache[0] || (_cache[0] = $event => handleCopy(props.value))
}, null, 8, ["icon", "class"])) : createCommentVNode("", true)]),
_: 1
}, 8, ["disables", "content"])], 2)], 6);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/ConnectionParameter.vue?vue&type=style&index=0&lang.module.scss
container$4 = "_container_9i963_123";
ConnectionParameter_vue_vue_type_style_index_0_lang_module_default = {
container: container$4,
"copy-button-wrapper": "_copy-button-wrapper_9i963_157",
"copy-button": "_copy-button_9i963_157"
}; //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/ConnectionParameter.vue
cssModules$7 = {
"$style": ConnectionParameter_vue_vue_type_style_index_0_lang_module_default
};
ConnectionParameter_default = /* @__PURE__ */__plugin_vue_export_helper_default(ConnectionParameter_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$7]]); //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/OAuthClientsTable.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$2 = {
"data-test-id": "oauth-clients-table"
};
_hoisted_2$1 = {
key: 0
};
_hoisted_3$1 = {
key: 1,
class: "mt-s mb-xl"
};
OAuthClientsTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "OAuthClientsTable",
props: {
clients: {},
loading: {
type: Boolean
}
},
emits: ["revokeClient", "refresh"],
setup(__props, {
emit: __emit
}) {
const i18n = useI18n();
const props = __props;
const emit = __emit;
const tableHeaders = ref([{
title: i18n.baseText("settings.mcp.oAuthClients.table.clientName"),
key: "name",
width: 250,
disableSort: true,
value(client) {
return client.name;
}
}, {
title: i18n.baseText("settings.mcp.oAuthClients.table.connectedAt"),
key: "createdAt",
width: 250,
disableSort: true,
value() {}
}, {
title: "",
key: "actions",
align: "end",
width: 50,
disableSort: true,
value() {}
}]);
const tableActions = ref([{
label: i18n.baseText("settings.mcp.oAuthClients.table.action.revokeAccess"),
value: "revokeClient"
}]);
const onTableAction = (action, item$2) => {
if (action === "revokeClient") emit("revokeClient", item$2);
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", _hoisted_1$2, [props.loading ? (openBlock(), createElementBlock("div", _hoisted_2$1, [createVNode(unref(N8nLoading_default), {
loading: props.loading,
variant: "h1",
class: "mb-l"
}, null, 8, ["loading"]), createVNode(unref(N8nLoading_default), {
loading: props.loading,
variant: "p",
rows: 5,
"shrink-last": false
}, null, 8, ["loading"])])) : (openBlock(), createElementBlock("div", _hoisted_3$1, [createBaseVNode("div", {
class: normalizeClass([_ctx.$style.header, "mb-s"])
}, [createVNode(unref(N8nHeading_default), {
size: "medium",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.oAuthClients.heading")) + " (" + toDisplayString(props.clients.length) + ") ", 1)]),
_: 1
}), createVNode(unref(N8nTooltip_default), {
content: unref(i18n).baseText("settings.mcp.refresh.tooltip")
}, {
default: withCtx(() => [createVNode(unref(N8nButton_default), {
"data-test-id": "mcp-oauth-clients-refresh-button",
size: "small",
type: "tertiary",
icon: "refresh-cw",
square: true,
onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit("refresh"))
})]),
_: 1
}, 8, ["content"])], 2), props.clients.length === 0 ? (openBlock(), createBlock(unref(N8nActionBox_default), {
key: 0,
"data-test-id": "empty-oauth-clients-list-box",
heading: unref(i18n).baseText("settings.mcp.oAuthClients.table.empty.title")
}, null, 8, ["heading"])) : (openBlock(), createBlock(unref(N8nDataTableServer_default), {
key: 1,
"data-test-id": "oauth-clients-data-table",
headers: tableHeaders.value,
items: props.clients,
"items-length": props.clients.length
}, {
[`item.createdAt`]: withCtx(({
item: item$2
}) => [createVNode(unref(N8nText_default), {
"data-test-id": "mcp-client-created-at"
}, {
default: withCtx(() => [createVNode(TimeAgo_default, {
date: String(item$2.createdAt)
}, null, 8, ["date"])]),
_: 2
}, 1024)]),
[`item.actions`]: withCtx(({
item: item$2
}) => [createVNode(unref(N8nActionToggle_default), {
"data-test-id": "mcp-oauth-client-action-toggle",
placement: "bottom",
actions: tableActions.value,
theme: "dark",
onAction: $event => onTableAction($event, item$2)
}, null, 8, ["actions", "onAction"])]),
_: 2
}, 1032, ["headers", "items", "items-length"]))]))]);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/OAuthClientsTable.vue?vue&type=style&index=0&lang.module.scss
header$1 = "_header_yr8i2_123";
OAuthClientsTable_vue_vue_type_style_index_0_lang_module_default = {
header: header$1
}; //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/OAuthClientsTable.vue
cssModules$6 = {
"$style": OAuthClientsTable_vue_vue_type_style_index_0_lang_module_default
};
OAuthClientsTable_default = /* @__PURE__ */__plugin_vue_export_helper_default(OAuthClientsTable_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$6]]); //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/OAuthConnectionInstructions.vue?vue&type=script&setup=true&lang.ts
OAuthConnectionInstructions_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "OAuthConnectionInstructions",
props: {
serverUrl: {},
clients: {},
clientsLoading: {
type: Boolean
}
},
emits: ["revokeClient", "refresh", "urlCopied"],
setup(__props, {
emit: __emit
}) {
const props = __props;
const emit = __emit;
const i18n = useI18n();
const onRefreshOAuthClients = () => {
emit("refresh");
};
const onRevokeClientAccess = client => {
emit("revokeClient", client);
};
const onUrlCopied = url$2 => {
emit("urlCopied", url$2);
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.container)
}, [createBaseVNode("ol", {
class: normalizeClass(_ctx.$style.instructions)
}, [createBaseVNode("li", null, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.item)
}, [createBaseVNode("span", {
class: normalizeClass(_ctx.$style.label)
}, toDisplayString(unref(i18n).baseText("settings.mcp.instructions.enableAccess")), 3)], 2)]), createBaseVNode("li", null, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.item)
}, [createBaseVNode("span", {
class: normalizeClass(_ctx.$style.label)
}, toDisplayString(unref(i18n).baseText("settings.mcp.instructions.serverUrl")) + ": ", 3), createVNode(ConnectionParameter_default, {
value: props.serverUrl,
onCopy: onUrlCopied
}, null, 8, ["value"])], 2)])], 2), createBaseVNode("div", {
class: normalizeClass(_ctx.$style["clients-table"])
}, [createVNode(OAuthClientsTable_default, {
"data-test-id": "mcp-oauth-clients-table",
clients: props.clients,
loading: props.clientsLoading,
onRevokeClient: onRevokeClientAccess,
onRefresh: onRefreshOAuthClients
}, null, 8, ["clients", "loading"])], 2)], 2);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/OAuthConnectionInstructions.vue?vue&type=style&index=0&lang.module.scss
container$3 = "_container_k3h69_123";
instructions$1 = "_instructions_k3h69_129";
item$1 = "_item_k3h69_139";
label$1 = "_label_k3h69_149";
url$1 = "_url_k3h69_153";
OAuthConnectionInstructions_vue_vue_type_style_index_0_lang_module_default = {
container: container$3,
instructions: instructions$1,
item: item$1,
label: label$1,
url: url$1,
"copy-url-wrapper": "_copy-url-wrapper_k3h69_169",
"copy-url-button": "_copy-url-button_k3h69_174",
"clients-table": "_clients-table_k3h69_185"
}; //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/OAuthConnectionInstructions.vue
cssModules$5 = {
"$style": OAuthConnectionInstructions_vue_vue_type_style_index_0_lang_module_default
};
OAuthConnectionInstructions_default = /* @__PURE__ */__plugin_vue_export_helper_default(OAuthConnectionInstructions_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$5]]); //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/AccessTokenConnectionInstructions.vue?vue&type=script&setup=true&lang.ts
AccessTokenConnectionInstructions_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "AccessTokenConnectionInstructions",
props: {
serverUrl: {},
apiKey: {},
loadingApiKey: {
type: Boolean
}
},
emits: ["rotateKey", "urlCopied", "accessTokenCopied", "connectionStringCopied"],
setup(__props, {
emit: __emit
}) {
const props = __props;
const emit = __emit;
const {
copy,
copied,
isSupported
} = useClipboard();
const i18n = useI18n();
const connectionString$1 = computed(() => {
return `
{
"mcpServers": {
"n8n-mcp": {
"command": "npx",
"args": [
"-y",
"supergateway",
"--streamableHttp",
"${props.serverUrl}",
"--header",
"authorization:Bearer ${apiKeyText.value}"
]
}
}
}
`;
});
const isKeyRedacted = computed(() => {
return props.apiKey.apiKey.includes("******");
});
const connectionCode = computed(() => {
return `\`\`\`json${connectionString$1.value}\`\`\``;
});
const apiKeyText = computed(() => {
if (props.loadingApiKey) return `<${i18n.baseText("generic.loading")}...>`;
return isKeyRedacted.value ? "<YOUR_ACCESS_TOKEN_HERE>" : props.apiKey.apiKey;
});
const handleConnectionStringCopy = async () => {
await copy(connectionString$1.value);
emit("connectionStringCopied");
};
const handleUrlCopy = url$2 => {
emit("urlCopied", url$2);
};
const handleAccessTokenCopy = () => {
emit("accessTokenCopied");
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.container)
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style["instructions-container"])
}, [createBaseVNode("ol", {
class: normalizeClass(_ctx.$style.instructions)
}, [createBaseVNode("li", null, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.item)
}, [createBaseVNode("span", {
class: normalizeClass(_ctx.$style.label)
}, toDisplayString(unref(i18n).baseText("settings.mcp.instructions.enableAccess")), 3)], 2)]), createBaseVNode("li", null, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.item)
}, [createBaseVNode("span", {
class: normalizeClass(_ctx.$style.label)
}, toDisplayString(unref(i18n).baseText("settings.mcp.instructions.serverUrl")) + ": ", 3), createVNode(ConnectionParameter_default, {
value: props.serverUrl,
onCopy: handleUrlCopy
}, null, 8, ["value"])], 2)]), createBaseVNode("li", null, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.item)
}, [createBaseVNode("span", {
class: normalizeClass(_ctx.$style.label)
}, toDisplayString(unref(i18n).baseText("settings.mcp.instructions.apiKey.label")) + ": ", 3), props.loadingApiKey ? (openBlock(), createBlock(unref(N8nLoading_default), {
key: 0,
loading: props.loadingApiKey,
class: normalizeClass(_ctx.$style["api-key-loader"])
}, null, 8, ["loading", "class"])) : (openBlock(), createBlock(ConnectionParameter_default, {
key: 1,
value: props.apiKey.apiKey,
"max-width": 400,
"allow-copy": !isKeyRedacted.value,
onCopy: handleAccessTokenCopy
}, {
customActions: withCtx(() => [createVNode(unref(N8nTooltip_default), {
content: unref(i18n).baseText("settings.mcp.instructions.rotateKey.tooltip")
}, {
default: withCtx(() => [createVNode(unref(N8nButton_default), {
type: "tertiary",
icon: "refresh-cw",
square: true,
onClick: _cache[0] || (_cache[0] = $event => emit("rotateKey"))
})]),
_: 1
}, 8, ["content"])]),
_: 1
}, 8, ["value", "allow-copy"])), !props.loadingApiKey ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 2,
type: "tooltip",
"tooltip-placement": "right"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.instructions.apiKey.tip")), 1)]),
_: 1
})) : createCommentVNode("", true)], 2)])], 2), !isKeyRedacted.value && !props.loadingApiKey ? (openBlock(), createBlock(unref(N8nNotice_default), {
key: 0,
theme: "warning",
class: normalizeClass(_ctx.$style["copy-key-notice"]),
content: unref(i18n).baseText("settings.mcp.newKey.notice")
}, null, 8, ["class", "content"])) : createCommentVNode("", true)], 2), createBaseVNode("div", {
class: normalizeClass(_ctx.$style.connectionString)
}, [createVNode(unref(N8nInfoAccordion_default), {
title: unref(i18n).baseText("settings.mcp.instructions.json")
}, {
customContent: withCtx(() => [createVNode(unref(N8nMarkdown_default), {
content: connectionCode.value
}, null, 8, ["content"]), createVNode(unref(N8nTooltip_default), {
disabled: !unref(isSupported),
content: unref(copied) ? unref(i18n).baseText("generic.copied") : unref(i18n).baseText("generic.copy")
}, {
default: withCtx(() => [unref(isSupported) && !props.loadingApiKey ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 0,
type: "tertiary",
icon: unref(copied) ? "clipboard-check" : "clipboard",
square: true,
class: normalizeClass(_ctx.$style["copy-json-button"]),
onClick: handleConnectionStringCopy
}, null, 8, ["icon", "class"])) : createCommentVNode("", true)]),
_: 1
}, 8, ["disabled", "content"])]),
_: 1
}, 8, ["title"])], 2)], 2);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/AccessTokenConnectionInstructions.vue?vue&type=style&index=0&lang.module.scss
container$2 = "_container_1r8bk_123";
instructions = "_instructions_1r8bk_129";
item = "_item_1r8bk_143";
label = "_label_1r8bk_153";
url = "_url_1r8bk_157";
connectionString = "_connectionString_1r8bk_189";
AccessTokenConnectionInstructions_vue_vue_type_style_index_0_lang_module_default = {
container: container$2,
"instructions-container": "_instructions-container_1r8bk_129",
instructions,
item,
label,
url,
"copy-url-wrapper": "_copy-url-wrapper_1r8bk_173",
"copy-url-button": "_copy-url-button_1r8bk_178",
connectionString,
"copy-json-button": "_copy-json-button_1r8bk_202"
}; //#endregion
//#region src/features/ai/mcpAccess/components/connectionInstructions/AccessTokenConnectionInstructions.vue
cssModules$4 = {
"$style": AccessTokenConnectionInstructions_vue_vue_type_style_index_0_lang_module_default
};
AccessTokenConnectionInstructions_default = /* @__PURE__ */__plugin_vue_export_helper_default(AccessTokenConnectionInstructions_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$4]]); //#endregion
//#region src/features/ai/mcpAccess/components/MCPConnectionInstructions.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$1 = ["href"];
MCP_ENDPOINT = "mcp-server/http";
MCPConnectionInstructions_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "MCPConnectionInstructions",
props: {
baseUrl: {},
apiKey: {},
loadingApiKey: {
type: Boolean
},
oAuthClients: {},
loadingOAuthClients: {
type: Boolean
}
},
emits: ["rotateKey", "revokeClient", "refreshClientList"],
setup(__props, {
emit: __emit
}) {
const props = __props;
const emit = __emit;
const i18n = useI18n();
const telemetry = useTelemetry();
const selectedTab = ref("oauth");
const tabs = ref([{
label: i18n.baseText("settings.mcp.instructions.tabs.oauth"),
value: "oauth"
}, {
label: i18n.baseText("settings.mcp.instructions.tabs.apiKey"),
value: "token"
}]);
const onTabSelected = tab => {
selectedTab.value = tab;
};
const onClientRevoked = client => {
emit("revokeClient", client);
telemetry.track("User revoked access for MCP OAuth client", {
client_name: client.name
});
};
const trackCopyEvent = payload => {
telemetry.track("User copied MCP connection parameter", {
parameter: payload.item,
source: payload.source
});
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.container)
}, [createVNode(unref(N8nHeading_default), {
size: "medium",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.connection.info.heading")), 1)]),
_: 1
}), createBaseVNode("div", null, [createVNode(unref(N8nTabs_default), {
"model-value": selectedTab.value,
options: tabs.value,
"onUpdate:modelValue": onTabSelected
}, null, 8, ["model-value", "options"]), withDirectives(createVNode(OAuthConnectionInstructions_default, {
"server-url": `${props.baseUrl}${MCP_ENDPOINT}`,
clients: props.oAuthClients,
"clients-loading": props.loadingOAuthClients,
onRevokeClient: onClientRevoked,
onRefresh: _cache[0] || (_cache[0] = $event => emit("refreshClientList")),
onUrlCopied: _cache[1] || (_cache[1] = $event => trackCopyEvent({
item: "server-url",
source: "oauth-tab"
}))
}, null, 8, ["server-url", "clients", "clients-loading"]), [[vShow, selectedTab.value === "oauth"]]), withDirectives(createVNode(AccessTokenConnectionInstructions_default, {
"server-url": `${props.baseUrl}${MCP_ENDPOINT}`,
"api-key": props.apiKey,
"loading-api-key": props.loadingApiKey,
onRotateKey: _cache[2] || (_cache[2] = $event => emit("rotateKey")),
onConnectionStringCopied: _cache[3] || (_cache[3] = $event => trackCopyEvent({
item: "mcp-json",
source: "token-tab"
})),
onAccessTokenCopied: _cache[4] || (_cache[4] = $event => trackCopyEvent({
item: "access-token",
source: "token-tab"
})),
onUrlCopied: _cache[5] || (_cache[5] = $event => trackCopyEvent({
item: "server-url",
source: "token-tab"
}))
}, null, 8, ["server-url", "api-key", "loading-api-key"]), [[vShow, selectedTab.value === "token"]]), createVNode(unref(N8nText_default), {
size: "small",
"data-test-id": "mcp-connection-instructions-docs-text"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.instructions.docs.part1")) + " ", 1), createBaseVNode("a", {
href: unref(MCP_DOCS_PAGE_URL),
target: "_blank"
}, toDisplayString(unref(i18n).baseText("settings.mcp.instructions.docs.part2")), 9, _hoisted_1$1)]),
_: 1
})])], 2);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/components/MCPConnectionInstructions.vue?vue&type=style&index=0&lang.module.scss
container$1 = "_container_1n2r0_123";
MCPConnectionInstructions_vue_vue_type_style_index_0_lang_module_default = {
container: container$1
}; //#endregion
//#region src/features/ai/mcpAccess/components/MCPConnectionInstructions.vue
cssModules$3 = {
"$style": MCPConnectionInstructions_vue_vue_type_style_index_0_lang_module_default
};
MCPConnectionInstructions_default = /* @__PURE__ */__plugin_vue_export_helper_default(MCPConnectionInstructions_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$3]]); //#endregion
//#region src/features/ai/mcpAccess/components/WorkflowsTable.vue?vue&type=script&setup=true&lang.ts
_hoisted_1 = {
key: 0
};
_hoisted_2 = {
key: 1,
class: "mt-s mb-xl"
};
_hoisted_3 = {
key: 1
};
_hoisted_4 = {
key: 0
};
WorkflowsTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "WorkflowsTable",
props: {
workflows: {},
loading: {
type: Boolean
}
},
emits: ["removeMcpAccess", "refresh"],
setup(__props, {
emit: __emit
}) {
const props = __props;
const emit = __emit;
const i18n = useI18n();
const tableHeaders = ref([{
title: i18n.baseText("generic.project"),
key: "homeProject",
width: 150,
disableSort: true,
value() {}
}, {
title: i18n.baseText("settings.mcp.workflowsTable.workflow"),
key: "workflow",
width: 200,
disableSort: true,
value() {}
}, {
title: i18n.baseText("generic.description"),
key: "description",
width: 350,
disableSort: true,
value() {}
}, {
title: "",
key: "actions",
align: "end",
width: 50,
disableSort: true,
value() {}
}]);
const tableActions = ref([{
label: i18n.baseText("settings.mcp.workflows.table.action.removeMCPAccess"),
value: "removeFromMCP"
}]);
const getProjectIcon = workflow => {
if (workflow.homeProject?.type === "personal") return {
type: "icon",
value: "user"
};else if (workflow.homeProject?.name) return isIconOrEmoji(workflow.homeProject.icon) ? workflow.homeProject.icon : {
type: "icon",
value: "layers"
};else return {
type: "icon",
value: "house"
};
};
const getProjectName = workflow => {
if (workflow.homeProject?.type === "personal") return i18n.baseText("projects.menu.personal");
return workflow.homeProject?.name ?? "";
};
const onWorkflowAction = (action, workflow) => {
switch (action) {
case "removeFromMCP":
emit("removeMcpAccess", workflow);
break;
default:
break;
}
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style["workflow-table-container"])
}, [props.loading ? (openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(N8nLoading_default), {
loading: props.loading,
variant: "h1",
class: "mb-l"
}, null, 8, ["loading"]), createVNode(unref(N8nLoading_default), {
loading: props.loading,
variant: "p",
rows: 5,
"shrink-last": false
}, null, 8, ["loading"])])) : (openBlock(), createElementBlock("div", _hoisted_2, [createBaseVNode("div", {
class: normalizeClass([_ctx.$style.header, "mb-s"])
}, [createVNode(unref(N8nHeading_default), {
size: "medium",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.available.workflows.heading")) + " (" + toDisplayString(props.workflows.length) + ") ", 1)]),
_: 1
}), createVNode(unref(N8nTooltip_default), {
content: unref(i18n).baseText("settings.mcp.refresh.tooltip")
}, {
default: withCtx(() => [createVNode(unref(N8nButton_default), {
"data-test-id": "mcp-workflows-refresh-button",
size: "small",
type: "tertiary",
icon: "refresh-cw",
square: true,
onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit("refresh"))
})]),
_: 1
}, 8, ["content"])], 2), props.workflows.length === 0 ? (openBlock(), createBlock(unref(N8nActionBox_default), {
key: 0,
"data-test-id": "empty-workflow-list-box",
heading: unref(i18n).baseText("settings.mcp.empty.title"),
description: unref(i18n).baseText("settings.mcp.empty.description")
}, null, 8, ["heading", "description"])) : (openBlock(), createBlock(unref(N8nDataTableServer_default), {
key: 1,
class: normalizeClass(_ctx.$style["workflow-table"]),
"data-test-id": "mcp-workflow-table",
headers: tableHeaders.value,
items: props.workflows,
"items-length": props.workflows.length
}, {
[`item.workflow`]: withCtx(({
item: item$2
}) => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style["workflow-cell"]),
"data-test-id": "mcp-workflow-cell"
}, [item$2.parentFolder?.parentFolderId ? (openBlock(), createElementBlock("span", {
key: 0,
class: normalizeClass(_ctx.$style["parent-folder"]),
"data-test-id": "mcp-workflow-grandparent-folder"
}, [createBaseVNode("span", {
class: normalizeClass(_ctx.$style.ellipsis)
}, "...", 2), createBaseVNode("span", {
class: normalizeClass(_ctx.$style.separator),
"data-test-id": "mcp-workflow-ellipsis-separator"
}, "/", 2)], 2)) : createCommentVNode("", true), item$2.parentFolder ? (openBlock(), createElementBlock("span", {
key: 1,
class: normalizeClass(_ctx.$style["parent-folder"])
}, [item$2.homeProject ? (openBlock(), createBlock(unref(N8nLink_default), {
key: 0,
"data-test-id": "mcp-workflow-folder-link",
to: `/projects/${item$2.homeProject.id}/folders/${item$2.parentFolder.id}/workflows`,
theme: "text",
class: normalizeClass(_ctx.$style["table-link"]),
"new-window": true
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), {
"data-test-id": "mcp-workflow-folder-name"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(item$2.parentFolder.name), 1)]),
_: 2
}, 1024)]),
_: 2
}, 1032, ["to", "class"])) : (openBlock(), createElementBlock("span", _hoisted_3, [item$2.parentFolder ? (openBlock(), createBlock(unref(N8nIcon_default), {
key: 0,
icon: "folder",
size: 16,
color: "text-light"
})) : createCommentVNode("", true), createVNode(unref(N8nText_default), {
"data-test-id": "mcp-workflow-folder-name"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(item$2.parentFolder.name), 1)]),
_: 2
}, 1024)]))], 2)) : createCommentVNode("", true), item$2.parentFolder ? (openBlock(), createElementBlock("span", {
key: 2,
class: normalizeClass(_ctx.$style["separator"]),
"data-test-id": "mcp-workflow-folder-separator"
}, "/", 2)) : createCommentVNode("", true), createVNode(unref(N8nLink_default), {
"data-test-id": "mcp-workflow-name-link",
"new-window": true,
to: unref(router_default).resolve({
name: unref(VIEWS).WORKFLOW,
params: {
name: item$2.id
}
}).fullPath,
theme: "text",
class: normalizeClass(_ctx.$style["table-link"])
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), {
"data-test-id": "mcp-workflow-name"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(item$2.name), 1)]),
_: 2
}, 1024)]),
_: 2
}, 1032, ["to", "class"])], 2)]),
[`item.description`]: withCtx(({
item: item$2
}) => [createVNode(unref(N8nTooltip_default), {
content: item$2.description,
disabled: !item$2.description,
"popper-class": _ctx.$style["description-popper"]
}, {
default: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style["description-cell"])
}, [createVNode(unref(N8nText_default), {
"data-test-id": "mcp-workflow-description"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(item$2.description || ""), 1)]),
_: 2
}, 1024)], 2)]),
_: 2
}, 1032, ["content", "disabled", "popper-class"])]),
[`item.homeProject`]: withCtx(({
item: item$2
}) => [item$2.homeProject ? (openBlock(), createElementBlock("span", _hoisted_4, [createVNode(unref(N8nLink_default), {
"data-test-id": "mcp-workflow-project-link",
to: unref(router_default).resolve({
name: unref(VIEWS).PROJECTS_WORKFLOWS,
params: {
projectId: item$2.homeProject.id
}
}).fullPath,
theme: "text",
class: normalizeClass([_ctx.$style["table-link"], _ctx.$style["project-link"]]),
"new-window": true
}, {
default: withCtx(() => [item$2.homeProject ? (openBlock(), createBlock(ProjectIcon_default, {
key: 0,
icon: getProjectIcon(item$2),
"border-less": true
}, null, 8, ["icon"])) : createCommentVNode("", true), createVNode(unref(N8nText_default), {
"data-test-id": "mcp-workflow-project-name"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(getProjectName(item$2)), 1)]),
_: 2
}, 1024), createVNode(unref(N8nIcon_default), {
icon: "external-link",
class: normalizeClass(_ctx.$style["link-icon"]),
color: "text-light"
}, null, 8, ["class"])]),
_: 2
}, 1032, ["to", "class"])])) : (openBlock(), createBlock(unref(N8nText_default), {
key: 1,
"data-test-id": "mcp-workflow-no-project"
}, {
default: withCtx(() => _cache[1] || (_cache[1] = [createTextVNode("-")])),
_: 1
}))]),
[`item.actions`]: withCtx(({
item: item$2
}) => [createVNode(unref(N8nActionToggle_default), {
"data-test-id": "mcp-workflow-action-toggle",
placement: "bottom",
actions: tableActions.value,
theme: "dark",
onAction: $event => onWorkflowAction($event, item$2)
}, null, 8, ["actions", "onAction"])]),
_: 2
}, 1032, ["class", "headers", "items", "items-length"]))]))], 2);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/components/WorkflowsTable.vue?vue&type=style&index=0&lang.module.scss
header = "_header_1c109_127";
separator = "_separator_1c109_143";
ellipsis = "_ellipsis_1c109_144";
WorkflowsTable_vue_vue_type_style_index_0_lang_module_default = {
"workflow-table-container": "_workflow-table-container_1c109_123",
header,
"workflow-table": "_workflow-table_1c109_123",
"workflow-cell": "_workflow-cell_1c109_137",
"parent-folder": "_parent-folder_1c109_138",
separator,
ellipsis,
"description-cell": "_description-cell_1c109_151",
"description-popper": "_description-popper_1c109_160",
"table-link": "_table-link_1c109_164",
"link-icon": "_link-icon_1c109_172",
"project-link": "_project-link_1c109_178"
}; //#endregion
//#region src/features/ai/mcpAccess/components/WorkflowsTable.vue
cssModules$2 = {
"$style": WorkflowsTable_vue_vue_type_style_index_0_lang_module_default
};
WorkflowsTable_default = /* @__PURE__ */__plugin_vue_export_helper_default(WorkflowsTable_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$2]]); //#endregion
//#region src/features/ai/mcpAccess/components/McpAccessToggle.vue?vue&type=script&setup=true&lang.ts
McpAccessToggle_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "McpAccessToggle",
props: {
modelValue: {
type: Boolean
},
disabled: {
type: Boolean,
default: false
},
loading: {
type: Boolean,
default: false
}
},
emits: ["toggleMcpAccess"],
setup(__props, {
emit: __emit
}) {
const props = __props;
const emit = __emit;
const i18n = useI18n();
const onUpdateMCPEnabled = value => {
emit("toggleMcpAccess", typeof value === "boolean" ? value : Boolean(value));
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style["mcp-access-toggle"])
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style["main-toggle-container"])
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style["main-toggle-info"])
}, [createVNode(unref(N8nText_default), {
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.toggle.label")), 1)]),
_: 1
}), createVNode(unref(N8nText_default), {
size: "small",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.toggle.description")), 1)]),
_: 1
})], 2), createBaseVNode("div", {
class: normalizeClass(_ctx.$style["main-toggle"]),
"data-test-id": "mcp-toggle-container"
}, [createVNode(unref(N8nTooltip_default), {
content: unref(i18n).baseText("settings.mcp.toggle.disabled.tooltip"),
disabled: !props.disabled,
placement: "top"
}, {
default: withCtx(() => [createVNode(unref(ElSwitch), {
size: "large",
"data-test-id": "mcp-access-toggle",
"model-value": props.modelValue,
disabled: props.disabled,
loading: props.loading,
"onUpdate:modelValue": onUpdateMCPEnabled
}, null, 8, ["model-value", "disabled", "loading"])]),
_: 1
}, 8, ["content", "disabled"])], 2)], 2), !props.modelValue ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style["toggle-notice"])
}, [createVNode(unref(N8nText_default), {
color: "text-base",
"data-test-id": "mcp-toggle-disabled-notice"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.toggle.disabled.notice")), 1)]),
_: 1
}), createVNode(unref(N8nLink_default), {
to: unref(MCP_DOCS_PAGE_URL),
"new-window": true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.learnMore")), 1)]),
_: 1
}, 8, ["to"])], 2)) : createCommentVNode("", true)], 2);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/components/McpAccessToggle.vue?vue&type=style&index=0&lang.module.scss
McpAccessToggle_vue_vue_type_style_index_0_lang_module_default = {
"mcp-access-toggle": "_mcp-access-toggle_p4msq_123",
"main-toggle-container": "_main-toggle-container_p4msq_130",
"main-toggle-info": "_main-toggle-info_p4msq_140",
"main-toggle": "_main-toggle_p4msq_130",
"toggle-notice": "_toggle-notice_p4msq_154"
}; //#endregion
//#region src/features/ai/mcpAccess/components/McpAccessToggle.vue
cssModules$1 = {
"$style": McpAccessToggle_vue_vue_type_style_index_0_lang_module_default
};
McpAccessToggle_default = /* @__PURE__ */__plugin_vue_export_helper_default(McpAccessToggle_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$1]]); //#endregion
//#region src/features/ai/mcpAccess/SettingsMCPView.vue?vue&type=script&setup=true&lang.ts
SettingsMCPView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "SettingsMCPView",
setup(__props) {
const i18n = useI18n();
const toast = useToast();
const documentTitle = useDocumentTitle();
const mcp = useMcp();
const workflowsStore = useWorkflowsStore();
const mcpStore = useMCPStore();
const usersStore = useUsersStore();
const rootStore = useRootStore();
const mcpStatusLoading = ref(false);
const workflowsLoading = ref(false);
const mcpKeyLoading = ref(false);
const oAuthClientsLoading = ref(false);
const availableWorkflows = ref([]);
const apiKey = computed(() => mcpStore.currentUserMCPKey);
const connectedOAuthClients = ref([]);
const isOwner = computed(() => usersStore.isInstanceOwner);
const isAdmin = computed(() => usersStore.isAdmin);
const canToggleMCP = computed(() => isOwner.value || isAdmin.value);
const onToggleMCPAccess = async enabled => {
try {
mcpStatusLoading.value = true;
if (await mcpStore.setMcpAccessEnabled(enabled)) {
await fetchAvailableWorkflows();
await fetchApiKey();
await fetchoAuthCLients();
} else workflowsLoading.value = false;
mcp.trackUserToggledMcpAccess(enabled);
} catch (error) {
toast.showError(error, i18n.baseText("settings.mcp.toggle.error"));
} finally {
mcpStatusLoading.value = false;
workflowsLoading.value = false;
}
};
const onRemoveMCPAccess = async workflow => {
try {
await workflowsStore.updateWorkflowSetting(workflow.id, "availableInMCP", false);
availableWorkflows.value = availableWorkflows.value.filter(w => w.id !== workflow.id);
} catch (error) {
toast.showError(error, i18n.baseText("workflowSettings.toggleMCP.error.title"));
}
};
const fetchAvailableWorkflows = async () => {
workflowsLoading.value = true;
try {
availableWorkflows.value = await mcpStore.fetchWorkflowsAvailableForMCP(1, 200);
} catch (error) {
toast.showError(error, i18n.baseText("workflows.list.error.fetching"));
} finally {
setTimeout(() => {
workflowsLoading.value = false;
}, 200);
}
};
const fetchApiKey = async () => {
try {
mcpKeyLoading.value = true;
await mcpStore.getOrCreateApiKey();
} catch (error) {
toast.showError(error, i18n.baseText("settings.mcp.error.fetching.apiKey"));
} finally {
setTimeout(() => {
mcpKeyLoading.value = false;
}, 200);
}
};
const rotateKey = async () => {
try {
mcpKeyLoading.value = true;
await mcpStore.generateNewApiKey();
} catch (error) {
toast.showError(error, i18n.baseText("settings.mcp.error.rotating.apiKey"));
} finally {
setTimeout(() => {
mcpKeyLoading.value = false;
}, 200);
}
};
const fetchoAuthCLients = async () => {
try {
oAuthClientsLoading.value = true;
connectedOAuthClients.value = await mcpStore.getAllOAuthClients();
} catch (error) {
toast.showError(error, i18n.baseText("settings.mcp.error.fetching.oAuthClients"));
} finally {
setTimeout(() => {
oAuthClientsLoading.value = false;
}, 200);
}
};
const revokeClientAccess = async client => {
try {
await mcpStore.removeOAuthClient(client.id);
connectedOAuthClients.value = connectedOAuthClients.value.filter(c => c.id !== client.id);
toast.showMessage({
type: "success",
title: i18n.baseText("settings.mcp.oAuthClients.revoke.success.title"),
message: i18n.baseText("settings.mcp.oAuthClients.revoke.success.message", {
interpolate: {
name: client.name
}
})
});
} catch (error) {
toast.showError(error, i18n.baseText("settings.mcp.oAuthClients.revoke.error"));
}
};
const onRefreshOAuthClients = async () => {
await fetchoAuthCLients();
};
const onRefreshWorkflows = async () => {
await fetchAvailableWorkflows();
};
onMounted(async () => {
documentTitle.set(i18n.baseText("settings.mcp"));
if (!mcpStore.mcpAccessEnabled) return;
await fetchAvailableWorkflows();
await fetchApiKey();
await fetchoAuthCLients();
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.container)
}, [createVNode(unref(N8nHeading_default), {
size: "2xlarge",
class: "mb-2xs"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp")), 1)]),
_: 1
}), createVNode(McpAccessToggle_default, {
"data-test-id": "mcp-toggle-section",
"model-value": unref(mcpStore).mcpAccessEnabled,
disabled: !canToggleMCP.value,
loading: mcpStatusLoading.value,
onToggleMcpAccess: onToggleMCPAccess
}, null, 8, ["model-value", "disabled", "loading"]), unref(mcpStore).mcpAccessEnabled ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.container),
"data-test-id": "mcp-enabled-section"
}, [apiKey.value ? (openBlock(), createBlock(MCPConnectionInstructions_default, {
key: 0,
"loading-api-key": mcpKeyLoading.value,
"base-url": unref(rootStore).urlBaseEditor,
"api-key": apiKey.value,
"o-auth-clients": connectedOAuthClients.value,
"loading-o-auth-clients": oAuthClientsLoading.value,
onRotateKey: rotateKey,
onRevokeClient: revokeClientAccess,
onRefreshClientList: onRefreshOAuthClients
}, null, 8, ["loading-api-key", "base-url", "api-key", "o-auth-clients", "loading-o-auth-clients"])) : createCommentVNode("", true), createVNode(WorkflowsTable_default, {
"data-test-id": "mcp-workflow-table",
workflows: availableWorkflows.value,
loading: workflowsLoading.value,
onRemoveMcpAccess: onRemoveMCPAccess,
onRefresh: onRefreshWorkflows
}, null, 8, ["workflows", "loading"])], 2)) : createCommentVNode("", true)], 2);
};
}
}); //#endregion
//#region src/features/ai/mcpAccess/SettingsMCPView.vue?vue&type=style&index=0&lang.module.scss
container = "_container_727ie_123";
SettingsMCPView_vue_vue_type_style_index_0_lang_module_default = {
container
}; //#endregion
//#region src/features/ai/mcpAccess/SettingsMCPView.vue
cssModules = {
"$style": SettingsMCPView_vue_vue_type_style_index_0_lang_module_default
};
_export("default", SettingsMCPView_default = /* @__PURE__ */__plugin_vue_export_helper_default(SettingsMCPView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules]])); //#endregion
}
};
});
})();