import { d as defineComponent, d6 as reactive, o as onMounted, bp as useExternalHooks, W as onBeforeUnmount, c1 as toRefs, h as createElementBlock, g as openBlock, n as normalizeClass, j as createBaseVNode, f as createCommentVNode, i as createVNode, N as N8nIcon, _ as _export_sfc, l as unref, i2 as REGULAR_NODE_CREATOR_VIEW, F as Fragment, X as renderSlot, i3 as useViewStacks, r as ref, ep as useCommunityNodesStore, ad as useNodeTypesStore, x as computed, u as useUsersStore, e as createBlock, p as N8nText, w as withCtx, k as createTextVNode, t as toDisplayString, i4 as _sfc_main$b, a9 as Tooltip, f0 as i18n, i5 as captureException, i6 as useKeyboardNavigation, hl as useActions, d8 as useNodeCreatorStore, bm as useCalloutHelpers, i7 as CUSTOM_API_CALL_KEY, i8 as TRIGGER_NODE_CREATOR_VIEW, i9 as isNodePreviewKey, ia as OPEN_AI_NODE_TYPE, ib as OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE, al as useTelemetry, ic as getActiveViewCallouts, cc as resolveDirective, id as ItemsRenderer, br as createSlots, ie as withMemo, ig as CategorizedItemsRenderer, c as useI18n, z as N8nCallout, b2 as withDirectives, cQ as InfoTip, B as withModifiers, ih as CommunityNodeFooter, ii as HTTP_REQUEST_NODE_TYPE, fu as createStaticVNode, C as N8nLink, ij as REQUEST_NODE_FORM_URL, ik as filterAndSearchNodes, il as getRootSearchCallouts, hJ as WEBHOOK_NODE_TYPE, im as PRE_BUILT_AGENTS_COLLECTION, io as camelCase, ip as shouldShowCommunityNodeDetails, fk as isCommunityPackageName, iq as prepareCommunityNodeDetailsViewStack, hQ as getNodeIconSource, ir as transformNodeType, is as AINodesView, it as AIView, iu as RegularView, iv as TriggerView, iw as flattenCreateElements, ix as HITL_SUBCATEGORY, iy as getHumanInTheLoopActions, iz as AI_OTHERS_NODE_CREATOR_VIEW, iA as AI_NODE_CREATOR_VIEW, a as useToast, bX as NodeIcon, iB as OfficialIcon, q as N8nButton, d9 as useCredentialsStore, iC as removePreviewToken, P as useDebounce, c7 as onUnmounted, a7 as watch, e7 as N8nNotice, c2 as normalizeProps, K as mergeProps, hL as Transition, iD as AI_EVALUATION, iE as AI_UNCATEGORIZED_CATEGORY, Q as useUIStore, fi as useAssistantStore, dc as useBuilderStore, bq as onClickOutside, aa as _sfc_main$c, ap as normalizeStyle, iF as SlideTransition, dH as DRAG_EVENT_DATA_KEY, iG as useActionsGenerator } from "./index--OJ5nhDf.js";
const _hoisted_1$5 = ["placeholder", "value"];
const _sfc_main$a = /* @__PURE__ */ defineComponent({
  __name: "SearchBar",
  props: {
    placeholder: { default: "" },
    modelValue: { default: "" }
  },
  emits: ["update:modelValue"],
  setup(__props, { expose: __expose, emit: __emit }) {
    const emit = __emit;
    const state = reactive({
      inputRef: null
    });
    const externalHooks = useExternalHooks();
    function focus() {
      state.inputRef?.focus();
    }
    function onInput(event) {
      const input = event.target;
      emit("update:modelValue", input.value.trim());
    }
    function clear2() {
      emit("update:modelValue", "");
    }
    onMounted(() => {
      void externalHooks.run("nodeCreatorSearchBar.mount", { inputRef: state.inputRef });
      setTimeout(focus, 0);
    });
    onBeforeUnmount(() => {
      state.inputRef?.remove();
    });
    const { inputRef } = toRefs(state);
    __expose({
      focus
    });
    return (_ctx, _cache) => {
      const _component_n8n_icon = N8nIcon;
      return openBlock(), createElementBlock("div", {
        class: normalizeClass(_ctx.$style.searchContainer),
        "data-test-id": "search-bar"
      }, [
        createBaseVNode("div", {
          class: normalizeClass({ [_ctx.$style.prefix]: true, [_ctx.$style.active]: _ctx.modelValue.length > 0 })
        }, [
          createVNode(_component_n8n_icon, {
            icon: "search",
            size: "small"
          })
        ], 2),
        createBaseVNode("div", {
          class: normalizeClass(_ctx.$style.text)
        }, [
          createBaseVNode("input", {
            ref_key: "inputRef",
            ref: inputRef,
            placeholder: _ctx.placeholder,
            value: _ctx.modelValue,
            class: normalizeClass(_ctx.$style.input),
            autofocus: "",
            "data-test-id": "node-creator-search-bar",
            tabindex: "0",
            onInput
          }, null, 42, _hoisted_1$5)
        ], 2),
        _ctx.modelValue.length > 0 ? (openBlock(), createElementBlock("div", {
          key: 0,
          class: normalizeClass([_ctx.$style.suffix, _ctx.$style.clickable]),
          onClick: clear2
        }, [
          createVNode(_component_n8n_icon, {
            size: "small",
            icon: "circle-x"
          })
        ], 2)) : createCommentVNode("", true)
      ], 2);
    };
  }
});
const searchContainer = "_searchContainer_w19t7_123";
const prefix = "_prefix_w19t7_139";
const active$1 = "_active_w19t7_144";
const text = "_text_w19t7_148";
const suffix = "_suffix_w19t7_164";
const clear = "_clear_w19t7_170";
const clickable = "_clickable_w19t7_183";
const style0$8 = {
  searchContainer,
  prefix,
  active: active$1,
  text,
  suffix,
  clear,
  clickable
};
const cssModules$8 = {
  "$style": style0$8
};
const SearchBar = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$8]]);
const _sfc_main$9 = /* @__PURE__ */ defineComponent({
  __name: "OrderSwitcher",
  props: {
    rootView: {}
  },
  setup(__props) {
    return (_ctx, _cache) => {
      return openBlock(), createElementBlock("div", null, [
        _ctx.rootView === unref(REGULAR_NODE_CREATOR_VIEW) ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
          renderSlot(_ctx.$slots, "actions"),
          renderSlot(_ctx.$slots, "triggers")
        ], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
          renderSlot(_ctx.$slots, "triggers"),
          renderSlot(_ctx.$slots, "actions")
        ], 64))
      ]);
    };
  }
});
const _hoisted_1$4 = {
  viewBox: "0 0 512 512",
  width: "1.2em",
  height: "1.2em"
};
function render(_ctx, _cache) {
  return openBlock(), createElementBlock("svg", _hoisted_1$4, _cache[0] || (_cache[0] = [
    createBaseVNode("path", {
      fill: "currentColor",
      d: "m466.5 83.7l-192-80a48.15 48.15 0 0 0-36.9 0l-192 80C27.7 91.1 16 108.6 16 128c0 198.5 114.5 335.7 221.5 380.3c11.8 4.9 25.1 4.9 36.9 0C360.1 472.6 496 349.3 496 128c0-19.4-11.7-36.9-29.5-44.3M256.1 446.3l-.1-381l175.9 73.3c-3.3 151.4-82.1 261.1-175.8 307.7"
    }, null, -1)
  ]));
}
const ShieldIcon = { name: "fa-solid-shield-alt", render };
const _hoisted_1$3 = { key: 2 };
const _hoisted_2$2 = { key: 3 };
const _hoisted_3 = { style: { "padding-bottom": "8px" } };
const _sfc_main$8 = /* @__PURE__ */ defineComponent({
  __name: "CommunityNodeInfo",
  setup(__props) {
    const { activeViewStack } = useViewStacks();
    const { communityNodeDetails } = activeViewStack;
    const publisherName = ref(void 0);
    const downloads = ref(null);
    const verified = ref(false);
    const official = ref(false);
    const installedPackage = ref(void 0);
    const communityNodesStore = useCommunityNodesStore();
    const nodeTypesStore = useNodeTypesStore();
    const isOwner = computed(() => useUsersStore().isInstanceOwner);
    const ownerEmailList = computed(
      () => useUsersStore().allUsers.filter((user) => user.role?.includes("owner")).map((user) => user.email)
    );
    const formatNumber = (number) => {
      if (!number) return null;
      return new Intl.NumberFormat("en-US").format(number);
    };
    async function fetchPackageInfo(packageName) {
      const communityNodeAttributes = await nodeTypesStore.getCommunityNodeAttributes(
        activeViewStack.communityNodeDetails?.key || ""
      );
      if (communityNodeDetails?.installed) {
        installedPackage.value = await communityNodesStore.getInstalledPackage(
          communityNodeDetails.packageName
        );
      }
      if (communityNodeAttributes) {
        publisherName.value = communityNodeAttributes.companyName ?? communityNodeAttributes.authorName;
        downloads.value = formatNumber(communityNodeAttributes.numberOfDownloads);
        official.value = communityNodeAttributes.isOfficialNode;
        if (!installedPackage.value) {
          verified.value = true;
        } else {
          const verifiedVersions = communityNodeAttributes.nodeVersions?.map((v) => v.npmVersion) ?? [];
          verified.value = verifiedVersions.includes(installedPackage.value.installedVersion);
        }
        return;
      }
      const url = `https://registry.npmjs.org/${packageName}`;
      try {
        const response = await fetch(url);
        if (!response.ok) {
          captureException(new Error("Could not get metadata for package"), { extra: { packageName } });
          return;
        }
        const data = await response.json();
        const publisher = data.maintainers?.[0]?.name;
        publisherName.value = publisher;
        const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
        const downloadsUrl = `https://api.npmjs.org/downloads/range/2022-01-01:${today}/${packageName}`;
        const downloadsResponse = await fetch(downloadsUrl);
        if (!downloadsResponse.ok) {
          captureException(new Error("Could not get downloads for package"), {
            extra: { packageName }
          });
          return;
        }
        const downloadsData = await downloadsResponse.json();
        if (!downloadsData.downloads?.length) return;
        const total = downloadsData.downloads.reduce((sum, day) => sum + day.downloads, 0);
        downloads.value = formatNumber(total);
      } catch (error) {
        captureException(error, { extra: { packageName } });
      }
    }
    onMounted(async () => {
      if (communityNodeDetails?.packageName) {
        await fetchPackageInfo(communityNodeDetails.packageName);
      }
    });
    return (_ctx, _cache) => {
      const _component_CommunityNodeUpdateInfo = _sfc_main$b;
      return openBlock(), createElementBlock("div", {
        class: normalizeClass(_ctx.$style.container)
      }, [
        createVNode(unref(N8nText), {
          class: normalizeClass(_ctx.$style.description),
          color: "text-base",
          size: "medium"
        }, {
          default: withCtx(() => [
            createTextVNode(toDisplayString(unref(communityNodeDetails)?.description), 1)
          ]),
          _: 1
        }, 8, ["class"]),
        isOwner.value && installedPackage.value?.updateAvailable ? (openBlock(), createBlock(_component_CommunityNodeUpdateInfo, {
          key: 0,
          "data-test-id": "update-available"
        })) : (openBlock(), createElementBlock("div", {
          key: 1,
          class: normalizeClass(_ctx.$style.separator)
        }, null, 2)),
        createBaseVNode("div", {
          class: normalizeClass(_ctx.$style.info)
        }, [
          verified.value ? (openBlock(), createBlock(unref(Tooltip), {
            key: 0,
            placement: "top"
          }, {
            content: withCtx(() => [
              createTextVNode(toDisplayString(official.value ? unref(i18n).baseText("communityNodeInfo.officialApproved") : unref(i18n).baseText("communityNodeInfo.approved")), 1)
            ]),
            default: withCtx(() => [
              createBaseVNode("div", null, [
                createVNode(unref(ShieldIcon), {
                  class: normalizeClass(_ctx.$style.tooltipIcon)
                }, null, 8, ["class"]),
                createVNode(unref(N8nText), {
                  color: "text-light",
                  size: "xsmall",
                  bold: "",
                  "data-test-id": "verified-tag"
                }, {
                  default: withCtx(() => [
                    createTextVNode(toDisplayString(unref(i18n).baseText("communityNodeInfo.approved.label")), 1)
                  ]),
                  _: 1
                })
              ])
            ]),
            _: 1
          })) : (openBlock(), createBlock(unref(Tooltip), {
            key: 1,
            placement: "top"
          }, {
            content: withCtx(() => [
              createTextVNode(toDisplayString(unref(i18n).baseText("communityNodeInfo.unverified")), 1)
            ]),
            default: withCtx(() => [
              createBaseVNode("div", null, [
                createVNode(unref(N8nIcon), {
                  class: normalizeClass(_ctx.$style.tooltipIcon),
                  icon: "box"
                }, null, 8, ["class"]),
                createVNode(unref(N8nText), {
                  color: "text-light",
                  size: "xsmall",
                  bold: ""
                }, {
                  default: withCtx(() => [
                    createTextVNode(toDisplayString(unref(i18n).baseText("communityNodeInfo.unverified.label")), 1)
                  ]),
                  _: 1
                })
              ])
            ]),
            _: 1
          })),
          downloads.value ? (openBlock(), createElementBlock("div", _hoisted_1$3, [
            createVNode(unref(N8nIcon), {
              class: normalizeClass(_ctx.$style.tooltipIcon),
              icon: "hard-drive-download"
            }, null, 8, ["class"]),
            createVNode(unref(N8nText), {
              color: "text-light",
              size: "xsmall",
              bold: "",
              "data-test-id": "number-of-downloads"
            }, {
              default: withCtx(() => [
                createTextVNode(toDisplayString(unref(i18n).baseText("communityNodeInfo.downloads", { interpolate: { downloads: downloads.value } })), 1)
              ]),
              _: 1
            })
          ])) : createCommentVNode("", true),
          publisherName.value ? (openBlock(), createElementBlock("div", _hoisted_2$2, [
            createVNode(unref(N8nIcon), {
              class: normalizeClass(_ctx.$style.tooltipIcon),
              icon: "user"
            }, null, 8, ["class"]),
            createVNode(unref(N8nText), {
              color: "text-light",
              size: "xsmall",
              bold: "",
              "data-test-id": "publisher-name"
            }, {
              default: withCtx(() => [
                createTextVNode(toDisplayString(unref(i18n).baseText("communityNodeInfo.publishedBy", { interpolate: { publisherName: publisherName.value } })), 1)
              ]),
              _: 1
            })
          ])) : createCommentVNode("", true)
        ], 2),
        !isOwner.value && !unref(communityNodeDetails)?.installed ? (openBlock(), createElementBlock("div", {
          key: 2,
          class: normalizeClass(_ctx.$style.contactOwnerHint)
        }, [
          createVNode(unref(N8nIcon), {
            color: "text-light",
            icon: "info",
            size: "large"
          }),
          createVNode(unref(N8nText), {
            color: "text-base",
            size: "medium"
          }, {
            default: withCtx(() => [
              createBaseVNode("div", _hoisted_3, toDisplayString(unref(i18n).baseText("communityNodeInfo.contact.admin")), 1),
              ownerEmailList.value.length ? (openBlock(), createBlock(unref(N8nText), {
                key: 0,
                bold: ""
              }, {
                default: withCtx(() => [
                  createTextVNode(toDisplayString(ownerEmailList.value.join(", ")), 1)
                ]),
                _: 1
              })) : createCommentVNode("", true)
            ]),
            _: 1
          })
        ], 2)) : createCommentVNode("", true)
      ], 2);
    };
  }
});
const container$3 = "_container_6y5mo_123";
const nodeIcon$2 = "_nodeIcon_6y5mo_132";
const description = "_description_6y5mo_137";
const separator = "_separator_6y5mo_141";
const info$1 = "_info_6y5mo_147";
const tooltipIcon = "_tooltipIcon_6y5mo_162";
const contactOwnerHint = "_contactOwnerHint_6y5mo_168";
const style0$7 = {
  container: container$3,
  nodeIcon: nodeIcon$2,
  description,
  separator,
  info: info$1,
  tooltipIcon,
  contactOwnerHint
};
const cssModules$7 = {
  "$style": style0$7
};
const CommunityNodeInfo = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$7]]);
const _sfc_main$7 = /* @__PURE__ */ defineComponent({
  __name: "ActionsMode",
  emits: ["nodeTypeSelected"],
  setup(__props, { emit: __emit }) {
    const emit = __emit;
    const telemetry = useTelemetry();
    const i18n2 = useI18n();
    const { userActivated, isInstanceOwner } = useUsersStore();
    const { popViewStack, updateCurrentViewStack } = useViewStacks();
    const { registerKeyHook } = useKeyboardNavigation();
    const {
      setAddedNodeActionParameters,
      getActionData,
      actionDataToNodeTypeSelectedPayload,
      getPlaceholderTriggerActions,
      parseCategoryActions,
      actionsCategoryLocales
    } = useActions();
    const nodeCreatorStore = useNodeCreatorStore();
    const calloutHelpers = useCalloutHelpers();
    const parsedTriggerActions = computed(
      () => parseActions(actions.value, actionsCategoryLocales.value.triggers, false)
    );
    const parsedActionActions = computed(
      () => parseActions(actions.value, actionsCategoryLocales.value.actions, !search.value)
    );
    const parsedTriggerActionsBaseline = computed(
      () => parseActions(
        useViewStacks().activeViewStack.baselineItems || [],
        actionsCategoryLocales.value.triggers,
        false
      )
    );
    const parsedActionActionsBaseline = computed(
      () => parseActions(
        useViewStacks().activeViewStack.baselineItems || [],
        actionsCategoryLocales.value.actions,
        !search.value
      )
    );
    const triggerCategoryName = computed(
      () => parsedTriggerActions.value.length || search.value ? actionsCategoryLocales.value.triggers : `${actionsCategoryLocales.value.triggers} (${placeholderTriggerActions.length})`
    );
    const actions = computed(() => {
      return (useViewStacks().activeViewStack.items || []).filter(
        (p) => p.properties.actionKey !== CUSTOM_API_CALL_KEY
      );
    });
    const search = computed(() => useViewStacks().activeViewStack.search);
    const subcategory = computed(() => useViewStacks().activeViewStack.subcategory);
    const rootView = computed(() => useViewStacks().activeViewStack.rootView);
    const communityNodeDetails = computed(() => useViewStacks().activeViewStack?.communityNodeDetails);
    const placeholderTriggerActions = getPlaceholderTriggerActions(subcategory.value || "");
    const hasNoTriggerActions = computed(
      () => parseCategoryActions(
        useViewStacks().activeViewStack.baselineItems || [],
        actionsCategoryLocales.value.triggers,
        !search.value
      ).length === 0
    );
    const containsAPIAction = computed(() => {
      const actions2 = useViewStacks().activeViewStack.baselineItems || [];
      const result = actions2.some((p) => {
        return (p.properties.actionKey ?? "") === CUSTOM_API_CALL_KEY;
      });
      return result;
    });
    const isTriggerRootView = computed(() => rootView.value === TRIGGER_NODE_CREATOR_VIEW);
    const shouldShowTriggers = computed(() => {
      if (communityNodeDetails.value && !parsedTriggerActions.value.length) {
        return !isNodePreviewKey(useViewStacks().activeViewStack?.items?.[0].key) && isTriggerRootView.value;
      }
      return isTriggerRootView.value || parsedTriggerActionsBaseline.value.length !== 0;
    });
    registerKeyHook("ActionsKeyRight", {
      keyboardKeys: ["ArrowRight", "Enter"],
      condition: (type) => type === "action",
      handler: onKeySelect
    });
    registerKeyHook("ActionsKeyLeft", {
      keyboardKeys: ["ArrowLeft"],
      condition: (type) => type === "action",
      handler: arrowLeft
    });
    function parseActions(base, locale, withLabels = false) {
      return parseCategoryActions(base, locale, withLabels);
    }
    function arrowLeft() {
      popViewStack();
    }
    function onKeySelect(activeItemId) {
      const mergedActions = [...actions.value, ...placeholderTriggerActions];
      const activeAction = mergedActions.find((a) => a.uuid === activeItemId);
      if (activeAction) onSelected(activeAction);
    }
    function onSelected(actionCreateElement) {
      if (actionCreateElement.type === "openTemplate") {
        calloutHelpers.openSampleWorkflowTemplate(actionCreateElement.properties.templateId, {
          telemetry: {
            source: "nodeCreator",
            section: useViewStacks().activeViewStack.title
          }
        });
      }
      if (actionCreateElement.type !== "action") return;
      const actionData = getActionData(actionCreateElement.properties);
      const isPlaceholderTriggerAction = placeholderTriggerActions.some(
        (p) => p.key === actionCreateElement.key
      );
      if (isPlaceholderTriggerAction && isTriggerRootView.value) {
        const actionNode = actions.value[0]?.key;
        if (actionNode) emit("nodeTypeSelected", [{ type: actionData.key }, { type: actionNode }]);
      } else if (actionData?.key === OPEN_AI_NODE_TYPE && actionData?.value?.resource === "assistant" && actionData?.value?.operation === "message") {
        emit("nodeTypeSelected", [{ type: OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE }]);
      } else if (isNodePreviewKey(actionData?.key)) {
        return;
      } else {
        const payload = actionDataToNodeTypeSelectedPayload(actionData);
        emit("nodeTypeSelected", [payload]);
      }
      if (telemetry) setAddedNodeActionParameters(actionData, telemetry, rootView.value);
    }
    function trackActionsView() {
      const activeViewStack = useViewStacks().activeViewStack;
      const trigger_action_count = (activeViewStack.baselineItems || [])?.filter(
        (action2) => action2.key.toLowerCase().includes("trigger")
      ).length;
      const appIdentifier = [...actions.value, ...placeholderTriggerActions][0].key;
      const trackingPayload = {
        app_identifier: appIdentifier,
        actions: (activeViewStack.baselineItems || [])?.map(
          (action2) => action2.properties.displayName
        ),
        regular_action_count: (activeViewStack.baselineItems || [])?.length - trigger_action_count,
        trigger_action_count
      };
      void useExternalHooks().run("nodeCreateList.onViewActions", trackingPayload);
      nodeCreatorStore.onViewActions(trackingPayload);
    }
    function resetSearch2() {
      updateCurrentViewStack({ search: "" });
    }
    function addHttpNode() {
      const updateData = {
        name: "",
        key: HTTP_REQUEST_NODE_TYPE,
        value: {
          authentication: "predefinedCredentialType"
        }
      };
      emit("nodeTypeSelected", [{ type: HTTP_REQUEST_NODE_TYPE }]);
      if (telemetry) setAddedNodeActionParameters(updateData);
      const app_identifier = actions.value[0]?.key;
      if (!app_identifier) return;
      void useExternalHooks().run("nodeCreateList.onActionsCustmAPIClicked", {
        app_identifier
      });
      nodeCreatorStore.onActionsCustomAPIClicked({ app_identifier });
    }
    onMounted(() => {
      trackActionsView();
    });
    const callouts = computed(
      () => getActiveViewCallouts(
        useViewStacks().activeViewStack.title,
        calloutHelpers.isPreBuiltAgentsCalloutVisible.value,
        calloutHelpers.getPreBuiltAgentNodeCreatorItems()
      )
    );
    return (_ctx, _cache) => {
      const _component_n8n_callout = N8nCallout;
      const _component_n8n_info_tip = InfoTip;
      const _directive_n8n_html = resolveDirective("n8n-html");
      return openBlock(), createElementBlock("div", {
        class: normalizeClass({
          [_ctx.$style.container]: true,
          [_ctx.$style.containerPaddingBottom]: !communityNodeDetails.value
        })
      }, [
        createVNode(ItemsRenderer, {
          elements: callouts.value,
          class: normalizeClass(_ctx.$style.items),
          onSelected
        }, null, 8, ["elements", "class"]),
        communityNodeDetails.value ? (openBlock(), createBlock(CommunityNodeInfo, { key: 0 })) : createCommentVNode("", true),
        rootView.value ? (openBlock(), createBlock(_sfc_main$9, {
          key: 1,
          "root-view": rootView.value
        }, createSlots({ _: 2 }, [
          shouldShowTriggers.value ? {
            name: "triggers",
            fn: withCtx(() => [
              withMemo([search.value], () => createVNode(CategorizedItemsRenderer, {
                elements: parsedTriggerActions.value,
                category: triggerCategoryName.value,
                "mouse-over-tooltip": unref(i18n2).baseText("nodeCreator.actionsTooltip.triggersStartWorkflow"),
                "is-trigger-category": "",
                expanded: isTriggerRootView.value || parsedActionActions.value.length === 0,
                onSelected
              }, createSlots({ _: 2 }, [
                hasNoTriggerActions.value ? {
                  name: "empty",
                  fn: withCtx(() => [
                    hasNoTriggerActions.value ? (openBlock(), createBlock(_component_n8n_callout, {
                      key: 0,
                      theme: "info",
                      iconless: "",
                      slim: "",
                      "data-test-id": "actions-panel-no-triggers-callout"
                    }, {
                      default: withCtx(() => [
                        withDirectives(createBaseVNode("span", null, null, 512), [
                          [
                            _directive_n8n_html,
                            unref(i18n2).baseText("nodeCreator.actionsCallout.noTriggerItems", {
                              interpolate: { nodeName: subcategory.value ?? "" }
                            })
                          ]
                        ])
                      ]),
                      _: 1
                    })) : createCommentVNode("", true),
                    createVNode(ItemsRenderer, {
                      elements: unref(placeholderTriggerActions),
                      onSelected
                    }, null, 8, ["elements"])
                  ]),
                  key: "0"
                } : {
                  name: "empty",
                  fn: withCtx(() => [
                    withDirectives(createBaseVNode("p", {
                      class: normalizeClass(_ctx.$style.resetSearch),
                      onClick: resetSearch2
                    }, null, 2), [
                      [_directive_n8n_html, unref(i18n2).baseText("nodeCreator.actionsCategory.noMatchingTriggers")]
                    ])
                  ]),
                  key: "1"
                }
              ]), 1032, ["elements", "category", "mouse-over-tooltip", "expanded"]), _cache, 0)
            ]),
            key: "0"
          } : void 0,
          !isTriggerRootView.value || parsedActionActionsBaseline.value.length !== 0 ? {
            name: "actions",
            fn: withCtx(() => [
              withMemo([search.value], () => createVNode(CategorizedItemsRenderer, {
                elements: parsedActionActions.value,
                category: unref(actionsCategoryLocales).actions,
                "mouse-over-tooltip": unref(i18n2).baseText("nodeCreator.actionsTooltip.actionsPerformStep"),
                expanded: !isTriggerRootView.value || parsedTriggerActions.value.length === 0,
                onSelected
              }, {
                empty: withCtx(() => [
                  !search.value ? (openBlock(), createBlock(_component_n8n_info_tip, {
                    key: 0,
                    theme: "info",
                    type: "note",
                    class: normalizeClass(_ctx.$style.actionsEmpty)
                  }, {
                    default: withCtx(() => [
                      withDirectives(createBaseVNode("span", null, null, 512), [
                        [
                          _directive_n8n_html,
                          unref(i18n2).baseText("nodeCreator.actionsCallout.noActionItems", {
                            interpolate: { nodeName: subcategory.value ?? "" }
                          })
                        ]
                      ])
                    ]),
                    _: 1
                  }, 8, ["class"])) : withDirectives((openBlock(), createElementBlock("p", {
                    key: 1,
                    class: normalizeClass(_ctx.$style.resetSearch),
                    "data-test-id": "actions-panel-no-matching-actions",
                    onClick: resetSearch2
                  }, null, 2)), [
                    [_directive_n8n_html, unref(i18n2).baseText("nodeCreator.actionsCategory.noMatchingActions")]
                  ])
                ]),
                default: withCtx(() => [
                  !unref(userActivated) && isTriggerRootView.value ? (openBlock(), createBlock(_component_n8n_callout, {
                    key: 0,
                    theme: "info",
                    iconless: "",
                    slim: "",
                    "data-test-id": "actions-panel-activation-callout"
                  }, {
                    default: withCtx(() => [
                      withDirectives(createBaseVNode("span", null, null, 512), [
                        [_directive_n8n_html, unref(i18n2).baseText("nodeCreator.actionsCallout.triggersStartWorkflow")]
                      ])
                    ]),
                    _: 1
                  })) : createCommentVNode("", true)
                ]),
                _: 1
              }, 8, ["elements", "category", "mouse-over-tooltip", "expanded"]), _cache, 1)
            ]),
            key: "1"
          } : void 0
        ]), 1032, ["root-view"])) : createCommentVNode("", true),
        containsAPIAction.value && !communityNodeDetails.value ? (openBlock(), createElementBlock("div", {
          key: 2,
          class: normalizeClass(_ctx.$style.apiHint)
        }, [
          withDirectives(createBaseVNode("span", {
            onClick: withModifiers(addHttpNode, ["prevent"])
          }, null, 512), [
            [
              _directive_n8n_html,
              unref(i18n2).baseText("nodeCreator.actionsList.apiCall", {
                interpolate: { node: subcategory.value ?? "" }
              })
            ]
          ])
        ], 2)) : createCommentVNode("", true),
        communityNodeDetails.value ? (openBlock(), createBlock(CommunityNodeFooter, {
          key: 3,
          class: normalizeClass(_ctx.$style.communityNodeFooter),
          "package-name": communityNodeDetails.value.packageName,
          "show-manage": communityNodeDetails.value.installed && unref(isInstanceOwner)
        }, null, 8, ["class", "package-name", "show-manage"])) : createCommentVNode("", true)
      ], 2);
    };
  }
});
const container$2 = "_container_ikzr4_123";
const containerPaddingBottom = "_containerPaddingBottom_ikzr4_129";
const communityNodeFooter = "_communityNodeFooter_ikzr4_133";
const resetSearch = "_resetSearch_ikzr4_137";
const actionsEmpty = "_actionsEmpty_ikzr4_151";
const apiHint = "_apiHint_ikzr4_159";
const style0$6 = {
  container: container$2,
  containerPaddingBottom,
  communityNodeFooter,
  resetSearch,
  actionsEmpty,
  apiHint
};
const cssModules$6 = {
  "$style": style0$6
};
const ActionsRenderer = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__cssModules", cssModules$6]]);
const _sfc_main$6 = {};
const _hoisted_1$2 = {
  width: "75px",
  height: "75px",
  viewBox: "0 0 75 75",
  version: "1.1",
  xmlns: "http://www.w3.org/2000/svg",
  "xmlns:xlink": "http://www.w3.org/1999/xlink"
};
function _sfc_render(_ctx, _cache) {
  return openBlock(), createElementBlock("svg", _hoisted_1$2, _cache[0] || (_cache[0] = [
    createStaticVNode('
no-nodes-keyart', 2)
  ]));
}
const NoResultsIcon = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render]]);
const _hoisted_1$1 = ["textContent"];
const _hoisted_2$1 = ["textContent"];
const _sfc_main$5 = /* @__PURE__ */ defineComponent({
  __name: "NoResults",
  props: {
    showIcon: { type: Boolean },
    showRequest: { type: Boolean },
    rootView: {}
  },
  setup(__props) {
    const i18n2 = useI18n();
    return (_ctx, _cache) => {
      const _component_n8n_link = N8nLink;
      const _component_n8n_icon = N8nIcon;
      return openBlock(), createElementBlock("div", {
        class: normalizeClass({ [_ctx.$style.noResults]: true, [_ctx.$style.iconless]: !_ctx.showIcon }),
        "data-test-id": "node-creator-no-results"
      }, [
        _ctx.showIcon ? (openBlock(), createElementBlock("div", {
          key: 0,
          class: normalizeClass(_ctx.$style.icon)
        }, [
          createVNode(NoResultsIcon)
        ], 2)) : createCommentVNode("", true),
        createBaseVNode("div", {
          class: normalizeClass(_ctx.$style.title)
        }, [
          renderSlot(_ctx.$slots, "title"),
          createBaseVNode("p", {
            textContent: toDisplayString(unref(i18n2).baseText("nodeCreator.noResults.weDidntMakeThatYet"))
          }, null, 8, _hoisted_1$1),
          _ctx.rootView === unref(REGULAR_NODE_CREATOR_VIEW) || _ctx.rootView === unref(TRIGGER_NODE_CREATOR_VIEW) ? (openBlock(), createElementBlock("div", {
            key: 0,
            class: normalizeClass(_ctx.$style.action)
          }, [
            createTextVNode(toDisplayString(unref(i18n2).baseText("nodeCreator.noResults.dontWorryYouCanProbablyDoItWithThe")) + " ", 1),
            _ctx.rootView === unref(REGULAR_NODE_CREATOR_VIEW) ? (openBlock(), createBlock(_component_n8n_link, {
              key: 0,
              onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("addHttpNode"))
            }, {
              default: withCtx(() => [
                createTextVNode(toDisplayString(unref(i18n2).baseText("nodeCreator.noResults.httpRequest")), 1)
              ]),
              _: 1
            })) : createCommentVNode("", true),
            _ctx.rootView === unref(TRIGGER_NODE_CREATOR_VIEW) ? (openBlock(), createBlock(_component_n8n_link, {
              key: 1,
              onClick: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("addWebhookNode"))
            }, {
              default: withCtx(() => [
                createTextVNode(toDisplayString(unref(i18n2).baseText("nodeCreator.noResults.webhook")), 1)
              ]),
              _: 1
            })) : createCommentVNode("", true),
            createTextVNode(" " + toDisplayString(unref(i18n2).baseText("nodeCreator.noResults.node")), 1)
          ], 2)) : createCommentVNode("", true)
        ], 2),
        _ctx.showRequest ? (openBlock(), createElementBlock("div", {
          key: 1,
          class: normalizeClass(_ctx.$style.request)
        }, [
          createBaseVNode("p", {
            textContent: toDisplayString(unref(i18n2).baseText("nodeCreator.noResults.wantUsToMakeItFaster"))
          }, null, 8, _hoisted_2$1),
          createBaseVNode("div", null, [
            createVNode(_component_n8n_link, { to: unref(REQUEST_NODE_FORM_URL) }, {
              default: withCtx(() => [
                createBaseVNode("span", null, toDisplayString(unref(i18n2).baseText("nodeCreator.noResults.requestTheNode")), 1),
                _cache[2] || (_cache[2] = createTextVNode("  ")),
                createBaseVNode("span", null, [
                  createVNode(_component_n8n_icon, {
                    class: normalizeClass(_ctx.$style.external),
                    icon: "external-link",
                    title: unref(i18n2).baseText("nodeCreator.noResults.requestTheNode")
                  }, null, 8, ["class", "title"])
                ])
              ]),
              _: 1
            }, 8, ["to"])
          ])
        ], 2)) : createCommentVNode("", true)
      ], 2);
    };
  }
});
const noResults = "_noResults_17xen_123";
const title$2 = "_title_17xen_136";
const action = "_action_17xen_145";
const request = "_request_17xen_146";
const icon = "_icon_17xen_162";
const external = "_external_17xen_168";
const style0$5 = {
  noResults,
  title: title$2,
  action,
  request,
  icon,
  external
};
const cssModules$5 = {
  "$style": style0$5
};
const NoResults = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__cssModules", cssModules$5]]);
const _sfc_main$4 = /* @__PURE__ */ defineComponent({
  __name: "NodesMode",
  emits: ["nodeTypeSelected"],
  setup(__props, { emit: __emit }) {
    const emit = __emit;
    const i18n2 = useI18n();
    const calloutHelpers = useCalloutHelpers();
    const { mergedNodes, actions, onSubcategorySelected } = useNodeCreatorStore();
    const { pushViewStack, popViewStack, isAiSubcategoryView } = useViewStacks();
    const { setAddedNodeActionParameters, nodeCreateElementToNodeTypeSelectedPayload } = useActions();
    const { registerKeyHook } = useKeyboardNavigation();
    const activeViewStack = computed(() => useViewStacks().activeViewStack);
    const globalSearchItemsDiff = computed(() => useViewStacks().globalSearchItemsDiff);
    const communityNodesAndActions = computed(() => useNodeTypesStore().communityNodesAndActions);
    const moreFromCommunity = computed(() => {
      return filterAndSearchNodes(
        communityNodesAndActions.value.mergedNodes,
        activeViewStack.value.search ?? "",
        isAiSubcategoryView(activeViewStack.value)
      );
    });
    const isSearchResultEmpty = computed(() => {
      return (activeViewStack.value.items || []).length === 0 && globalCallouts.value.length + globalSearchItemsDiff.value.length + moreFromCommunity.value.length === 0;
    });
    function getFilteredActions(node, actions2) {
      const nodeActions = actions2?.[node.key] || [];
      if (activeViewStack.value.subcategory === HITL_SUBCATEGORY) {
        return getHumanInTheLoopActions(nodeActions);
      }
      if (activeViewStack.value.actionsFilter) {
        return activeViewStack.value.actionsFilter(nodeActions);
      }
      return nodeActions;
    }
    function onSelected(item) {
      if (item.key === PRE_BUILT_AGENTS_COLLECTION) {
        void calloutHelpers.openPreBuiltAgentsCollection({
          telemetry: {
            source: "nodeCreator",
            section: activeViewStack.value.title
          },
          resetStacks: false
        });
        return;
      }
      if (item.type === "subcategory") {
        const subcategoryKey = camelCase(item.properties.title);
        const title2 = i18n2.baseText(`nodeCreator.subcategoryNames.${subcategoryKey}`);
        const infoKey = `nodeCreator.subcategoryInfos.${subcategoryKey}`;
        const info2 = i18n2.baseText(infoKey);
        const extendedInfo = info2 !== infoKey ? { info: info2 } : {};
        const nodeIcon2 = item.properties.icon ? { type: "icon", name: item.properties.icon } : void 0;
        pushViewStack({
          subcategory: item.key,
          mode: "nodes",
          title: title2,
          nodeIcon: nodeIcon2,
          ...extendedInfo,
          ...item.properties.panelClass ? { panelClass: item.properties.panelClass } : {},
          rootView: activeViewStack.value.rootView,
          forceIncludeNodes: item.properties.forceIncludeNodes,
          baseFilter: baseSubcategoriesFilter,
          itemsMapper: subcategoriesMapper,
          sections: item.properties.sections
        });
        onSubcategorySelected({
          subcategory: item.key
        });
      }
      if (item.type === "node") {
        let nodeActions = getFilteredActions(item, actions);
        if (shouldShowCommunityNodeDetails(isCommunityPackageName(item.key), activeViewStack.value)) {
          if (!nodeActions.length) {
            nodeActions = getFilteredActions(item, communityNodesAndActions.value.actions);
          }
          const viewStack = prepareCommunityNodeDetailsViewStack(
            item,
            getNodeIconSource(item.properties),
            activeViewStack.value.rootView,
            nodeActions
          );
          pushViewStack(viewStack);
          return;
        }
        const payload = nodeCreateElementToNodeTypeSelectedPayload(item);
        if (nodeActions.length === 1) {
          emit("nodeTypeSelected", [payload]);
          setAddedNodeActionParameters({
            name: nodeActions[0].defaults.name ?? item.properties.displayName,
            key: item.key,
            value: nodeActions[0].values
          });
          return;
        }
        if (nodeActions.length === 0 || activeViewStack.value.hideActions) {
          emit("nodeTypeSelected", [payload]);
          return;
        }
        const transformedActions = nodeActions?.map(
          (a) => transformNodeType(a, item.properties.displayName, "action")
        );
        pushViewStack({
          subcategory: item.properties.displayName,
          title: item.properties.displayName,
          nodeIcon: getNodeIconSource(item.properties),
          rootView: activeViewStack.value.rootView,
          hasSearch: true,
          mode: "actions",
          items: transformedActions
        });
      }
      if (item.type === "view") {
        const views = {
          [TRIGGER_NODE_CREATOR_VIEW]: TriggerView,
          [REGULAR_NODE_CREATOR_VIEW]: RegularView,
          [AI_NODE_CREATOR_VIEW]: AIView,
          [AI_OTHERS_NODE_CREATOR_VIEW]: AINodesView
        };
        const itemKey = item.key;
        const matchedView = views[itemKey];
        if (!matchedView) {
          console.warn(`No view found for ${itemKey}`);
          return;
        }
        const view = matchedView(mergedNodes);
        pushViewStack({
          title: view.title,
          subtitle: view?.subtitle ?? "",
          info: view?.info ?? "",
          items: view.items,
          hasSearch: true,
          rootView: view.value,
          mode: "nodes",
          // Root search should include all nodes
          searchItems: mergedNodes
        });
      }
      if (item.type === "link") {
        window.open(item.properties.url, "_blank");
      }
      if (item.type === "openTemplate") {
        calloutHelpers.openSampleWorkflowTemplate(item.properties.templateId, {
          telemetry: {
            source: "nodeCreator",
            section: activeViewStack.value.title
          }
        });
      }
    }
    function subcategoriesMapper(item) {
      if (item.type !== "node") return item;
      const hasTriggerGroup = item.properties.group.includes("trigger");
      const nodeActions = getFilteredActions(item, actions);
      const hasActions = nodeActions.length > 0;
      if (hasTriggerGroup && hasActions) {
        if (item.properties?.codex) {
          item.properties.codex.alias = [
            ...item.properties.codex?.alias || [],
            item.properties.displayName
          ];
        }
        item.properties.displayName = item.properties.displayName.replace(" Trigger", "");
      }
      return item;
    }
    function baseSubcategoriesFilter(item) {
      if (item.type === "section") return true;
      if (item.type !== "node") return false;
      const hasTriggerGroup = item.properties.group.includes("trigger");
      const nodeActions = getFilteredActions(item, actions);
      const hasActions = nodeActions.length > 0;
      const isTriggerRootView = activeViewStack.value.rootView === TRIGGER_NODE_CREATOR_VIEW;
      if (isTriggerRootView) {
        return hasActions || hasTriggerGroup;
      }
      return hasActions || !hasTriggerGroup;
    }
    const globalCallouts = computed(() => [
      ...getRootSearchCallouts(activeViewStack.value.search ?? "", {
        isRagStarterCalloutVisible: calloutHelpers.isRagStarterCalloutVisible.value
      }),
      ...getActiveViewCallouts(
        activeViewStack.value.title,
        calloutHelpers.isPreBuiltAgentsCalloutVisible.value,
        calloutHelpers.getPreBuiltAgentNodeCreatorItems()
      )
    ]);
    function arrowLeft() {
      popViewStack();
    }
    function onKeySelect(activeItemId) {
      const mergedItems = flattenCreateElements([
        ...globalCallouts.value ?? [],
        ...activeViewStack.value.items ?? [],
        ...globalSearchItemsDiff.value ?? [],
        ...moreFromCommunity.value ?? []
      ]);
      const item = mergedItems.find((i) => i.uuid === activeItemId);
      if (!item) return;
      onSelected(item);
    }
    registerKeyHook("MainViewArrowRight", {
      keyboardKeys: ["ArrowRight", "Enter"],
      condition: (type) => ["subcategory", "node", "link", "view", "openTemplate"].includes(type),
      handler: onKeySelect
    });
    registerKeyHook("MainViewArrowLeft", {
      keyboardKeys: ["ArrowLeft"],
      condition: (type) => ["subcategory", "node", "link", "view", "openTemplate"].includes(type),
      handler: arrowLeft
    });
    return (_ctx, _cache) => {
      return openBlock(), createElementBlock("span", null, [
        createVNode(ItemsRenderer, {
          elements: globalCallouts.value,
          class: normalizeClass(_ctx.$style.items),
          onSelected
        }, null, 8, ["elements", "class"]),
        withMemo([activeViewStack.value.search], () => createVNode(ItemsRenderer, {
          elements: activeViewStack.value.items,
          class: normalizeClass(_ctx.$style.items),
          onSelected
        }, createSlots({ _: 2 }, [
          isSearchResultEmpty.value ? {
            name: "empty",
            fn: withCtx(() => [
              createVNode(NoResults, {
                "root-view": activeViewStack.value.rootView,
                "show-icon": "",
                "show-request": "",
                onAddWebhookNode: _cache[0] || (_cache[0] = ($event) => emit("nodeTypeSelected", [{ type: unref(WEBHOOK_NODE_TYPE) }])),
                onAddHttpNode: _cache[1] || (_cache[1] = ($event) => emit("nodeTypeSelected", [{ type: unref(HTTP_REQUEST_NODE_TYPE) }]))
              }, null, 8, ["root-view"])
            ]),
            key: "0"
          } : void 0
        ]), 1032, ["elements", "class"]), _cache, 2),
        globalSearchItemsDiff.value.length > 0 ? (openBlock(), createBlock(CategorizedItemsRenderer, {
          key: 0,
          elements: globalSearchItemsDiff.value,
          category: unref(i18n2).baseText("nodeCreator.categoryNames.otherCategories"),
          expanded: true,
          onSelected
        }, null, 8, ["elements", "category"])) : createCommentVNode("", true),
        moreFromCommunity.value.length > 0 ? (openBlock(), createBlock(CategorizedItemsRenderer, {
          key: 1,
          elements: moreFromCommunity.value,
          category: unref(i18n2).baseText("nodeCreator.categoryNames.moreFromCommunity"),
          expanded: true,
          onSelected
        }, null, 8, ["elements", "category"])) : createCommentVNode("", true)
      ]);
    };
  }
});
const items = "_items_1i9xd_123";
const style0$4 = {
  items
};
const cssModules$4 = {
  "$style": style0$4
};
const NodesRenderer = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__cssModules", cssModules$4]]);
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
  __name: "CommunityNodeDetails",
  setup(__props) {
    const {
      activeViewStack,
      pushViewStack,
      popViewStack,
      getAllNodeCreateElements,
      updateCurrentViewStack
    } = useViewStacks();
    const { communityNodeDetails } = activeViewStack;
    const loading = ref(false);
    const communityNodesStore = useCommunityNodesStore();
    const nodeCreatorStore = useNodeCreatorStore();
    const toast = useToast();
    const isOwner = computed(() => useUsersStore().isInstanceOwner);
    const updateViewStack = (key) => {
      const installedNodeKey = removePreviewToken(key);
      const installedNode = getAllNodeCreateElements().find((node) => node.key === installedNodeKey);
      if (installedNode) {
        const nodeActions = nodeCreatorStore.actions?.[installedNode.key] || [];
        popViewStack();
        updateCurrentViewStack({ searchItems: nodeCreatorStore.mergedNodes });
        const viewStack = prepareCommunityNodeDetailsViewStack(
          installedNode,
          getNodeIconSource(installedNode.properties),
          activeViewStack.rootView,
          nodeActions
        );
        pushViewStack(viewStack, {
          transitionDirection: "none"
        });
      } else {
        const viewStack = { ...activeViewStack };
        viewStack.communityNodeDetails.installed = true;
        pushViewStack(activeViewStack, { resetStacks: true });
      }
    };
    const updateStoresAndViewStack = async (key) => {
      await useNodeTypesStore().getNodeTypes();
      await useCredentialsStore().fetchCredentialTypes(true);
      updateViewStack(key);
      nodeCreatorStore.removeNodeFromMergedNodes(key);
    };
    const getNpmVersion = async (key) => {
      const communityNodeAttributes = await useNodeTypesStore().getCommunityNodeAttributes(key);
      if (communityNodeAttributes) {
        return communityNodeAttributes.npmVersion;
      }
      return void 0;
    };
    const onInstall = async () => {
      if (isOwner.value && activeViewStack.communityNodeDetails && !communityNodeDetails?.installed) {
        const { key, packageName } = activeViewStack.communityNodeDetails;
        try {
          loading.value = true;
          await communityNodesStore.installPackage(packageName, true, await getNpmVersion(key));
          await updateStoresAndViewStack(key);
          toast.showMessage({
            title: i18n.baseText("settings.communityNodes.messages.install.success"),
            type: "success"
          });
        } catch (error) {
          toast.showError(error, i18n.baseText("settings.communityNodes.messages.install.error"));
        } finally {
          loading.value = false;
        }
      }
    };
    return (_ctx, _cache) => {
      const _component_NodeIcon = NodeIcon;
      const _component_N8nTooltip = Tooltip;
      const _component_N8nIcon = N8nIcon;
      const _component_N8nButton = N8nButton;
      return unref(communityNodeDetails) ? (openBlock(), createElementBlock("div", {
        key: 0,
        class: normalizeClass(_ctx.$style.container)
      }, [
        createBaseVNode("div", {
          class: normalizeClass(_ctx.$style.header)
        }, [
          createBaseVNode("div", {
            class: normalizeClass(_ctx.$style.title)
          }, [
            unref(communityNodeDetails).nodeIcon ? (openBlock(), createBlock(_component_NodeIcon, {
              key: 0,
              class: normalizeClass(_ctx.$style.nodeIcon),
              "icon-source": unref(communityNodeDetails).nodeIcon,
              circle: false,
              "show-tooltip": false
            }, null, 8, ["class", "icon-source"])) : createCommentVNode("", true),
            createBaseVNode("span", null, toDisplayString(unref(communityNodeDetails).title), 1),
            unref(communityNodeDetails).official ? (openBlock(), createBlock(_component_N8nTooltip, {
              key: 1,
              placement: "bottom",
              "show-after": 500
            }, {
              content: withCtx(() => [
                createTextVNode(toDisplayString(unref(i18n).baseText("generic.officialNode.tooltip", {
                  interpolate: {
                    author: unref(communityNodeDetails).companyName ?? unref(communityNodeDetails).title
                  }
                })), 1)
              ]),
              default: withCtx(() => [
                createVNode(unref(OfficialIcon), {
                  class: normalizeClass(_ctx.$style.officialIcon)
                }, null, 8, ["class"])
              ]),
              _: 1
            })) : createCommentVNode("", true)
          ], 2),
          createBaseVNode("div", null, [
            unref(communityNodeDetails).installed ? (openBlock(), createElementBlock("div", {
              key: 0,
              class: normalizeClass(_ctx.$style.installed)
            }, [
              !unref(communityNodeDetails).official ? (openBlock(), createBlock(_component_N8nIcon, {
                key: 0,
                class: normalizeClass(_ctx.$style.installedIcon),
                icon: "box"
              }, null, 8, ["class"])) : createCommentVNode("", true),
              createVNode(unref(N8nText), {
                color: "text-light",
                size: "small",
                bold: ""
              }, {
                default: withCtx(() => [
                  createTextVNode(toDisplayString(unref(i18n).baseText("communityNodeDetails.installed")), 1)
                ]),
                _: 1
              })
            ], 2)) : createCommentVNode("", true),
            isOwner.value && !unref(communityNodeDetails).installed ? (openBlock(), createBlock(_component_N8nButton, {
              key: 1,
              loading: loading.value,
              disabled: loading.value,
              label: unref(i18n).baseText("communityNodeDetails.install"),
              size: "small",
              "data-test-id": "install-community-node-button",
              onClick: onInstall
            }, null, 8, ["loading", "disabled", "label"])) : createCommentVNode("", true)
          ])
        ], 2)
      ], 2)) : createCommentVNode("", true);
    };
  }
});
const container$1 = "_container_1ut3v_123";
const header$1 = "_header_1ut3v_131";
const title$1 = "_title_1ut3v_138";
const nodeIcon$1 = "_nodeIcon_1ut3v_146";
const installedIcon = "_installedIcon_1ut3v_151";
const officialIcon = "_officialIcon_1ut3v_157";
const installed = "_installed_1ut3v_151";
const style0$3 = {
  container: container$1,
  header: header$1,
  title: title$1,
  nodeIcon: nodeIcon$1,
  installedIcon,
  officialIcon,
  installed
};
const cssModules$3 = {
  "$style": style0$3
};
const CommunityNodeDetails = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$3]]);
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
  __name: "CommunityNodeDocsLink",
  props: {
    packageName: {}
  },
  setup(__props) {
    const props = __props;
    const openCommunityNodeDocsPage = () => {
      const newTab = window.open(`https://www.npmjs.com/package/${props.packageName}`, "_blank");
      if (newTab) newTab.opener = null;
    };
    return (_ctx, _cache) => {
      const _component_N8nIcon = N8nIcon;
      return openBlock(), createBlock(unref(N8nLink), {
        theme: "text",
        class: normalizeClass(_ctx.$style.container),
        title: unref(i18n).baseText("communityNodesDocsLink.link.title"),
        onClick: openCommunityNodeDocsPage
      }, {
        default: withCtx(() => [
          createVNode(unref(N8nText), {
            size: "small",
            bold: "",
            style: { "margin-right": "5px" }
          }, {
            default: withCtx(() => [
              createTextVNode(toDisplayString(unref(i18n).baseText("communityNodesDocsLink.title")), 1)
            ]),
            _: 1
          }),
          createVNode(_component_N8nIcon, { icon: "external-link" })
        ]),
        _: 1
      }, 8, ["class", "title"]);
    };
  }
});
const container = "_container_x2no6_123";
const style0$2 = {
  container
};
const cssModules$2 = {
  "$style": style0$2
};
const CommunityNodeDocsLink = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__cssModules", cssModules$2]]);
const _hoisted_1 = ["textContent"];
const _hoisted_2 = ["textContent"];
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
  __name: "NodesListPanel",
  setup(__props) {
    const i18n2 = useI18n();
    const { callDebounced } = useDebounce();
    const { mergedNodes } = useNodeCreatorStore();
    const { pushViewStack, popViewStack, updateCurrentViewStack } = useViewStacks();
    const { setActiveItemIndex, attachKeydownEvent, detachKeydownEvent } = useKeyboardNavigation();
    const nodeCreatorStore = useNodeCreatorStore();
    const { isInstanceOwner } = useUsersStore();
    const activeViewStack = computed(() => useViewStacks().activeViewStack);
    const communityNodeDetails = computed(() => activeViewStack.value.communityNodeDetails);
    const viewStacks = computed(() => useViewStacks().viewStacks);
    const isActionsMode = computed(() => useViewStacks().activeViewStackMode === "actions");
    const searchPlaceholder = computed(() => {
      let node = activeViewStack.value?.title;
      if (communityNodeDetails.value) {
        node = communityNodeDetails.value.title;
      }
      if (isActionsMode.value) {
        return i18n2.baseText("nodeCreator.actionsCategory.searchActions", {
          interpolate: { node }
        });
      }
      return i18n2.baseText("nodeCreator.searchBar.searchNodes");
    });
    const showSearchBar = computed(() => {
      if (activeViewStack.value.communityNodeDetails) return false;
      return activeViewStack.value.hasSearch;
    });
    const nodeCreatorView = computed(() => useNodeCreatorStore().selectedView);
    const isCommunityNodeActionsMode = computed(() => {
      return communityNodeDetails.value && isActionsMode.value && activeViewStack.value.subcategory;
    });
    function getDefaultActiveIndex(search = "") {
      if (activeViewStack.value.mode === "actions") {
        return 1;
      } else if (activeViewStack.value.sections) {
        return search ? 0 : 1;
      }
      return 0;
    }
    function onSearch(value) {
      if (activeViewStack.value.uuid) {
        updateCurrentViewStack({ search: value });
        void setActiveItemIndex(getDefaultActiveIndex(value));
        if (value.length) {
          callDebounced(
            nodeCreatorStore.onNodeFilterChanged,
            { trailing: true, debounceTime: 2e3 },
            {
              newValue: value,
              filteredNodes: activeViewStack.value.items ?? [],
              filterMode: activeViewStack.value.rootView ?? "Regular",
              subcategory: activeViewStack.value.subcategory,
              title: activeViewStack.value.title
            }
          );
        }
      }
    }
    function onTransitionEnd() {
      void setActiveItemIndex(getDefaultActiveIndex());
    }
    onMounted(() => {
      attachKeydownEvent();
      void setActiveItemIndex(getDefaultActiveIndex());
    });
    onUnmounted(() => {
      detachKeydownEvent();
    });
    watch(
      () => nodeCreatorView.value,
      (selectedView) => {
        const views = {
          [TRIGGER_NODE_CREATOR_VIEW]: TriggerView,
          [REGULAR_NODE_CREATOR_VIEW]: RegularView,
          [AI_NODE_CREATOR_VIEW]: AIView,
          [AI_OTHERS_NODE_CREATOR_VIEW]: AINodesView,
          [AI_UNCATEGORIZED_CATEGORY]: AINodesView,
          [AI_EVALUATION]: AINodesView
        };
        const itemKey = selectedView;
        const matchedView = views[itemKey];
        if (!matchedView) {
          console.warn(`No view found for ${itemKey}`);
          return;
        }
        const view = matchedView(mergedNodes);
        pushViewStack({
          title: view.title,
          subtitle: view?.subtitle ?? "",
          items: view.items,
          info: view.info,
          hasSearch: true,
          mode: "nodes",
          rootView: selectedView,
          // Root search should include all nodes
          searchItems: mergedNodes
        });
      },
      { immediate: true }
    );
    function onBackButton() {
      popViewStack();
    }
    return (_ctx, _cache) => {
      const _component_n8n_icon = N8nIcon;
      const _component_n8n_notice = N8nNotice;
      return viewStacks.value.length > 0 ? (openBlock(), createBlock(Transition, {
        key: 0,
        name: `panel-slide-${activeViewStack.value.transitionDirection}`,
        onAfterLeave: onTransitionEnd
      }, {
        default: withCtx(() => [
          (openBlock(), createElementBlock("aside", {
            key: `${activeViewStack.value.uuid}`,
            class: normalizeClass([_ctx.$style.nodesListPanel, activeViewStack.value.panelClass]),
            onKeydownCapture: _cache[0] || (_cache[0] = withModifiers(() => {
            }, ["stop"]))
          }, [
            createBaseVNode("header", {
              class: normalizeClass({
                [_ctx.$style.header]: true,
                [_ctx.$style.hasBg]: !activeViewStack.value.subtitle,
                "nodes-list-panel-header": true
              }),
              "data-test-id": "nodes-list-header"
            }, [
              createBaseVNode("div", {
                class: normalizeClass(_ctx.$style.top)
              }, [
                viewStacks.value.length > 1 && !activeViewStack.value.preventBack ? (openBlock(), createElementBlock("button", {
                  key: 0,
                  class: normalizeClass(_ctx.$style.backButton),
                  onClick: onBackButton
                }, [
                  createVNode(_component_n8n_icon, {
                    class: normalizeClass(_ctx.$style.backButtonIcon),
                    icon: "arrow-left",
                    size: 22
                  }, null, 8, ["class"])
                ], 2)) : createCommentVNode("", true),
                activeViewStack.value.nodeIcon ? (openBlock(), createBlock(NodeIcon, {
                  key: 1,
                  class: normalizeClass(_ctx.$style.nodeIcon),
                  "icon-source": activeViewStack.value.nodeIcon,
                  circle: false,
                  "show-tooltip": false,
                  size: 20,
                  "use-updated-icons": true
                }, null, 8, ["class", "icon-source"])) : createCommentVNode("", true),
                activeViewStack.value.title ? (openBlock(), createElementBlock("p", {
                  key: 2,
                  class: normalizeClass(_ctx.$style.title),
                  textContent: toDisplayString(activeViewStack.value.title)
                }, null, 10, _hoisted_1)) : createCommentVNode("", true),
                communityNodeDetails.value ? (openBlock(), createBlock(CommunityNodeDocsLink, {
                  key: 3,
                  "package-name": communityNodeDetails.value.packageName
                }, null, 8, ["package-name"])) : createCommentVNode("", true)
              ], 2),
              activeViewStack.value.subtitle ? (openBlock(), createElementBlock("p", {
                key: 0,
                class: normalizeClass({ [_ctx.$style.subtitle]: true, [_ctx.$style.offsetSubtitle]: viewStacks.value.length > 1 }),
                textContent: toDisplayString(activeViewStack.value.subtitle)
              }, null, 10, _hoisted_2)) : createCommentVNode("", true)
            ], 2),
            showSearchBar.value ? (openBlock(), createBlock(SearchBar, {
              key: 0,
              class: normalizeClass(_ctx.$style.searchBar),
              placeholder: searchPlaceholder.value ? searchPlaceholder.value : unref(i18n2).baseText("nodeCreator.searchBar.searchNodes"),
              "model-value": activeViewStack.value.search,
              "onUpdate:modelValue": onSearch
            }, null, 8, ["class", "placeholder", "model-value"])) : createCommentVNode("", true),
            communityNodeDetails.value ? (openBlock(), createBlock(CommunityNodeDetails, { key: 1 })) : createCommentVNode("", true),
            communityNodeDetails.value && !isActionsMode.value ? (openBlock(), createBlock(CommunityNodeInfo, { key: 2 })) : createCommentVNode("", true),
            createBaseVNode("div", {
              class: normalizeClass(_ctx.$style.renderedItems)
            }, [
              activeViewStack.value.info && !activeViewStack.value.search ? (openBlock(), createBlock(_component_n8n_notice, {
                key: 0,
                class: normalizeClass(_ctx.$style.info),
                content: activeViewStack.value.info,
                theme: "warning"
              }, null, 8, ["class", "content"])) : createCommentVNode("", true),
              isActionsMode.value && activeViewStack.value.subcategory ? (openBlock(), createBlock(ActionsRenderer, normalizeProps(mergeProps({ key: 1 }, _ctx.$attrs)), null, 16)) : (openBlock(), createBlock(NodesRenderer, mergeProps({
                key: 2,
                "root-view": nodeCreatorView.value
              }, _ctx.$attrs), null, 16, ["root-view"]))
            ], 2),
            communityNodeDetails.value && !isCommunityNodeActionsMode.value ? (openBlock(), createBlock(CommunityNodeFooter, {
              key: 3,
              "package-name": communityNodeDetails.value.packageName,
              "show-manage": communityNodeDetails.value.installed && unref(isInstanceOwner)
            }, null, 8, ["package-name", "show-manage"])) : createCommentVNode("", true)
          ], 34))
        ]),
        _: 1
      }, 8, ["name"])) : createCommentVNode("", true);
    };
  }
});
const info = "_info_cdy1m_145";
const backButton = "_backButton_cdy1m_149";
const backButtonIcon = "_backButtonIcon_cdy1m_156";
const nodeIcon = "_nodeIcon_cdy1m_161";
const renderedItems = "_renderedItems_cdy1m_166";
const searchBar = "_searchBar_cdy1m_178";
const nodesListPanel = "_nodesListPanel_cdy1m_182";
const footer = "_footer_cdy1m_200";
const top = "_top_cdy1m_211";
const header = "_header_cdy1m_216";
const hasBg = "_hasBg_cdy1m_222";
const title = "_title_cdy1m_227";
const subtitle = "_subtitle_cdy1m_238";
const offsetSubtitle = "_offsetSubtitle_cdy1m_246";
const style0$1 = {
  info,
  backButton,
  backButtonIcon,
  nodeIcon,
  renderedItems,
  searchBar,
  nodesListPanel,
  footer,
  top,
  header,
  hasBg,
  title,
  subtitle,
  offsetSubtitle
};
const cssModules$1 = {
  "$style": style0$1
};
const NodesListPanel = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
const _sfc_main = /* @__PURE__ */ defineComponent({
  __name: "NodeCreator",
  props: {
    active: { type: Boolean },
    onNodeTypeSelected: { type: Function }
  },
  emits: ["closeNodeCreator", "nodeTypeSelected"],
  setup(__props, { emit: __emit }) {
    const props = __props;
    const { resetViewStacks } = useViewStacks();
    const { registerKeyHook } = useKeyboardNavigation();
    const emit = __emit;
    const uiStore = useUIStore();
    const assistantStore = useAssistantStore();
    const builderStore = useBuilderStore();
    const { setShowScrim, setActions, setMergeNodes } = useNodeCreatorStore();
    const { generateMergedNodesAndActions } = useActionsGenerator();
    const state = reactive({
      nodeCreator: null,
      mousedownInsideEvent: null
    });
    const showScrim = computed(() => useNodeCreatorStore().showScrim);
    const viewStacksLength = computed(() => useViewStacks().viewStacks.length);
    const nodeCreatorInlineStyle = computed(() => {
      const rightPosition = getRightOffset();
      return { top: `${uiStore.bannersHeight + uiStore.headerHeight}px`, right: `${rightPosition}px` };
    });
    function getRightOffset() {
      if (assistantStore.isAssistantOpen) {
        return assistantStore.chatWidth;
      }
      if (builderStore.isAssistantOpen) {
        return builderStore.chatWidth;
      }
      return 0;
    }
    function onMouseUpOutside() {
      if (state.mousedownInsideEvent) {
        const clickEvent = new MouseEvent("click", {
          bubbles: true,
          cancelable: true
        });
        state.mousedownInsideEvent.target?.dispatchEvent(clickEvent);
        state.mousedownInsideEvent = null;
        unBindOnMouseUpOutside();
      }
    }
    function unBindOnMouseUpOutside() {
      document.removeEventListener("mouseup", onMouseUpOutside);
      document.removeEventListener("touchstart", onMouseUpOutside);
    }
    function onMouseUp() {
      state.mousedownInsideEvent = null;
      unBindOnMouseUpOutside();
    }
    function onMouseDown(event) {
      state.mousedownInsideEvent = event;
      document.addEventListener("mouseup", onMouseUpOutside);
      document.addEventListener("touchstart", onMouseUpOutside);
    }
    function onDragOver(event) {
      event.preventDefault();
    }
    function onDrop(event) {
      if (!event.dataTransfer) {
        return;
      }
      const dragData = event.dataTransfer.getData(DRAG_EVENT_DATA_KEY);
      const nodeCreatorBoundingRect = state.nodeCreator.getBoundingClientRect();
      if (dragData && event.pageX >= nodeCreatorBoundingRect.x && event.pageY >= nodeCreatorBoundingRect.y) {
        event.stopPropagation();
      }
    }
    watch(
      () => props.active,
      (isActive) => {
        if (!isActive) {
          setShowScrim(false);
          resetViewStacks();
        }
      }
    );
    watch(viewStacksLength, (value) => {
      if (value === 0) {
        emit("closeNodeCreator");
        setShowScrim(false);
      }
    });
    registerKeyHook("NodeCreatorCloseEscape", {
      keyboardKeys: ["Escape"],
      handler: () => emit("closeNodeCreator")
    });
    registerKeyHook("NodeCreatorCloseTab", {
      keyboardKeys: ["Tab"],
      handler: () => emit("closeNodeCreator")
    });
    watch(
      () => ({
        httpOnlyCredentials: useCredentialsStore().httpOnlyCredentialTypes,
        nodeTypes: useNodeTypesStore().visibleNodeTypes
      }),
      ({ nodeTypes, httpOnlyCredentials }) => {
        const { actions, mergedNodes } = generateMergedNodesAndActions(nodeTypes, httpOnlyCredentials);
        setActions(actions);
        setMergeNodes(mergedNodes);
      },
      { immediate: true }
    );
    const { nodeCreator: nodeCreator2 } = toRefs(state);
    onBeforeUnmount(() => {
      unBindOnMouseUpOutside();
    });
    onClickOutside(nodeCreator2, () => emit("closeNodeCreator"));
    return (_ctx, _cache) => {
      return openBlock(), createElementBlock("div", null, [
        createBaseVNode("aside", {
          class: normalizeClass({
            [_ctx.$style.nodeCreatorScrim]: true,
            [_ctx.$style.active]: showScrim.value
          })
        }, null, 2),
        _ctx.active ? (openBlock(), createBlock(_sfc_main$c, {
          key: 0,
          class: normalizeClass(_ctx.$style.close),
          type: "secondary",
          icon: "x",
          "aria-label": "Close Node Creator",
          onClick: _cache[0] || (_cache[0] = ($event) => emit("closeNodeCreator"))
        }, null, 8, ["class"])) : createCommentVNode("", true),
        createVNode(SlideTransition, null, {
          default: withCtx(() => [
            _ctx.active ? (openBlock(), createElementBlock("div", {
              key: 0,
              ref_key: "nodeCreator",
              ref: nodeCreator2,
              class: normalizeClass({ [_ctx.$style.nodeCreator]: true }),
              style: normalizeStyle(nodeCreatorInlineStyle.value),
              "data-test-id": "node-creator",
              onDragover: onDragOver,
              onDrop,
              onMousedown: onMouseDown,
              onMouseup: onMouseUp
            }, [
              createVNode(NodesListPanel, { onNodeTypeSelected: _ctx.onNodeTypeSelected }, null, 8, ["onNodeTypeSelected"])
            ], 38)) : createCommentVNode("", true)
          ]),
          _: 1
        })
      ]);
    };
  }
});
const nodeCreator = "_nodeCreator_xjjfv_127";
const nodeCreatorScrim = "_nodeCreatorScrim_xjjfv_139";
const active = "_active_xjjfv_151";
const close = "_close_xjjfv_155";
const style0 = {
  nodeCreator,
  nodeCreatorScrim,
  active,
  close
};
const cssModules = {
  "$style": style0
};
const NodeCreator = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
export {
  NodeCreator as default
};