@atom8n/n8n-editor-ui 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/.stylelintcache +1 -0
  2. package/README.md +59 -0
  3. package/biome.jsonc +8 -0
  4. package/build.log +55 -0
  5. package/data/node-popularity.json +3998 -0
  6. package/dist/assets/AddDataTableModal-UINkk54_.js +1555 -0
  7. package/dist/assets/AgentEditorModal-CVww87TJ.js +358 -0
  8. package/dist/assets/Alert-Dy86dyOr.js +102 -0
  9. package/dist/assets/AnimatedSpinner-DmPN4poP.js +15 -0
  10. package/dist/assets/AnnotationTagsDropdown.ee-BJ7N9lek.js +71 -0
  11. package/dist/assets/AuthView-D2LWHrMp.js +106 -0
  12. package/dist/assets/BottomMenu-CIQiK_dJ.js +532 -0
  13. package/dist/assets/CalendarDate-DgQUMbNo.js +875 -0
  14. package/dist/assets/ChangePasswordView-Z6tUkw0u.js +133 -0
  15. package/dist/assets/ChatAgentAvatar-50YBnv3N.js +67 -0
  16. package/dist/assets/ChatFile-xZxmc2nV.js +146 -0
  17. package/dist/assets/ChatLayout-CTE_5SiM.js +96 -0
  18. package/dist/assets/ChatPersonalAgentsView-BGpHk03K.js +149 -0
  19. package/dist/assets/ChatSidebar-BkVwIypC.js +528 -0
  20. package/dist/assets/ChatView-BbbdeU9x.js +1559 -0
  21. package/dist/assets/ChatWorkflowAgentsView-BtunOxlC.js +116 -0
  22. package/dist/assets/CollectionParameter-BdcPG1lu.js +52 -0
  23. package/dist/assets/CommitMonoVariable-ytizKI8U.woff2 +0 -0
  24. package/dist/assets/CommunityNodeUpdateInfo-C37kca4W.js +273 -0
  25. package/dist/assets/CopyInput-DDZVu2iU.js +74 -0
  26. package/dist/assets/CredentialIcon-8YdTTFZ1.js +80 -0
  27. package/dist/assets/CredentialPicker-DWtj314o.js +293 -0
  28. package/dist/assets/CredentialSelectorModal-DTW2fKh0.js +138 -0
  29. package/dist/assets/CredentialsView-BjUchcCu.js +480 -0
  30. package/dist/assets/DataTableActions-DpAkoxg_.js +95 -0
  31. package/dist/assets/DataTableDetailsView-Coq7zdW5.js +41922 -0
  32. package/dist/assets/DataTableView-Cs-BIkzw.js +293 -0
  33. package/dist/assets/DemoFooter-Cga3jvi-.js +65 -0
  34. package/dist/assets/Draggable-vfvXl9Sp.js +105 -0
  35. package/dist/assets/EmptySharedSectionActionBox-DOXZtTCv.js +36 -0
  36. package/dist/assets/EnterpriseEdition.ee-D_rCFexM.js +15 -0
  37. package/dist/assets/EntityNotFound-3dhTRWsE.js +85 -0
  38. package/dist/assets/EntityUnAuthorised-ChJYZakE.js +66 -0
  39. package/dist/assets/ErrorView-zT9cX76a.js +61 -0
  40. package/dist/assets/EvaluationsRootView-C-OVWYnY.js +523 -0
  41. package/dist/assets/EvaluationsView-CJwJTruc.js +469 -0
  42. package/dist/assets/ExecutionsTime-DEQiyozR.js +573 -0
  43. package/dist/assets/ExecutionsView-Bd5Oh8TH.js +791 -0
  44. package/dist/assets/ExternalSecretsProviderConnectionSwitch.ee-C7Ih-uRo.js +191 -0
  45. package/dist/assets/FixedCollectionParameter-CYuTDW9t.js +496 -0
  46. package/dist/assets/ForgotMyPasswordView-Bs_L9P27.js +102 -0
  47. package/dist/assets/InsightsChartAverageRuntime-Bp3VA8_7.js +62 -0
  48. package/dist/assets/InsightsChartFailed-KPaNWoEr.js +52 -0
  49. package/dist/assets/InsightsChartFailureRate-DE6kE3FM.js +54 -0
  50. package/dist/assets/InsightsChartTimeSaved-auABNZlc.js +68 -0
  51. package/dist/assets/InsightsChartTotal-BKzYRKE7.js +56 -0
  52. package/dist/assets/InsightsDashboard-JWx4W6Db.js +473 -0
  53. package/dist/assets/InsightsPaywall-C8zLLKe8.js +63 -0
  54. package/dist/assets/InsightsSummary-cmN1lHDm.js +210 -0
  55. package/dist/assets/InsightsTableWorkflows-CqcC3IbQ.js +203 -0
  56. package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  57. package/dist/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
  58. package/dist/assets/ItemsRenderer-DC8WVyMv.js +922 -0
  59. package/dist/assets/KeyboardShortcutTooltip-D8PAK5JP.js +31 -0
  60. package/dist/assets/LogsPanel-BR06u9RK.js +52 -0
  61. package/dist/assets/LogsPanel-C-_acMHp.js +2325 -0
  62. package/dist/assets/MCPConnectWorkflowsModal-3g8_iUa4.js +303 -0
  63. package/dist/assets/MainHeader-DiQc1edn.js +2153 -0
  64. package/dist/assets/MainSidebar-CoPGG5Ea.js +804 -0
  65. package/dist/assets/MigrationRuleDetail-BAxk1Pvl.js +295 -0
  66. package/dist/assets/MigrationRules-IW9lZMpE.js +285 -0
  67. package/dist/assets/Modal-CIzXlZdZ.js +204 -0
  68. package/dist/assets/ModelByIdSelectorModal-DLvBjzJO.js +115 -0
  69. package/dist/assets/NDVEmptyState-33UoX00I.js +19743 -0
  70. package/dist/assets/NodeCreation-BNzbSWSB.js +240 -0
  71. package/dist/assets/NodeCreator-BftgCKx7.js +1288 -0
  72. package/dist/assets/NodeDetailsView-CsoQCpcF.js +1075 -0
  73. package/dist/assets/NodeDetailsViewV2-C_wNQR_3.js +981 -0
  74. package/dist/assets/NodeIcon-B9VW6tX6.js +87 -0
  75. package/dist/assets/NodeSettings-ZwVip6VR.js +1872 -0
  76. package/dist/assets/NodeView-D4WUEvLB.js +2452 -0
  77. package/dist/assets/OAuthConsentView-DlrUqZbT.js +230 -0
  78. package/dist/assets/PageViewLayout-NT1KPFgy.js +12 -0
  79. package/dist/assets/ParameterInputList-sG2nz-Jo.js +38091 -0
  80. package/dist/assets/PrebuiltAgentTemplatesView-Csi5U8dc.js +154 -0
  81. package/dist/assets/ProjectBreadcrumb-C_XiY7sc.js +98 -0
  82. package/dist/assets/ProjectCardBadge-t_hs7vzx.js +209 -0
  83. package/dist/assets/ProjectHeader-Dq5Ihb26.js +549 -0
  84. package/dist/assets/ProjectIcon-DY8gGuHX.js +64 -0
  85. package/dist/assets/ProjectRoleView-Du-KTrAC.js +435 -0
  86. package/dist/assets/ProjectRolesView-DjxM_y4u.js +239 -0
  87. package/dist/assets/ProjectSettings-C6kWuV21.js +966 -0
  88. package/dist/assets/ProjectSharing-CVUgNWAY.js +262 -0
  89. package/dist/assets/ProjectVariables-CJlAo3dv.js +467 -0
  90. package/dist/assets/ProviderSettingsModal-BUFC2ZLv.js +307 -0
  91. package/dist/assets/PushConnectionTracker-DPBnGV0v.js +27 -0
  92. package/dist/assets/ResolversView-3BdkvvYA.js +209 -0
  93. package/dist/assets/ResourceFiltersDropdown-dgyXpcEX.js +159 -0
  94. package/dist/assets/ResourcesListLayout-qBLtomK6.js +631 -0
  95. package/dist/assets/RunDataHtml-BrW0OQra.js +7 -0
  96. package/dist/assets/RunDataHtml-Cleia4Cj.js +40 -0
  97. package/dist/assets/RunDataJson-uxkrhYRK.js +227 -0
  98. package/dist/assets/RunDataJsonActions-DkPk7E8d.js +5007 -0
  99. package/dist/assets/RunDataParsedAiContent-CtPRjig-.js +26 -0
  100. package/dist/assets/RunDataParsedAiContent-WAuqLQ5M.js +192 -0
  101. package/dist/assets/RunDataSearch-YBWUr93C.js +141 -0
  102. package/dist/assets/RunDataTable-DcXaBynW.js +631 -0
  103. package/dist/assets/SamlOnboarding-BTdQ_hr3.js +78 -0
  104. package/dist/assets/SaveButton-D5sQSxIk.js +89 -0
  105. package/dist/assets/SelectedItemsInfo-BHZ-NvF5.js +58 -0
  106. package/dist/assets/SettingsApiView-IfZTMXx1.js +313 -0
  107. package/dist/assets/SettingsChatHubView-gWh2X6vX.js +285 -0
  108. package/dist/assets/SettingsCommunityNodesView-D8VQtpGY.js +349 -0
  109. package/dist/assets/SettingsExternalSecrets-CpMc7mkW.js +233 -0
  110. package/dist/assets/SettingsLdapView-CU5a2MAy.js +2553 -0
  111. package/dist/assets/SettingsLogStreamingView-uojTe-oX.js +375 -0
  112. package/dist/assets/SettingsMCPView-B5Swp1C_.js +1214 -0
  113. package/dist/assets/SettingsPersonalView-Cr3aGood.js +402 -0
  114. package/dist/assets/SettingsSourceControl-DXOvFDEY.js +547 -0
  115. package/dist/assets/SettingsSso-27MfU1HV.js +1032 -0
  116. package/dist/assets/SettingsUsageAndPlan-DqIO-G46.js +419 -0
  117. package/dist/assets/SettingsUsersView-DfHB4_Kh.js +833 -0
  118. package/dist/assets/SettingsView-C4sA7Uny.js +90 -0
  119. package/dist/assets/SetupTemplateFormStep-BmiSzZin.js +258 -0
  120. package/dist/assets/SetupView-VORZ-L_u.js +112 -0
  121. package/dist/assets/SetupWorkflowCredentialsButton-DTmkOAW5.js +73 -0
  122. package/dist/assets/SetupWorkflowFromTemplateView-B9NupdJE.js +286 -0
  123. package/dist/assets/SeverityTag-CX1qTTNA.js +45 -0
  124. package/dist/assets/SigninView-D9_Pm16j.js +358 -0
  125. package/dist/assets/SignoutView-BFsjEAGz.js +19 -0
  126. package/dist/assets/SignupView-Am4ot0QZ.js +137 -0
  127. package/dist/assets/SkeletonAgentCard-C5TL-h8F.js +191 -0
  128. package/dist/assets/TagsDropdown-Bvx_Hd6Q.js +230 -0
  129. package/dist/assets/TemplateCard-CyQ1GuVz.js +105 -0
  130. package/dist/assets/TemplateDetails-CZRusTxE.js +124 -0
  131. package/dist/assets/TemplateList-DKvbwuiY.js +333 -0
  132. package/dist/assets/TemplatesCollectionView-D8dxU8By.js +184 -0
  133. package/dist/assets/TemplatesSearchView-CebC_GLs.js +1230 -0
  134. package/dist/assets/TemplatesView-025CcmIY.js +57 -0
  135. package/dist/assets/TemplatesWorkflowView-C2JfwJAn.js +170 -0
  136. package/dist/assets/TestRunDetailView-Ck78TTWO.js +395 -0
  137. package/dist/assets/TextWithHighlights-BxumwGnv.js +57 -0
  138. package/dist/assets/TimeAgo-C6EN4lCs.js +123 -0
  139. package/dist/assets/ToolsSelectorModal-8QJoUvRL.js +368 -0
  140. package/dist/assets/TriggerPanel-B6pacLkk.js +1225 -0
  141. package/dist/assets/VirtualSchema-B3zGe_8b.js +2402 -0
  142. package/dist/assets/VirtualSchema-Dkh0Cu5z.js +37 -0
  143. package/dist/assets/VueMarkdown-CQqJL9vK.js +28 -0
  144. package/dist/assets/WorkerView-Caznsljo.js +563 -0
  145. package/dist/assets/WorkflowActivationErrorMessage-CGrfPi9O.js +17 -0
  146. package/dist/assets/WorkflowActivator-BINnz0f7.js +362 -0
  147. package/dist/assets/WorkflowExecutionsInfoAccordion-Dg37yEfT.js +166 -0
  148. package/dist/assets/WorkflowExecutionsLandingPage-V2wdubhK.js +93 -0
  149. package/dist/assets/WorkflowExecutionsPreview-DdJaqYV6.js +616 -0
  150. package/dist/assets/WorkflowExecutionsView-DV8ySTfn.js +808 -0
  151. package/dist/assets/WorkflowHistory-GtaBMzIM.js +973 -0
  152. package/dist/assets/WorkflowLocation-CQ9Sq-2y.js +164 -0
  153. package/dist/assets/WorkflowOnboardingView-C49gt0Jr.js +61 -0
  154. package/dist/assets/WorkflowPreview-CXdvv4Nq.js +186 -0
  155. package/dist/assets/WorkflowTagsDropdown-QwbICWjN.js +71 -0
  156. package/dist/assets/WorkflowsView-B-MWIECO.js +3253 -0
  157. package/dist/assets/_MapCache-CcdIl4Ae.js +363 -0
  158. package/dist/assets/_baseOrderBy-N8Be_6z6.js +2989 -0
  159. package/dist/assets/_initCloneObject-viQQyT6o.js +80 -0
  160. package/dist/assets/_plugin-vue_export-helper-BwBpWJRZ.js +6 -0
  161. package/dist/assets/aiTemplatesStarterCollection.store-nL9nePkK.js +656 -0
  162. package/dist/assets/apiKeys.store-BhOFmP2j.js +51 -0
  163. package/dist/assets/assistant.store-CNywgN4S.js +518 -0
  164. package/dist/assets/auth.eventBus-CWXS0Qp7.js +5 -0
  165. package/dist/assets/banners.store-CGEcBTDn.js +195 -0
  166. package/dist/assets/builder.store-Czk2ipDE.js +31417 -0
  167. package/dist/assets/buttons.esm-yintpW2E.js +364 -0
  168. package/dist/assets/chart-CNvyywtJ.js +10958 -0
  169. package/dist/assets/chartjs.utils-BAE52Cv9.js +155 -0
  170. package/dist/assets/chat.store-290YeyrQ.js +865 -0
  171. package/dist/assets/chatPanel.store-NDaawEZL.js +118 -0
  172. package/dist/assets/chunk-6z4oVpB-.js +36 -0
  173. package/dist/assets/col-Cmt4cmuS.js +158 -0
  174. package/dist/assets/constants-C8OH4tTq.js +106256 -0
  175. package/dist/assets/constants-DMrsrpD7.js +32 -0
  176. package/dist/assets/core-B9gt_4yk.js +4 -0
  177. package/dist/assets/core-CP5FY4aX.js +1202 -0
  178. package/dist/assets/core-CRbPymLT.js +9741 -0
  179. package/dist/assets/dataTable.store-DmipQsol.js +207 -0
  180. package/dist/assets/date-picker-2IDsBs2n.js +4115 -0
  181. package/dist/assets/dateFormatter-ik4-9_9r.js +33 -0
  182. package/dist/assets/dateformat-hG8NERse.js +181 -0
  183. package/dist/assets/dialog-lMho1TD8.js +425 -0
  184. package/dist/assets/dist-Cw46Is-h.js +151 -0
  185. package/dist/assets/doppler-B__k0MeW.webp +0 -0
  186. package/dist/assets/element-icons-B-tDfklg.woff +0 -0
  187. package/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
  188. package/dist/assets/empty-BuGRxzl4.js +2210 -0
  189. package/dist/assets/en-CF30SCh2.js +95 -0
  190. package/dist/assets/en-DyO2pPiC.js +2 -0
  191. package/dist/assets/es-BkUFJVtD.js +43338 -0
  192. package/dist/assets/evaluation.constants-GYAwmJnh.js +284 -0
  193. package/dist/assets/executions.store-B9uRYwgv.js +205 -0
  194. package/dist/assets/exports-Crx_gvt_.js +1799 -0
  195. package/dist/assets/externalSecrets.ee.store-BJh4a_6G.js +118 -0
  196. package/dist/assets/fileUtils-CRWqOQje.js +20 -0
  197. package/dist/assets/folders.store-yAFj-5Vl.js +235 -0
  198. package/dist/assets/get-BcEmeOxn.js +2781 -0
  199. package/dist/assets/index-SL8542zQ.js +28372 -0
  200. package/dist/assets/insights.constants-BkJCYJTL.js +55 -0
  201. package/dist/assets/insights.store-BFc3kDUo.js +61 -0
  202. package/dist/assets/insights.utils-CcLXdrrz.js +77 -0
  203. package/dist/assets/isEmpty-C3XXoHqJ.js +35216 -0
  204. package/dist/assets/languageModules-9LyndCqU.js +13862 -0
  205. package/dist/assets/logStreaming.store-IZhWe_VK.js +190 -0
  206. package/dist/assets/mcp.constants-_Jcn7fPq.js +10 -0
  207. package/dist/assets/mcp.store-B9yfcAN9.js +116 -0
  208. package/dist/assets/merge-DhuTk1HM.js +564 -0
  209. package/dist/assets/nodeCreator.store-Bpnrwp2l.js +5444 -0
  210. package/dist/assets/nodeIcon-D6X-ENYt.js +102 -0
  211. package/dist/assets/nodeTransforms-RzcOM0v2.js +42 -0
  212. package/dist/assets/orderBy-Cu9F9DU_.js +15 -0
  213. package/dist/assets/path-browserify-RUt2u7iT.js +328 -0
  214. package/dist/assets/personalizedTemplatesV3.store-BGYp0YBN.js +334 -0
  215. package/dist/assets/pickBy-UI0Jt4wC.js +18 -0
  216. package/dist/assets/preload-helper-dyVz7ck7.js +59 -0
  217. package/dist/assets/radio-CSce3UT0.js +262 -0
  218. package/dist/assets/readyToRun.store-YEMvPUqo.js +626 -0
  219. package/dist/assets/readyToRunWorkflows.store-G3srgIze.js +1319 -0
  220. package/dist/assets/retry-BgHaYzbB.js +23 -0
  221. package/dist/assets/roles.store-CRf_zJTb.js +51 -0
  222. package/dist/assets/router-DNpzz3GH.js +2631 -0
  223. package/dist/assets/sanitize-html-CbW56HUN.js +10758 -0
  224. package/dist/assets/schemaPreview.store-DUgN1yVE.js +113 -0
  225. package/dist/assets/semver-Bk6DGseV.js +1306 -0
  226. package/dist/assets/smartDecimal-DAZl4HKA.js +6 -0
  227. package/dist/assets/sortByProperty-Cn7iGKYu.js +8 -0
  228. package/dist/assets/sourceControl.eventBus-D47xXSc_.js +3 -0
  229. package/dist/assets/sqlite3-DBpDb1lf.wasm +0 -0
  230. package/dist/assets/sqlite3-opfs-async-proxy-vVtmDGHX.js +461 -0
  231. package/dist/assets/sqlite3-worker1-bundler-friendly-DLarOZDL.js +9405 -0
  232. package/dist/assets/src-jviYSG25.js +55454 -0
  233. package/dist/assets/sso.store-DyApJwhx.js +139 -0
  234. package/dist/assets/style-E3CrYFV8.css +111829 -0
  235. package/dist/assets/table-we1DjFMV.js +3944 -0
  236. package/dist/assets/templateActions-bEDSARw2.js +65 -0
  237. package/dist/assets/templateTransforms-BHWiRbtR.js +43 -0
  238. package/dist/assets/truncate-C0KYt7i3.js +4176 -0
  239. package/dist/assets/typescript.worker-CYqLvLHh.js +152048 -0
  240. package/dist/assets/uniqBy-xDyuCRP0.js +10 -0
  241. package/dist/assets/usage.store-CU5J_nGm.js +100 -0
  242. package/dist/assets/useActions-B1JckIRj.js +255 -0
  243. package/dist/assets/useBeforeUnload-DiDkvI8p.js +40 -0
  244. package/dist/assets/useCanvasMapping-BXT7rGhC.js +12570 -0
  245. package/dist/assets/useCanvasOperations-8ULLtMkY.js +1765 -0
  246. package/dist/assets/useClipboard-DvjhVHqJ.js +39 -0
  247. package/dist/assets/useCommandBar-C4tLJbKt.js +2425 -0
  248. package/dist/assets/useCredentialResolvers-BKeFGJnY.js +78 -0
  249. package/dist/assets/useCustomAgent-DpILEt5e.js +471 -0
  250. package/dist/assets/useDebounce-Br5_1ug-.js +147 -0
  251. package/dist/assets/useExecutionData-M5iKsX6z.js +23 -0
  252. package/dist/assets/useExecutionDebugging-8azMzbnd.js +191 -0
  253. package/dist/assets/useExecutionHelpers-BgRRhpBM.js +91 -0
  254. package/dist/assets/useImportCurlCommand-CKiEmX5P.js +8891 -0
  255. package/dist/assets/useIntersectionObserver-BWMwOueh.js +33 -0
  256. package/dist/assets/useKeybindings-B2jfN6rd.js +62 -0
  257. package/dist/assets/useLogsTreeExpand-sZViUfdM.js +843 -0
  258. package/dist/assets/useMcp-DoMOIfqT.js +27 -0
  259. package/dist/assets/usePageRedirectionHelper-DjkznpX6.js +51 -0
  260. package/dist/assets/usePinnedData-BhZkqttf.js +203 -0
  261. package/dist/assets/usePushConnection-DMS-F_IW.js +513 -0
  262. package/dist/assets/useRecentResources-BVORr7eM.js +118 -0
  263. package/dist/assets/useRunWorkflow-LO7ffLp9.js +950 -0
  264. package/dist/assets/useSettingsItems-BhZXwMZn.js +144 -0
  265. package/dist/assets/useTelemetryContext-V6bv4YRq.js +34 -0
  266. package/dist/assets/useWorkflowActivate-DeSmDXjI.js +152 -0
  267. package/dist/assets/useWorkflowsCache-DtcEEAIR.js +179 -0
  268. package/dist/assets/userRoleProvisioning.store-kkSIdeTo.js +33 -0
  269. package/dist/assets/utils-DI7dLldp.js +54 -0
  270. package/dist/assets/versions.store-B1z2OrLE.js +191 -0
  271. package/dist/assets/vue-CydWIhxN.js +4378 -0
  272. package/dist/assets/vue-json-pretty-CsGX66mG.js +1130 -0
  273. package/dist/assets/vue.runtime.esm-bundler-tP5dCd7J.js +7325 -0
  274. package/dist/assets/xml-B_oj6Mle.js +2060 -0
  275. package/dist/favicon.ico +0 -0
  276. package/dist/index.html +157 -0
  277. package/dist/static/base-path.js +1 -0
  278. package/dist/static/community_package_tooltip_img.png +0 -0
  279. package/dist/static/data-mapping-gif.gif +0 -0
  280. package/dist/static/form-grey.svg +1 -0
  281. package/dist/static/google-auth/disabled.dark.png +0 -0
  282. package/dist/static/google-auth/disabled.png +0 -0
  283. package/dist/static/google-auth/focus.dark.png +0 -0
  284. package/dist/static/google-auth/focus.png +0 -0
  285. package/dist/static/google-auth/normal.dark.png +0 -0
  286. package/dist/static/google-auth/normal.png +0 -0
  287. package/dist/static/google-auth/pressed.dark.png +0 -0
  288. package/dist/static/google-auth/pressed.png +0 -0
  289. package/dist/static/n8n-logo.png +0 -0
  290. package/dist/static/og_image.png +0 -0
  291. package/dist/static/open-ai.svg +1 -0
  292. package/dist/static/openChat.png +0 -0
  293. package/dist/static/posthog.init.js +41 -0
  294. package/dist/static/prefers-color-scheme.css +5 -0
  295. package/dist/static/webhook-icon.svg +1 -0
  296. package/dist/tree-sitter-bash.wasm +0 -0
  297. package/dist/tree-sitter.wasm +0 -0
  298. package/eslint.config.mjs +59 -0
  299. package/index.html +45 -0
  300. package/index.js +0 -0
  301. package/package.json +147 -0
  302. package/postcss.config.cjs +6 -0
  303. package/scripts/fetch-node-popularity.mjs +102 -0
  304. package/stylelint.config.mjs +9 -0
  305. package/tailwind.config.js +8 -0
  306. package/tsconfig.json +36 -0
  307. package/vite/i18n-locales-hmr-helpers.ts +19 -0
  308. package/vite/source-map-js-shim.ts +1 -0
  309. package/vite/vite-plugin-node-popularity.mts +32 -0
  310. package/vite.config.mts +304 -0
@@ -0,0 +1,1214 @@
1
+ import { C as computed, Cn as toDisplayString, D as createElementBlock, E as createCommentVNode, Gt as unref, It as ref, M as createVNode, P as defineComponent, T as createBlock, Z as onMounted, _t as watch, at as renderSlot, bt as withCtx, et as openBlock, j as createTextVNode, k as createSlots, p as vShow, vn as normalizeClass, w as createBaseVNode, xt as withDirectives } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
2
+ import { rt as useI18n } from "./core-CRbPymLT.js";
3
+ import { Cn as N8nIcon_default, Ct as N8nActionBox_default, D as N8nPopover_default, F as N8nMarkdown_default, R as N8nInfoTip_default, T as N8nRadioButtons_default, Tt as ElSwitch, at as N8nLoading_default, bn as N8nText_default, ht as N8nTooltip_default, it as N8nActionToggle_default, k as N8nNotice_default, mt as N8nLink_default, u as N8nDataTableServer_default, vn as N8nHeading_default, xn as N8nButton_default, y as N8nTabs_default, yt as N8nInput_default } from "./src-jviYSG25.js";
4
+ import "./en-CF30SCh2.js";
5
+ import "./preload-helper-dyVz7ck7.js";
6
+ import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
7
+ import "./truncate-C0KYt7i3.js";
8
+ import { Er as useUsersStore, Xn as useDocumentTitle, aa as useUIStore, k as useTelemetry, y as useToast } from "./builder.store-Czk2ipDE.js";
9
+ import "./empty-BuGRxzl4.js";
10
+ import "./get-BcEmeOxn.js";
11
+ import "./sanitize-html-CbW56HUN.js";
12
+ import "./CalendarDate-DgQUMbNo.js";
13
+ import "./path-browserify-RUt2u7iT.js";
14
+ import "./_MapCache-CcdIl4Ae.js";
15
+ import { Oo as getResourcePermissions, Ro as VIEWS, ms as WORKFLOW_DESCRIPTION_MODAL_KEY } from "./constants-C8OH4tTq.js";
16
+ import "./merge-DhuTk1HM.js";
17
+ import { r as useRootStore } from "./_baseOrderBy-N8Be_6z6.js";
18
+ import "./dateformat-hG8NERse.js";
19
+ import "./useDebounce-Br5_1ug-.js";
20
+ import "./executions.store-B9uRYwgv.js";
21
+ import "./usePinnedData-BhZkqttf.js";
22
+ import "./nodeCreator.store-Bpnrwp2l.js";
23
+ import "./nodeIcon-D6X-ENYt.js";
24
+ import { t as useClipboard } from "./useClipboard-DvjhVHqJ.js";
25
+ import "./useCanvasOperations-8ULLtMkY.js";
26
+ import "./folders.store-yAFj-5Vl.js";
27
+ import "./NodeIcon-B9VW6tX6.js";
28
+ import "./versions.store-B1z2OrLE.js";
29
+ import "./banners.store-CGEcBTDn.js";
30
+ import "./dataTable.store-DmipQsol.js";
31
+ import { t as TimeAgo_default } from "./TimeAgo-C6EN4lCs.js";
32
+ import "./roles.store-CRf_zJTb.js";
33
+ import { t as router_default } from "./router-DNpzz3GH.js";
34
+ import "./sso.store-DyApJwhx.js";
35
+ import "./insights.store-BFc3kDUo.js";
36
+ import "./insights.constants-BkJCYJTL.js";
37
+ import "./insights.utils-CcLXdrrz.js";
38
+ import { a as MCP_DOCS_PAGE_URL, i as MCP_CONNECT_WORKFLOWS_MODAL_KEY, l as MCP_TOOLTIP_DELAY, n as LOADING_INDICATOR_TIMEOUT, o as MCP_ENDPOINT, r as MCP_CONNECT_POPOVER_WIDTH } from "./mcp.constants-_Jcn7fPq.js";
39
+ import "./constants-DMrsrpD7.js";
40
+ import "./useRecentResources-BVORr7eM.js";
41
+ import { t as useMcp } from "./useMcp-DoMOIfqT.js";
42
+ import { t as useMCPStore } from "./mcp.store-B9yfcAN9.js";
43
+ import { t as WorkflowLocation_default } from "./WorkflowLocation-CQ9Sq-2y.js";
44
+ var _hoisted_1$4 = { key: 0 };
45
+ var _hoisted_2$3 = { key: 1 };
46
+ var _hoisted_3$2 = ["href"];
47
+ var MCPEmptyState_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
48
+ __name: "MCPEmptyState",
49
+ props: {
50
+ disabled: {
51
+ type: Boolean,
52
+ default: false
53
+ },
54
+ loading: {
55
+ type: Boolean,
56
+ default: false
57
+ }
58
+ },
59
+ emits: ["turnOnMcp"],
60
+ setup(__props, { emit: __emit }) {
61
+ const props = __props;
62
+ const emit = __emit;
63
+ const i18n = useI18n();
64
+ return (_ctx, _cache) => {
65
+ return openBlock(), createElementBlock("div", {
66
+ class: normalizeClass(_ctx.$style.container),
67
+ "data-test-id": "mcp-empty-state-container"
68
+ }, [createVNode(unref(N8nActionBox_default), {
69
+ icon: {
70
+ type: "icon",
71
+ value: "mcp"
72
+ },
73
+ heading: unref(i18n).baseText("settings.mcp.actionBox.heading"),
74
+ description: unref(i18n).baseText("settings.mcp.description"),
75
+ "button-text": unref(i18n).baseText("settings.mcp.actionBox.button.label"),
76
+ "button-disabled": props.disabled || props.loading,
77
+ "button-variant": "primary",
78
+ "data-test-id": "enable-mcp-access-button",
79
+ "onClick:button": _cache[0] || (_cache[0] = ($event) => emit("turnOnMcp"))
80
+ }, {
81
+ disabledButtonTooltip: withCtx(() => [props.loading ? (openBlock(), createElementBlock("span", _hoisted_1$4, toDisplayString(unref(i18n).baseText("generic.loading")) + "...", 1)) : props.disabled ? (openBlock(), createElementBlock("span", _hoisted_2$3, toDisplayString(unref(i18n).baseText("settings.mcp.toggle.disabled.tooltip")), 1)) : createCommentVNode("", true)]),
82
+ additionalContent: withCtx(() => [createVNode(unref(N8nText_default), {
83
+ color: "text-light",
84
+ size: "small"
85
+ }, {
86
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.emptyState.docs.part1")) + " ", 1), createBaseVNode("a", {
87
+ href: unref(MCP_DOCS_PAGE_URL),
88
+ class: normalizeClass(_ctx.$style["docs-link"]),
89
+ target: "_blank",
90
+ rel: "noopener noreferrer"
91
+ }, toDisplayString(unref(i18n).baseText("generic.learnMore").toLowerCase()), 11, _hoisted_3$2)]),
92
+ _: 1
93
+ })]),
94
+ _: 1
95
+ }, 8, [
96
+ "heading",
97
+ "description",
98
+ "button-text",
99
+ "button-disabled"
100
+ ])], 2);
101
+ };
102
+ }
103
+ });
104
+ var MCPEmptyState_vue_vue_type_style_index_0_lang_module_default = {
105
+ container: "_container_bvbc2_123",
106
+ "docs-link": "_docs-link_bvbc2_132"
107
+ };
108
+ var MCPEmptyState_default = /* @__PURE__ */ __plugin_vue_export_helper_default(MCPEmptyState_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": MCPEmptyState_vue_vue_type_style_index_0_lang_module_default }]]);
109
+ var McpAccessToggle_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
110
+ __name: "McpAccessToggle",
111
+ props: {
112
+ modelValue: { type: Boolean },
113
+ disabled: {
114
+ type: Boolean,
115
+ default: false
116
+ },
117
+ loading: {
118
+ type: Boolean,
119
+ default: false
120
+ }
121
+ },
122
+ emits: ["disableMcpAccess"],
123
+ setup(__props, { emit: __emit }) {
124
+ const props = __props;
125
+ const emit = __emit;
126
+ const i18n = useI18n();
127
+ const onUpdateMCPEnabled = () => {
128
+ emit("disableMcpAccess");
129
+ };
130
+ return (_ctx, _cache) => {
131
+ return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style["main-toggle-container"]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["main-toggle-info"]) }, [createVNode(unref(N8nText_default), {
132
+ bold: true,
133
+ color: _ctx.modelValue ? `success` : `text-light`,
134
+ size: "small"
135
+ }, {
136
+ default: withCtx(() => [createTextVNode(toDisplayString(_ctx.modelValue ? unref(i18n).baseText("settings.mcp.header.toggle.enabled") : unref(i18n).baseText("settings.mcp.header.toggle.disabled")), 1)]),
137
+ _: 1
138
+ }, 8, ["color"])], 2), createBaseVNode("div", {
139
+ class: normalizeClass(_ctx.$style["main-toggle"]),
140
+ "data-test-id": "mcp-toggle-container"
141
+ }, [createVNode(unref(N8nTooltip_default), {
142
+ content: unref(i18n).baseText("settings.mcp.toggle.disabled.tooltip"),
143
+ disabled: !props.disabled,
144
+ placement: "top"
145
+ }, {
146
+ default: withCtx(() => [createVNode(unref(ElSwitch), {
147
+ size: "large",
148
+ "data-test-id": "mcp-access-toggle",
149
+ "model-value": props.modelValue,
150
+ disabled: props.disabled,
151
+ loading: props.loading,
152
+ "onUpdate:modelValue": onUpdateMCPEnabled
153
+ }, null, 8, [
154
+ "model-value",
155
+ "disabled",
156
+ "loading"
157
+ ])]),
158
+ _: 1
159
+ }, 8, ["content", "disabled"])], 2)], 2);
160
+ };
161
+ }
162
+ });
163
+ var McpAccessToggle_vue_vue_type_style_index_0_lang_module_default = {
164
+ "main-toggle-container": "_main-toggle-container_13hh6_123",
165
+ "main-toggle": "_main-toggle_13hh6_123"
166
+ };
167
+ var McpAccessToggle_default = /* @__PURE__ */ __plugin_vue_export_helper_default(McpAccessToggle_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": McpAccessToggle_vue_vue_type_style_index_0_lang_module_default }]]);
168
+ var _hoisted_1$3 = ["for"];
169
+ var _hoisted_2$2 = ["id"];
170
+ var ConnectionParameter_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
171
+ __name: "ConnectionParameter",
172
+ props: {
173
+ id: {},
174
+ label: {},
175
+ value: {},
176
+ valueLoading: {
177
+ type: Boolean,
178
+ default: false
179
+ },
180
+ infoTip: { default: void 0 },
181
+ allowCopy: {
182
+ type: Boolean,
183
+ default: true
184
+ }
185
+ },
186
+ emits: ["copy"],
187
+ setup(__props, { emit: __emit }) {
188
+ const { copy, copied, isSupported } = useClipboard();
189
+ const i18n = useI18n();
190
+ const props = __props;
191
+ const emit = __emit;
192
+ const handleCopy = async (value) => {
193
+ await copy(value);
194
+ emit("copy", value);
195
+ };
196
+ return (_ctx, _cache) => {
197
+ return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.container) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["label-wrapper"]) }, [createBaseVNode("label", {
198
+ class: normalizeClass(_ctx.$style.label),
199
+ for: `connection-parameter-${props.id}`
200
+ }, toDisplayString(props.label), 11, _hoisted_1$3), props.infoTip ? (openBlock(), createElementBlock("div", {
201
+ key: 0,
202
+ class: normalizeClass(_ctx.$style["info-tip"])
203
+ }, [createVNode(unref(N8nInfoTip_default), {
204
+ type: "tooltip",
205
+ size: "small"
206
+ }, {
207
+ default: withCtx(() => [createTextVNode(toDisplayString(props.infoTip), 1)]),
208
+ _: 1
209
+ })], 2)) : createCommentVNode("", true)], 2), createBaseVNode("div", {
210
+ id: `connection-parameter-${props.id}`,
211
+ class: normalizeClass({
212
+ [_ctx.$style["parameter-value"]]: true,
213
+ [_ctx.$style["parameter-value--loading"]]: props.valueLoading
214
+ }),
215
+ "data-test-id": "connection-parameter-value"
216
+ }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["input-wrapper"]) }, [props.valueLoading ? (openBlock(), createBlock(unref(N8nLoading_default), {
217
+ key: 0,
218
+ loading: props.valueLoading,
219
+ variant: "h1",
220
+ class: normalizeClass(_ctx.$style["parameter-skeleton"])
221
+ }, null, 8, ["loading", "class"])) : (openBlock(), createBlock(unref(N8nInput_default), {
222
+ key: 1,
223
+ modelValue: props.value,
224
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => props.value = $event),
225
+ type: "text",
226
+ readonly: true
227
+ }, null, 8, ["modelValue"]))], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style["copy-button-wrapper"]) }, [renderSlot(_ctx.$slots, "customActions"), createVNode(unref(N8nTooltip_default), {
228
+ disabled: !unref(isSupported),
229
+ content: unref(copied) ? unref(i18n).baseText("generic.copied") : unref(i18n).baseText("generic.copy"),
230
+ "show-after": unref(100),
231
+ placement: "bottom"
232
+ }, {
233
+ default: withCtx(() => [props.allowCopy && unref(isSupported) ? (openBlock(), createBlock(unref(N8nButton_default), {
234
+ key: 0,
235
+ type: "tertiary",
236
+ icon: unref(copied) ? "check" : "copy",
237
+ square: true,
238
+ class: normalizeClass(_ctx.$style["copy-button"]),
239
+ disabled: props.valueLoading,
240
+ onClick: _cache[1] || (_cache[1] = ($event) => handleCopy(props.value))
241
+ }, null, 8, [
242
+ "icon",
243
+ "class",
244
+ "disabled"
245
+ ])) : createCommentVNode("", true)]),
246
+ _: 1
247
+ }, 8, [
248
+ "disabled",
249
+ "content",
250
+ "show-after"
251
+ ])], 2)], 10, _hoisted_2$2)], 2);
252
+ };
253
+ }
254
+ });
255
+ const container$4 = "_container_1p18l_123";
256
+ const label$1 = "_label_1p18l_129";
257
+ var ConnectionParameter_vue_vue_type_style_index_0_lang_module_default = {
258
+ container: container$4,
259
+ "label-wrapper": "_label-wrapper_1p18l_129",
260
+ "info-tip": "_info-tip_1p18l_134",
261
+ label: label$1,
262
+ "parameter-value": "_parameter-value_1p18l_147",
263
+ "parameter-value--loading": "_parameter-value--loading_1p18l_158",
264
+ "input-wrapper": "_input-wrapper_1p18l_161",
265
+ "parameter-skeleton": "_parameter-skeleton_1p18l_179",
266
+ "copy-button-wrapper": "_copy-button-wrapper_1p18l_201",
267
+ "copy-button": "_copy-button_1p18l_201"
268
+ };
269
+ var ConnectionParameter_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ConnectionParameter_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ConnectionParameter_vue_vue_type_style_index_0_lang_module_default }]]);
270
+ var MCPOAuthPopoverTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
271
+ __name: "MCPOAuthPopoverTab",
272
+ props: { serverUrl: {} },
273
+ emits: ["copy"],
274
+ setup(__props, { emit: __emit }) {
275
+ const props = __props;
276
+ const emit = __emit;
277
+ const i18n = useI18n();
278
+ const handleServerUrlCopy = (value) => {
279
+ emit("copy", value);
280
+ };
281
+ return (_ctx, _cache) => {
282
+ return openBlock(), createElementBlock("div", {
283
+ class: normalizeClass(_ctx.$style.container),
284
+ "data-test-id": "mcp-oauth-popover-tab"
285
+ }, [createVNode(ConnectionParameter_default, {
286
+ id: "oauth-server-url",
287
+ label: unref(i18n).baseText("settings.mcp.connectPopover.serverUrl"),
288
+ value: props.serverUrl,
289
+ onCopy: handleServerUrlCopy
290
+ }, null, 8, ["label", "value"])], 2);
291
+ };
292
+ }
293
+ });
294
+ var MCPOAuthPopoverTab_vue_vue_type_style_index_0_lang_module_default = { container: "_container_1y944_123" };
295
+ var MCPOAuthPopoverTab_default = /* @__PURE__ */ __plugin_vue_export_helper_default(MCPOAuthPopoverTab_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": MCPOAuthPopoverTab_vue_vue_type_style_index_0_lang_module_default }]]);
296
+ var MCPAccessTokenPopoverTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
297
+ __name: "MCPAccessTokenPopoverTab",
298
+ props: { serverUrl: {} },
299
+ emits: ["copy"],
300
+ setup(__props, { emit: __emit }) {
301
+ const props = __props;
302
+ const emit = __emit;
303
+ const i18n = useI18n();
304
+ const toast = useToast();
305
+ const mcpStore = useMCPStore();
306
+ const loadingApiKey = ref(true);
307
+ const keyRotating = ref(false);
308
+ const apiKey = computed(() => mcpStore.currentUserMCPKey);
309
+ const { copy, copied, isSupported } = useClipboard();
310
+ const connectionString = computed(() => {
311
+ return `
312
+ {
313
+ "mcpServers": {
314
+ "n8n-mcp": {
315
+ "command": "npx",
316
+ "args": [
317
+ "-y",
318
+ "supergateway",
319
+ "--streamableHttp",
320
+ "${props.serverUrl}",
321
+ "--header",
322
+ "authorization:Bearer ${apiKeyText.value}"
323
+ ]
324
+ }
325
+ }
326
+ }
327
+ `;
328
+ });
329
+ const isKeyRedacted = computed(() => {
330
+ return apiKey.value?.apiKey?.includes("******") ?? false;
331
+ });
332
+ const connectionCode = computed(() => {
333
+ return `\`\`\`json${connectionString.value}\`\`\``;
334
+ });
335
+ const apiKeyText = computed(() => {
336
+ if (keyRotating.value) return `<${i18n.baseText("generic.loading")}...>`;
337
+ return isKeyRedacted.value ? "<YOUR_ACCESS_TOKEN_HERE>" : apiKey.value?.apiKey;
338
+ });
339
+ const fetchApiKey = async () => {
340
+ try {
341
+ loadingApiKey.value = true;
342
+ await mcpStore.getOrCreateApiKey();
343
+ } catch (error) {
344
+ toast.showError(error, i18n.baseText("settings.mcp.error.fetching.apiKey"));
345
+ } finally {
346
+ setTimeout(() => {
347
+ loadingApiKey.value = false;
348
+ }, 200);
349
+ }
350
+ };
351
+ const rotateKey = async () => {
352
+ try {
353
+ keyRotating.value = true;
354
+ await mcpStore.generateNewApiKey();
355
+ } catch (error) {
356
+ toast.showError(error, i18n.baseText("settings.mcp.error.rotating.apiKey"));
357
+ } finally {
358
+ setTimeout(() => {
359
+ keyRotating.value = false;
360
+ }, 200);
361
+ }
362
+ };
363
+ const handleConnectionStringCopy = async () => {
364
+ await copy(connectionString.value);
365
+ emit("copy", "mcpJson", connectionString.value);
366
+ };
367
+ const handleUrlCopy = (url) => {
368
+ emit("copy", "serverUrl", url);
369
+ };
370
+ const handleAccessTokenCopy = () => {
371
+ if (apiKey.value?.apiKey) emit("copy", "accessToken", apiKey.value.apiKey);
372
+ };
373
+ onMounted(async () => {
374
+ if (!apiKey.value) await fetchApiKey();
375
+ else loadingApiKey.value = false;
376
+ });
377
+ return (_ctx, _cache) => {
378
+ return openBlock(), createElementBlock("div", {
379
+ class: normalizeClass(_ctx.$style.container),
380
+ "data-test-id": "mcp-access-token-popover-tab"
381
+ }, [createVNode(ConnectionParameter_default, {
382
+ id: "oauth-server-url",
383
+ label: unref(i18n).baseText("settings.mcp.connectPopover.serverUrl"),
384
+ value: props.serverUrl,
385
+ onCopy: handleUrlCopy
386
+ }, null, 8, ["label", "value"]), loadingApiKey.value ? (openBlock(), createElementBlock("div", {
387
+ key: 0,
388
+ class: normalizeClass(_ctx.$style["loading-container"])
389
+ }, [createVNode(unref(N8nLoading_default), {
390
+ loading: loadingApiKey.value,
391
+ variant: "h1",
392
+ class: normalizeClass(_ctx.$style["url-skeleton"])
393
+ }, null, 8, ["loading", "class"]), createVNode(unref(N8nLoading_default), {
394
+ loading: loadingApiKey.value,
395
+ variant: "button",
396
+ class: normalizeClass(_ctx.$style["code-skeleton"])
397
+ }, null, 8, ["loading", "class"])], 2)) : apiKey.value?.apiKey ? (openBlock(), createElementBlock("div", {
398
+ key: 1,
399
+ class: normalizeClass(_ctx.$style["parameters-container"])
400
+ }, [
401
+ createVNode(ConnectionParameter_default, {
402
+ id: "access-token",
403
+ value: apiKey.value.apiKey,
404
+ "value-loading": keyRotating.value,
405
+ label: unref(i18n).baseText("settings.mcp.connectPopover.tab.accessToken"),
406
+ "info-tip": unref(i18n).baseText("settings.mcp.instructions.apiKey.tip"),
407
+ "allow-copy": !isKeyRedacted.value,
408
+ onCopy: handleAccessTokenCopy
409
+ }, {
410
+ customActions: withCtx(() => [createVNode(unref(N8nTooltip_default), {
411
+ content: unref(i18n).baseText("settings.mcp.instructions.rotateKey.tooltip"),
412
+ "show-after": unref(100)
413
+ }, {
414
+ default: withCtx(() => [createVNode(unref(N8nButton_default), {
415
+ type: "tertiary",
416
+ icon: "refresh-cw",
417
+ square: true,
418
+ disabled: keyRotating.value,
419
+ onClick: rotateKey
420
+ }, null, 8, ["disabled"])]),
421
+ _: 1
422
+ }, 8, ["content", "show-after"])]),
423
+ _: 1
424
+ }, 8, [
425
+ "value",
426
+ "value-loading",
427
+ "label",
428
+ "info-tip",
429
+ "allow-copy"
430
+ ]),
431
+ !isKeyRedacted.value ? (openBlock(), createBlock(unref(N8nNotice_default), { key: 0 }, {
432
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.access.token.notice")), 1)]),
433
+ _: 1
434
+ })) : createCommentVNode("", true),
435
+ createBaseVNode("div", {
436
+ class: normalizeClass(_ctx.$style["json-container"]),
437
+ "data-test-id": "mcp-access-token-json"
438
+ }, [
439
+ createBaseVNode("label", {
440
+ class: normalizeClass(_ctx.$style.label),
441
+ for: "mcp-json"
442
+ }, toDisplayString(unref(i18n).baseText("settings.mcp.connectPopover.jsonConfig")), 3),
443
+ createVNode(unref(N8nMarkdown_default), {
444
+ id: "mcp-json",
445
+ content: connectionCode.value
446
+ }, null, 8, ["content"]),
447
+ createVNode(unref(N8nTooltip_default), {
448
+ disabled: !unref(isSupported),
449
+ content: unref(copied) ? unref(i18n).baseText("generic.copied") : unref(i18n).baseText("generic.copy"),
450
+ "show-after": unref(100)
451
+ }, {
452
+ default: withCtx(() => [unref(isSupported) && !loadingApiKey.value && !keyRotating.value ? (openBlock(), createBlock(unref(N8nButton_default), {
453
+ key: 0,
454
+ type: "tertiary",
455
+ icon: unref(copied) ? "check" : "copy",
456
+ square: true,
457
+ class: normalizeClass(_ctx.$style["copy-json-button"]),
458
+ "data-test-id": "mcp-json-copy-button",
459
+ onClick: handleConnectionStringCopy
460
+ }, null, 8, ["icon", "class"])) : createCommentVNode("", true)]),
461
+ _: 1
462
+ }, 8, [
463
+ "disabled",
464
+ "content",
465
+ "show-after"
466
+ ])
467
+ ], 2)
468
+ ], 2)) : createCommentVNode("", true)], 2);
469
+ };
470
+ }
471
+ });
472
+ const container$2 = "_container_1ymth_123";
473
+ const label = "_label_1ymth_155";
474
+ var MCPAccessTokenPopoverTab_vue_vue_type_style_index_0_lang_module_default = {
475
+ container: container$2,
476
+ "loading-container": "_loading-container_1ymth_128",
477
+ "url-skeleton": "_url-skeleton_1ymth_134",
478
+ "code-skeleton": "_code-skeleton_1ymth_139",
479
+ "parameters-container": "_parameters-container_1ymth_144",
480
+ "json-container": "_json-container_1ymth_150",
481
+ label,
482
+ "copy-json-button": "_copy-json-button_1ymth_173"
483
+ };
484
+ var MCPAccessTokenPopoverTab_default = /* @__PURE__ */ __plugin_vue_export_helper_default(MCPAccessTokenPopoverTab_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": MCPAccessTokenPopoverTab_vue_vue_type_style_index_0_lang_module_default }]]);
485
+ var McpConnectPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
486
+ __name: "McpConnectPopover",
487
+ props: { disabled: { type: Boolean } },
488
+ setup(__props) {
489
+ const i18n = useI18n();
490
+ const telemetry = useTelemetry();
491
+ const rootStore = useRootStore();
492
+ const mcpStore = useMCPStore();
493
+ const props = __props;
494
+ const TABS = {
495
+ ACCESS_TOKEN: "accessToken",
496
+ OAUTH: "oauth"
497
+ };
498
+ const tabItems = ref([{
499
+ value: TABS.OAUTH,
500
+ label: i18n.baseText("settings.mcp.connectPopover.tab.oauth")
501
+ }, {
502
+ value: TABS.ACCESS_TOKEN,
503
+ label: i18n.baseText("settings.mcp.connectPopover.tab.accessToken")
504
+ }]);
505
+ const serverUrl = ref(`${rootStore.urlBaseEditor}${MCP_ENDPOINT}`);
506
+ const activeTab = ref(tabItems.value[0].value);
507
+ const handlePopoverOpenChange = (isOpen) => {
508
+ if (isOpen) mcpStore.openConnectPopover();
509
+ else {
510
+ mcpStore.closeConnectPopover();
511
+ mcpStore.resetCurrentUserMCPKey();
512
+ }
513
+ };
514
+ const handleTabChange = (newTab) => {
515
+ activeTab.value = newTab;
516
+ };
517
+ const handleAccessTokenTabCopy = (type) => {
518
+ trackCopyEvent({
519
+ item: {
520
+ serverUrl: "server-url",
521
+ accessToken: "access-token",
522
+ mcpJson: "mcp-json"
523
+ }[type],
524
+ source: "token-tab"
525
+ });
526
+ };
527
+ const trackCopyEvent = (payload) => {
528
+ telemetry.track("User copied MCP connection parameter", {
529
+ parameter: payload.item,
530
+ source: payload.source
531
+ });
532
+ };
533
+ watch(() => props.disabled, (newValue) => {
534
+ if (!newValue) mcpStore.openConnectPopover();
535
+ });
536
+ return (_ctx, _cache) => {
537
+ return openBlock(), createElementBlock("div", null, [createVNode(unref(N8nPopover_default), {
538
+ id: "mcp-connect-popover",
539
+ open: unref(mcpStore).connectPopoverOpen,
540
+ "content-class": _ctx.$style.popper,
541
+ "show-arrow": false,
542
+ width: `${unref(460)}px`,
543
+ "onUpdate:open": handlePopoverOpenChange
544
+ }, {
545
+ trigger: withCtx(() => [createVNode(unref(N8nButton_default), {
546
+ "data-test-id": "mcp-connect-popover-trigger-button",
547
+ type: "tertiary",
548
+ disabled: _ctx.disabled
549
+ }, {
550
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.connectPopover.triggerLabel")), 1)]),
551
+ _: 1
552
+ }, 8, ["disabled"])]),
553
+ content: withCtx(() => [createBaseVNode("div", {
554
+ class: normalizeClass(_ctx.$style["popper-content"]),
555
+ "data-test-id": "mcp-connect-popover-content"
556
+ }, [createBaseVNode("header", null, [createVNode(unref(N8nRadioButtons_default), {
557
+ "data-test-id": "mcp-connect-popover-tabs",
558
+ "model-value": activeTab.value,
559
+ options: tabItems.value,
560
+ "onUpdate:modelValue": handleTabChange
561
+ }, null, 8, ["model-value", "options"])]), createBaseVNode("main", null, [activeTab.value === TABS.OAUTH ? (openBlock(), createBlock(MCPOAuthPopoverTab_default, {
562
+ key: 0,
563
+ "server-url": serverUrl.value,
564
+ onCopy: _cache[0] || (_cache[0] = ($event) => trackCopyEvent({
565
+ item: "server-url",
566
+ source: "oauth-tab"
567
+ }))
568
+ }, null, 8, ["server-url"])) : activeTab.value === TABS.ACCESS_TOKEN ? (openBlock(), createBlock(MCPAccessTokenPopoverTab_default, {
569
+ key: 1,
570
+ "server-url": serverUrl.value,
571
+ onCopy: handleAccessTokenTabCopy
572
+ }, null, 8, ["server-url"])) : createCommentVNode("", true)])], 2)]),
573
+ _: 1
574
+ }, 8, [
575
+ "open",
576
+ "content-class",
577
+ "width"
578
+ ])]);
579
+ };
580
+ }
581
+ });
582
+ var McpConnectPopover_vue_vue_type_style_index_0_lang_module_default = {
583
+ popper: "_popper_1vjps_123",
584
+ "popper-content": "_popper-content_1vjps_127"
585
+ };
586
+ var McpConnectPopover_default = /* @__PURE__ */ __plugin_vue_export_helper_default(McpConnectPopover_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": McpConnectPopover_vue_vue_type_style_index_0_lang_module_default }]]);
587
+ var MCPHeaderActions_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
588
+ __name: "MCPHeaderActions",
589
+ props: {
590
+ toggleDisabled: {
591
+ type: Boolean,
592
+ default: false
593
+ },
594
+ loading: {
595
+ type: Boolean,
596
+ default: false
597
+ },
598
+ accessEnabled: { type: Boolean }
599
+ },
600
+ emits: ["disableMcpAccess"],
601
+ setup(__props, { emit: __emit }) {
602
+ const props = __props;
603
+ const emit = __emit;
604
+ return (_ctx, _cache) => {
605
+ return openBlock(), createElementBlock("div", {
606
+ class: normalizeClass(_ctx.$style.container),
607
+ "data-test-id": "mcp-header-actions"
608
+ }, [createVNode(McpAccessToggle_default, {
609
+ "model-value": _ctx.accessEnabled,
610
+ disabled: props.toggleDisabled,
611
+ loading: props.loading,
612
+ class: normalizeClass(_ctx.$style["mcp-access-toggle"]),
613
+ onDisableMcpAccess: _cache[0] || (_cache[0] = ($event) => emit("disableMcpAccess"))
614
+ }, null, 8, [
615
+ "model-value",
616
+ "disabled",
617
+ "loading",
618
+ "class"
619
+ ]), createVNode(McpConnectPopover_default, { disabled: !_ctx.accessEnabled }, null, 8, ["disabled"])], 2);
620
+ };
621
+ }
622
+ });
623
+ var MCPHeaderActions_vue_vue_type_style_index_0_lang_module_default = { container: "_container_1bb92_123" };
624
+ var MCPHeaderActions_default = /* @__PURE__ */ __plugin_vue_export_helper_default(MCPHeaderActions_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": MCPHeaderActions_vue_vue_type_style_index_0_lang_module_default }]]);
625
+ var _hoisted_1$2 = { key: 0 };
626
+ var _hoisted_2$1 = {
627
+ key: 1,
628
+ class: "mt-s mb-xl"
629
+ };
630
+ var _hoisted_3$1 = ["onClick"];
631
+ var _hoisted_4 = { key: 0 };
632
+ var _hoisted_5 = { key: 1 };
633
+ var WorkflowsTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
634
+ __name: "WorkflowsTable",
635
+ props: {
636
+ workflows: {},
637
+ loading: { type: Boolean }
638
+ },
639
+ emits: [
640
+ "removeMcpAccess",
641
+ "connectWorkflows",
642
+ "updateDescription"
643
+ ],
644
+ setup(__props, { emit: __emit }) {
645
+ const props = __props;
646
+ const emit = __emit;
647
+ const i18n = useI18n();
648
+ const tableHeaders = ref([
649
+ {
650
+ title: i18n.baseText("settings.mcp.workflows.table.column.name"),
651
+ key: "workflow",
652
+ width: 150,
653
+ disableSort: true,
654
+ value() {}
655
+ },
656
+ {
657
+ title: i18n.baseText("settings.mcp.workflows.table.column.location"),
658
+ key: "location",
659
+ width: 200,
660
+ disableSort: true,
661
+ value() {}
662
+ },
663
+ {
664
+ title: i18n.baseText("generic.description"),
665
+ key: "description",
666
+ width: 350,
667
+ disableSort: true,
668
+ value() {}
669
+ },
670
+ {
671
+ title: "",
672
+ key: "actions",
673
+ align: "end",
674
+ width: 50,
675
+ disableSort: true,
676
+ value() {}
677
+ }
678
+ ]);
679
+ const getAvailableActions = (workflow) => {
680
+ const permissions = getResourcePermissions(workflow.scopes);
681
+ return [{
682
+ label: i18n.baseText("settings.mcp.workflows.table.action.removeMCPAccess"),
683
+ value: "removeFromMCP",
684
+ disabled: !permissions.workflow.update
685
+ }, {
686
+ label: i18n.baseText("settings.mcp.workflows.table.action.updateDescription"),
687
+ value: "updateDescription",
688
+ disabled: !permissions.workflow.update
689
+ }];
690
+ };
691
+ const onWorkflowAction = (action, workflow) => {
692
+ switch (action) {
693
+ case "removeFromMCP":
694
+ emit("removeMcpAccess", workflow);
695
+ break;
696
+ case "updateDescription":
697
+ emit("updateDescription", workflow);
698
+ break;
699
+ default: break;
700
+ }
701
+ };
702
+ const onConnectClick = () => {
703
+ emit("connectWorkflows");
704
+ };
705
+ return (_ctx, _cache) => {
706
+ return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style["workflow-table-container"]) }, [props.loading ? (openBlock(), createElementBlock("div", _hoisted_1$2, [createVNode(unref(N8nLoading_default), {
707
+ loading: props.loading,
708
+ variant: "h1",
709
+ class: "mb-l"
710
+ }, null, 8, ["loading"]), createVNode(unref(N8nLoading_default), {
711
+ loading: props.loading,
712
+ variant: "p",
713
+ rows: 5,
714
+ "shrink-last": false
715
+ }, null, 8, ["loading"])])) : (openBlock(), createElementBlock("div", _hoisted_2$1, [createVNode(unref(N8nDataTableServer_default), {
716
+ class: normalizeClass(_ctx.$style["workflow-table"]),
717
+ "data-test-id": "mcp-workflow-table",
718
+ headers: tableHeaders.value,
719
+ items: props.workflows,
720
+ "items-length": props.workflows.length
721
+ }, createSlots({
722
+ [`item.workflow`]: withCtx(({ item }) => [createBaseVNode("div", {
723
+ class: normalizeClass(_ctx.$style["workflow-cell"]),
724
+ "data-test-id": "mcp-workflow-cell"
725
+ }, [createVNode(unref(N8nLink_default), {
726
+ "data-test-id": "mcp-workflow-name-link",
727
+ "new-window": true,
728
+ to: unref(router_default).resolve({
729
+ name: unref(VIEWS).WORKFLOW,
730
+ params: { name: item.id }
731
+ }).fullPath,
732
+ theme: "text",
733
+ class: normalizeClass([_ctx.$style["table-link"], _ctx.$style.truncate])
734
+ }, {
735
+ default: withCtx(() => [createVNode(unref(N8nText_default), {
736
+ class: normalizeClass(_ctx.$style.truncate),
737
+ "data-test-id": "mcp-workflow-name"
738
+ }, {
739
+ default: withCtx(() => [createTextVNode(toDisplayString(item.name), 1)]),
740
+ _: 2
741
+ }, 1032, ["class"])]),
742
+ _: 2
743
+ }, 1032, ["to", "class"])], 2)]),
744
+ [`item.location`]: withCtx(({ item }) => [createBaseVNode("div", {
745
+ class: normalizeClass(_ctx.$style["location-cell"]),
746
+ "data-test-id": "mcp-workflow-location-cell"
747
+ }, [createVNode(WorkflowLocation_default, {
748
+ "workflow-id": item.id,
749
+ "home-project": item.homeProject,
750
+ "parent-folder": item.parentFolder,
751
+ "as-links": true
752
+ }, null, 8, [
753
+ "workflow-id",
754
+ "home-project",
755
+ "parent-folder"
756
+ ])], 2)]),
757
+ [`item.description`]: withCtx(({ item }) => [createVNode(unref(N8nTooltip_default), {
758
+ content: item.description || unref(i18n).baseText("settings.mcp.workflows.table.column.description.emptyTooltip"),
759
+ "show-after": unref(100),
760
+ "popper-class": _ctx.$style["description-popper"]
761
+ }, {
762
+ default: withCtx(() => [createBaseVNode("div", {
763
+ "data-test-id": "mcp-workflow-description-cell",
764
+ class: normalizeClass(_ctx.$style["description-cell"]),
765
+ onClick: ($event) => emit("updateDescription", item)
766
+ }, [item.description ? (openBlock(), createElementBlock("span", _hoisted_4, [createVNode(unref(N8nText_default), { "data-test-id": "mcp-workflow-description" }, {
767
+ default: withCtx(() => [createTextVNode(toDisplayString(item.description), 1)]),
768
+ _: 2
769
+ }, 1024)])) : (openBlock(), createElementBlock("span", _hoisted_5, [createVNode(unref(N8nIcon_default), {
770
+ icon: "triangle-alert",
771
+ size: 14,
772
+ color: "warning",
773
+ class: "mr-2xs"
774
+ }), createVNode(unref(N8nText_default), { "data-test-id": "mcp-workflow-description-empty" }, {
775
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.workflows.table.column.description.emptyContent")), 1)]),
776
+ _: 1
777
+ })]))], 10, _hoisted_3$1)]),
778
+ _: 2
779
+ }, 1032, [
780
+ "content",
781
+ "show-after",
782
+ "popper-class"
783
+ ])]),
784
+ [`item.actions`]: withCtx(({ item }) => [createVNode(unref(N8nActionToggle_default), {
785
+ class: normalizeClass(_ctx.$style["action-toggle"]),
786
+ "data-test-id": "mcp-workflow-action-toggle",
787
+ placement: "bottom",
788
+ actions: getAvailableActions(item),
789
+ theme: "dark",
790
+ onAction: ($event) => onWorkflowAction($event, item)
791
+ }, null, 8, [
792
+ "class",
793
+ "actions",
794
+ "onAction"
795
+ ])]),
796
+ _: 2
797
+ }, [props.workflows.length === 0 ? {
798
+ name: "cover",
799
+ fn: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["empty-state"]) }, [
800
+ createVNode(unref(N8nText_default), {
801
+ "data-test-id": "mcp-workflow-table-empty-state",
802
+ size: "large",
803
+ color: "text-base"
804
+ }, {
805
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.workflows.table.empty.title")), 1)]),
806
+ _: 1
807
+ }),
808
+ createVNode(unref(N8nText_default), {
809
+ "data-test-id": "mcp-workflow-table-empty-state-description",
810
+ size: "small",
811
+ color: "text-base"
812
+ }, {
813
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.workflows.table.empty.description")), 1)]),
814
+ _: 1
815
+ }),
816
+ createVNode(unref(N8nButton_default), {
817
+ "data-test-id": "mcp-workflow-table-empty-state-button",
818
+ type: "primary",
819
+ label: unref(i18n).baseText("settings.mcp.connectWorkflows"),
820
+ onClick: onConnectClick
821
+ }, null, 8, ["label"])
822
+ ], 2)]),
823
+ key: "0"
824
+ } : void 0]), 1032, [
825
+ "class",
826
+ "headers",
827
+ "items",
828
+ "items-length"
829
+ ])]))], 2);
830
+ };
831
+ }
832
+ });
833
+ const header$1 = "_header_1rtae_127";
834
+ const truncate = "_truncate_1rtae_184";
835
+ var WorkflowsTable_vue_vue_type_style_index_0_lang_module_default = {
836
+ "workflow-table-container": "_workflow-table-container_1rtae_123",
837
+ header: header$1,
838
+ "workflow-table": "_workflow-table_1rtae_123",
839
+ "empty-state": "_empty-state_1rtae_137",
840
+ "workflow-cell": "_workflow-cell_1rtae_147",
841
+ "location-cell": "_location-cell_1rtae_154",
842
+ "description-cell": "_description-cell_1rtae_158",
843
+ "description-popper": "_description-popper_1rtae_176",
844
+ "table-link": "_table-link_1rtae_180",
845
+ truncate
846
+ };
847
+ var WorkflowsTable_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowsTable_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowsTable_vue_vue_type_style_index_0_lang_module_default }]]);
848
+ var _hoisted_1$1 = { "data-test-id": "oauth-clients-table" };
849
+ var _hoisted_2 = { key: 0 };
850
+ var _hoisted_3 = {
851
+ key: 1,
852
+ class: "mt-s mb-xl"
853
+ };
854
+ var OAuthClientsTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
855
+ __name: "OAuthClientsTable",
856
+ props: {
857
+ clients: {},
858
+ loading: { type: Boolean }
859
+ },
860
+ emits: ["revokeClient"],
861
+ setup(__props, { emit: __emit }) {
862
+ const i18n = useI18n();
863
+ const mcpStore = useMCPStore();
864
+ const props = __props;
865
+ const emit = __emit;
866
+ const tableHeaders = ref([
867
+ {
868
+ title: i18n.baseText("settings.mcp.oAuthClients.table.clientName"),
869
+ key: "name",
870
+ width: 250,
871
+ disableSort: true,
872
+ value() {}
873
+ },
874
+ {
875
+ title: i18n.baseText("settings.mcp.oAuthClients.table.connectedAt"),
876
+ key: "createdAt",
877
+ width: 250,
878
+ disableSort: true,
879
+ value() {}
880
+ },
881
+ {
882
+ title: "",
883
+ key: "actions",
884
+ align: "end",
885
+ width: 50,
886
+ disableSort: true,
887
+ value() {}
888
+ }
889
+ ]);
890
+ const tableActions = ref([{
891
+ label: i18n.baseText("settings.mcp.oAuthClients.table.action.revokeAccess"),
892
+ value: "revokeClient"
893
+ }]);
894
+ const onTableAction = (action, item) => {
895
+ if (action === "revokeClient") emit("revokeClient", item);
896
+ };
897
+ return (_ctx, _cache) => {
898
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [props.loading ? (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(N8nLoading_default), {
899
+ loading: props.loading,
900
+ variant: "h1",
901
+ class: "mb-l"
902
+ }, null, 8, ["loading"]), createVNode(unref(N8nLoading_default), {
903
+ loading: props.loading,
904
+ variant: "p",
905
+ rows: 5,
906
+ "shrink-last": false
907
+ }, null, 8, ["loading"])])) : (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(unref(N8nDataTableServer_default), {
908
+ "data-test-id": "oauth-clients-data-table",
909
+ headers: tableHeaders.value,
910
+ items: props.clients,
911
+ "items-length": props.clients.length
912
+ }, createSlots({
913
+ [`item.name`]: withCtx(({ item }) => [createVNode(unref(N8nText_default), {
914
+ "data-test-id": "mcp-client-name",
915
+ color: "text-base"
916
+ }, {
917
+ default: withCtx(() => [createTextVNode(toDisplayString(item.name), 1)]),
918
+ _: 2
919
+ }, 1024)]),
920
+ [`item.createdAt`]: withCtx(({ item }) => [createVNode(unref(N8nText_default), {
921
+ "data-test-id": "mcp-client-created-at",
922
+ color: "text-base"
923
+ }, {
924
+ default: withCtx(() => [createVNode(TimeAgo_default, { date: String(item.createdAt) }, null, 8, ["date"])]),
925
+ _: 2
926
+ }, 1024)]),
927
+ [`item.actions`]: withCtx(({ item }) => [createVNode(unref(N8nActionToggle_default), {
928
+ "data-test-id": "mcp-oauth-client-action-toggle",
929
+ placement: "bottom",
930
+ actions: tableActions.value,
931
+ theme: "dark",
932
+ onAction: ($event) => onTableAction($event, item)
933
+ }, null, 8, ["actions", "onAction"])]),
934
+ _: 2
935
+ }, [props.clients.length === 0 ? {
936
+ name: "cover",
937
+ fn: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["empty-state"]) }, [
938
+ createVNode(unref(N8nText_default), {
939
+ "data-test-id": "mcp-workflow-table-empty-state",
940
+ size: "large",
941
+ color: "text-base"
942
+ }, {
943
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.oauth.table.empty.title")), 1)]),
944
+ _: 1
945
+ }),
946
+ createVNode(unref(N8nText_default), {
947
+ "data-test-id": "mcp-workflow-table-empty-state-description",
948
+ size: "small",
949
+ color: "text-base"
950
+ }, {
951
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.oauth.table.empty.description")), 1)]),
952
+ _: 1
953
+ }),
954
+ createVNode(unref(N8nButton_default), {
955
+ "data-test-id": "mcp-oauth-create-client-button",
956
+ variant: "primary",
957
+ onClick: _cache[0] || (_cache[0] = ($event) => unref(mcpStore).openConnectPopover())
958
+ }, {
959
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.oauth.table.empty.button")), 1)]),
960
+ _: 1
961
+ })
962
+ ], 2)]),
963
+ key: "0"
964
+ } : void 0]), 1032, [
965
+ "headers",
966
+ "items",
967
+ "items-length"
968
+ ])]))]);
969
+ };
970
+ }
971
+ });
972
+ var OAuthClientsTable_vue_vue_type_style_index_0_lang_module_default = {
973
+ header: "_header_1awbw_123",
974
+ "empty-state": "_empty-state_1awbw_129"
975
+ };
976
+ var OAuthClientsTable_default = /* @__PURE__ */ __plugin_vue_export_helper_default(OAuthClientsTable_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": OAuthClientsTable_vue_vue_type_style_index_0_lang_module_default }]]);
977
+ var _hoisted_1 = { "data-test-id": "mcp-settings-description" };
978
+ var SettingsMCPView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
979
+ __name: "SettingsMCPView",
980
+ setup(__props) {
981
+ const i18n = useI18n();
982
+ const toast = useToast();
983
+ const documentTitle = useDocumentTitle();
984
+ const mcp = useMcp();
985
+ const telemetry = useTelemetry();
986
+ const mcpStore = useMCPStore();
987
+ const usersStore = useUsersStore();
988
+ const uiStore = useUIStore();
989
+ const mcpStatusLoading = ref(false);
990
+ const selectedTab = ref("workflows");
991
+ const tabs = ref([{
992
+ label: i18n.baseText("settings.mcp.tabs.workflows"),
993
+ value: "workflows"
994
+ }, {
995
+ label: i18n.baseText("settings.mcp.tabs.oauth"),
996
+ value: "oauth"
997
+ }]);
998
+ const workflowsLoading = ref(false);
999
+ const availableWorkflows = ref([]);
1000
+ const oAuthClientsLoading = ref(false);
1001
+ const connectedOAuthClients = ref([]);
1002
+ const isOwner = computed(() => usersStore.isInstanceOwner);
1003
+ const isAdmin = computed(() => usersStore.isAdmin);
1004
+ const canToggleMCP = computed(() => isOwner.value || isAdmin.value);
1005
+ const showConnectWorkflowsButton = computed(() => {
1006
+ return selectedTab.value === "workflows" && availableWorkflows.value.length > 0;
1007
+ });
1008
+ const onTabSelected = async (tab) => {
1009
+ selectedTab.value = tab;
1010
+ if (tab === "workflows" && availableWorkflows.value.length === 0) await fetchAvailableWorkflows();
1011
+ else if (tab === "oauth" && connectedOAuthClients.value.length === 0) {
1012
+ await fetchoAuthCLients();
1013
+ telemetry.track("User clicked connected clients tab");
1014
+ }
1015
+ };
1016
+ const onToggleMCPAccess = async (enabled) => {
1017
+ try {
1018
+ mcpStatusLoading.value = true;
1019
+ if (await mcpStore.setMcpAccessEnabled(enabled)) {
1020
+ await fetchAvailableWorkflows();
1021
+ await fetchoAuthCLients();
1022
+ } else workflowsLoading.value = false;
1023
+ mcp.trackUserToggledMcpAccess(enabled);
1024
+ } catch (error) {
1025
+ toast.showError(error, i18n.baseText("settings.mcp.toggle.error"));
1026
+ } finally {
1027
+ mcpStatusLoading.value = false;
1028
+ workflowsLoading.value = false;
1029
+ }
1030
+ };
1031
+ const onToggleWorkflowMCPAccess = async (workflowId, isEnabled) => {
1032
+ try {
1033
+ await mcpStore.toggleWorkflowMcpAccess(workflowId, isEnabled);
1034
+ if (isEnabled) await fetchAvailableWorkflows();
1035
+ else availableWorkflows.value = availableWorkflows.value.filter((w) => w.id !== workflowId);
1036
+ } catch (error) {
1037
+ toast.showError(error, i18n.baseText("workflowSettings.toggleMCP.error.title"));
1038
+ throw error;
1039
+ }
1040
+ };
1041
+ const onUpdateDescription = (workflow) => {
1042
+ uiStore.openModalWithData({
1043
+ name: WORKFLOW_DESCRIPTION_MODAL_KEY,
1044
+ data: {
1045
+ workflowId: workflow.id,
1046
+ workflowDescription: workflow.description ?? "",
1047
+ onSave: (updatedDescription) => {
1048
+ const index = availableWorkflows.value.findIndex((w) => w.id === workflow.id);
1049
+ if (index !== -1) availableWorkflows.value[index] = {
1050
+ ...availableWorkflows.value[index],
1051
+ description: updatedDescription ?? void 0
1052
+ };
1053
+ }
1054
+ }
1055
+ });
1056
+ };
1057
+ const onTableRefresh = async () => {
1058
+ if (selectedTab.value === "workflows") await fetchAvailableWorkflows();
1059
+ else if (selectedTab.value === "oauth") await fetchoAuthCLients();
1060
+ };
1061
+ const fetchAvailableWorkflows = async () => {
1062
+ workflowsLoading.value = true;
1063
+ try {
1064
+ availableWorkflows.value = await mcpStore.fetchWorkflowsAvailableForMCP(1, 200);
1065
+ } catch (error) {
1066
+ toast.showError(error, i18n.baseText("workflows.list.error.fetching"));
1067
+ } finally {
1068
+ setTimeout(() => {
1069
+ workflowsLoading.value = false;
1070
+ }, 200);
1071
+ }
1072
+ };
1073
+ const onRefreshWorkflows = async () => {
1074
+ await fetchAvailableWorkflows();
1075
+ };
1076
+ const fetchoAuthCLients = async () => {
1077
+ try {
1078
+ oAuthClientsLoading.value = true;
1079
+ connectedOAuthClients.value = await mcpStore.getAllOAuthClients();
1080
+ } catch (error) {
1081
+ toast.showError(error, i18n.baseText("settings.mcp.error.fetching.oAuthClients"));
1082
+ } finally {
1083
+ setTimeout(() => {
1084
+ oAuthClientsLoading.value = false;
1085
+ }, 200);
1086
+ }
1087
+ };
1088
+ const revokeClientAccess = async (client) => {
1089
+ try {
1090
+ await mcpStore.removeOAuthClient(client.id);
1091
+ connectedOAuthClients.value = connectedOAuthClients.value.filter((c) => c.id !== client.id);
1092
+ toast.showMessage({
1093
+ type: "success",
1094
+ title: i18n.baseText("settings.mcp.oAuthClients.revoke.success.title"),
1095
+ message: i18n.baseText("settings.mcp.oAuthClients.revoke.success.message", { interpolate: { name: client.name } })
1096
+ });
1097
+ } catch (error) {
1098
+ toast.showError(error, i18n.baseText("settings.mcp.oAuthClients.revoke.error"));
1099
+ }
1100
+ };
1101
+ const openConnectWorkflowsModal = () => {
1102
+ uiStore.openModalWithData({
1103
+ name: MCP_CONNECT_WORKFLOWS_MODAL_KEY,
1104
+ data: { onEnableMcpAccess: async (workflowId) => {
1105
+ await onToggleWorkflowMCPAccess(workflowId, true);
1106
+ } }
1107
+ });
1108
+ telemetry.track("User clicked connect workflows from mcp settings");
1109
+ };
1110
+ onMounted(async () => {
1111
+ documentTitle.set(i18n.baseText("settings.mcp"));
1112
+ if (!mcpStore.mcpAccessEnabled) return;
1113
+ await fetchAvailableWorkflows();
1114
+ });
1115
+ return (_ctx, _cache) => {
1116
+ return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.container) }, [
1117
+ createBaseVNode("header", {
1118
+ class: normalizeClass(_ctx.$style["main-header"]),
1119
+ "data-test-id": "mcp-settings-header"
1120
+ }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.headings) }, [createVNode(unref(N8nHeading_default), {
1121
+ size: "2xlarge",
1122
+ class: "mb-2xs"
1123
+ }, {
1124
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp")), 1)]),
1125
+ _: 1
1126
+ }), withDirectives(createBaseVNode("div", _hoisted_1, [createVNode(unref(N8nText_default), {
1127
+ size: "small",
1128
+ color: "text-light"
1129
+ }, {
1130
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.mcp.description")) + ". ", 1)]),
1131
+ _: 1
1132
+ }), createVNode(unref(N8nLink_default), {
1133
+ href: unref(MCP_DOCS_PAGE_URL),
1134
+ target: "_blank",
1135
+ rel: "noopener noreferrer",
1136
+ size: "small",
1137
+ "data-test-id": "mcp-docs-link"
1138
+ }, {
1139
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.learnMore")), 1)]),
1140
+ _: 1
1141
+ }, 8, ["href"])], 512), [[vShow, unref(mcpStore).mcpAccessEnabled]])], 2), createVNode(MCPHeaderActions_default, {
1142
+ "access-enabled": unref(mcpStore).mcpAccessEnabled,
1143
+ "toggle-disabled": !canToggleMCP.value,
1144
+ loading: mcpStatusLoading.value,
1145
+ onDisableMcpAccess: _cache[0] || (_cache[0] = ($event) => onToggleMCPAccess(!unref(mcpStore).mcpAccessEnabled))
1146
+ }, null, 8, [
1147
+ "access-enabled",
1148
+ "toggle-disabled",
1149
+ "loading"
1150
+ ])], 2),
1151
+ !unref(mcpStore).mcpAccessEnabled ? (openBlock(), createBlock(MCPEmptyState_default, {
1152
+ key: 0,
1153
+ disabled: !canToggleMCP.value,
1154
+ loading: mcpStatusLoading.value,
1155
+ onTurnOnMcp: _cache[1] || (_cache[1] = ($event) => onToggleMCPAccess(true))
1156
+ }, null, 8, ["disabled", "loading"])) : createCommentVNode("", true),
1157
+ unref(mcpStore).mcpAccessEnabled ? (openBlock(), createElementBlock("div", {
1158
+ key: 1,
1159
+ class: normalizeClass(_ctx.$style.container),
1160
+ "data-test-id": "mcp-enabled-section"
1161
+ }, [createBaseVNode("header", { class: normalizeClass(_ctx.$style["tabs-header"]) }, [createVNode(unref(N8nTabs_default), {
1162
+ "model-value": selectedTab.value,
1163
+ options: tabs.value,
1164
+ "onUpdate:modelValue": onTabSelected
1165
+ }, null, 8, ["model-value", "options"]), createBaseVNode("div", { class: normalizeClass(_ctx.$style.actions) }, [showConnectWorkflowsButton.value ? (openBlock(), createBlock(unref(N8nButton_default), {
1166
+ key: 0,
1167
+ label: unref(i18n).baseText("settings.mcp.connectWorkflows"),
1168
+ "data-test-id": "mcp-connect-workflows-header-button",
1169
+ size: "small",
1170
+ type: "primary",
1171
+ onClick: openConnectWorkflowsModal
1172
+ }, null, 8, ["label"])) : createCommentVNode("", true), createVNode(unref(N8nTooltip_default), { content: unref(i18n).baseText("settings.mcp.refresh.tooltip") }, {
1173
+ default: withCtx(() => [createVNode(unref(N8nButton_default), {
1174
+ "data-test-id": "mcp-workflows-refresh-button",
1175
+ size: "small",
1176
+ type: "tertiary",
1177
+ icon: "refresh-cw",
1178
+ square: true,
1179
+ onClick: onTableRefresh
1180
+ })]),
1181
+ _: 1
1182
+ }, 8, ["content"])], 2)], 2), createBaseVNode("main", null, [selectedTab.value === "workflows" ? (openBlock(), createBlock(WorkflowsTable_default, {
1183
+ key: 0,
1184
+ "data-test-id": "mcp-workflow-table",
1185
+ workflows: availableWorkflows.value,
1186
+ loading: workflowsLoading.value,
1187
+ onRemoveMcpAccess: _cache[2] || (_cache[2] = (workflow) => onToggleWorkflowMCPAccess(workflow.id, false)),
1188
+ onConnectWorkflows: openConnectWorkflowsModal,
1189
+ onUpdateDescription,
1190
+ onRefresh: onRefreshWorkflows
1191
+ }, null, 8, ["workflows", "loading"])) : selectedTab.value === "oauth" ? (openBlock(), createBlock(OAuthClientsTable_default, {
1192
+ key: 1,
1193
+ "data-test-id": "mcp-oauth-clients-table",
1194
+ clients: connectedOAuthClients.value,
1195
+ loading: oAuthClientsLoading.value,
1196
+ onRevokeClient: revokeClientAccess,
1197
+ onRefresh: onTableRefresh
1198
+ }, null, 8, ["clients", "loading"])) : createCommentVNode("", true)])], 2)) : createCommentVNode("", true)
1199
+ ], 2);
1200
+ };
1201
+ }
1202
+ });
1203
+ const container = "_container_84c03_123";
1204
+ const headings = "_headings_84c03_141";
1205
+ const actions = "_actions_84c03_153";
1206
+ var SettingsMCPView_vue_vue_type_style_index_0_lang_module_default = {
1207
+ container,
1208
+ "main-header": "_main-header_84c03_128",
1209
+ headings,
1210
+ "tabs-header": "_tabs-header_84c03_147",
1211
+ actions
1212
+ };
1213
+ var SettingsMCPView_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SettingsMCPView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SettingsMCPView_vue_vue_type_style_index_0_lang_module_default }]]);
1214
+ export { SettingsMCPView_default as default };