diff --git a/src/common/catalog/catalog-category-registry.ts b/src/common/catalog/catalog-category-registry.ts
deleted file mode 100644
index d456f38f06..0000000000
--- a/src/common/catalog/catalog-category-registry.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Copyright (c) OpenLens Authors. All rights reserved.
- * Licensed under MIT License. See LICENSE in root directory for more information.
- */
-
-import { asLegacyGlobalForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
-import catalogCategoryRegistryInjectable from "./category-registry.injectable";
-
-/**
- * @deprecated use `di.inject(catalogCategoryRegistryInjectable)` instead
- */
-export const catalogCategoryRegistry = asLegacyGlobalForExtensionApi(catalogCategoryRegistryInjectable);
diff --git a/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts b/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts
new file mode 100644
index 0000000000..9524c84e26
--- /dev/null
+++ b/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+import { getInjectable } from "@ogre-tools/injectable";
+import catalogCategoryRegistryInjectable from "../../../common/catalog/category-registry.injectable";
+import getClusterByIdInjectable from "../../../common/cluster-store/get-by-id.injectable";
+import readFileInjectable from "../../../common/fs/read-file.injectable";
+import { loadConfigFromString } from "../../../common/kube-helpers";
+import loggerInjectable from "../../../common/logger.injectable";
+import openDeleteClusterDialogInjectable from "../../components/delete-cluster-dialog/open.injectable";
+import { beforeFrameStartsInjectionToken } from "../tokens";
+
+const setupKubernetesClusterContextMenuOpenInjectable = getInjectable({
+ id: "setup-kubernetes-cluster-context-menu-open",
+ instantiate: (di) => {
+ const catalogCategoryRegistry = di.inject(catalogCategoryRegistryInjectable);
+ const openDeleteClusterDialog = di.inject(openDeleteClusterDialogInjectable);
+ const readFile = di.inject(readFileInjectable);
+ const getClusterById = di.inject(getClusterByIdInjectable);
+ const logger = di.inject(loggerInjectable);
+
+ return {
+ id: "setup-kubernetes-cluster-context-menu-open",
+ run: () => {
+ catalogCategoryRegistry
+ .getForGroupKind("entity.k8slens.dev", "KubernetesCluster")
+ ?.on("contextMenuOpen", (entity, context) => {
+ if (entity.metadata?.source == "local") {
+ context.menuItems.push({
+ title: "Remove",
+ icon: "delete",
+ onClick: async () => {
+ const clusterId = entity.getId();
+ const cluster = getClusterById(entity.getId());
+
+ if (!cluster) {
+ return logger.warn("[KUBERNETES-CLUSTER]: cannot delete cluster, does not exist in store", { clusterId });
+ }
+
+ const result = loadConfigFromString(await readFile(cluster.kubeConfigPath));
+
+ if (result.error) {
+ logger.error("[KUBERNETES-CLUSTER]: failed to parse kubeconfig file", result.error);
+ } else {
+ openDeleteClusterDialog({ cluster, config: result.config });
+ }
+ },
+ });
+ }
+ });
+ },
+ };
+ },
+ injectionToken: beforeFrameStartsInjectionToken,
+});
+
+export default setupKubernetesClusterContextMenuOpenInjectable;
diff --git a/src/renderer/before-frame-starts/runnables/setup-weblink-context-menu-open.injectable.tsx b/src/renderer/before-frame-starts/runnables/setup-weblink-context-menu-open.injectable.tsx
new file mode 100644
index 0000000000..5d7e0f5f12
--- /dev/null
+++ b/src/renderer/before-frame-starts/runnables/setup-weblink-context-menu-open.injectable.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+import { getInjectable } from "@ogre-tools/injectable";
+import React from "react";
+import catalogCategoryRegistryInjectable from "../../../common/catalog/category-registry.injectable";
+import { WeblinkAddCommand } from "../../components/catalog-entities/weblink-add-command";
+import commandOverlayInjectable from "../../components/command-palette/command-overlay.injectable";
+import { beforeFrameStartsInjectionToken } from "../tokens";
+
+const setupWeblickContextMenuOpenInjectable = getInjectable({
+ id: "setup-weblick-context-menu-open",
+ instantiate: (di) => {
+ const catalogCategoryRegistry = di.inject(catalogCategoryRegistryInjectable);
+ const commandOverlay = di.inject(commandOverlayInjectable);
+
+ return {
+ id: "setup-weblick-context-menu-open",
+ run: () => {
+ catalogCategoryRegistry
+ .getForGroupKind("entity.k8slens.dev", "WebLink")
+ ?.on("catalogAddMenu", ctx => {
+ ctx.menuItems.push({
+ title: "Add web link",
+ icon: "public",
+ onClick: () => commandOverlay.open(),
+ });
+ });
+ },
+ };
+ },
+ injectionToken: beforeFrameStartsInjectionToken,
+});
+
+export default setupWeblickContextMenuOpenInjectable;
diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx
index 7962a37e1c..a86143385c 100644
--- a/src/renderer/bootstrap.tsx
+++ b/src/renderer/bootstrap.tsx
@@ -24,12 +24,10 @@ import extensionInstallationStateStoreInjectable from "../extensions/extension-i
import clusterStoreInjectable from "../common/cluster-store/cluster-store.injectable";
import initRootFrameInjectable from "./frames/root-frame/init-root-frame/init-root-frame.injectable";
import initClusterFrameInjectable from "./frames/cluster-frame/init-cluster-frame/init-cluster-frame.injectable";
-import commandOverlayInjectable from "./components/command-palette/command-overlay.injectable";
import { Router } from "react-router";
import historyInjectable from "./navigation/history.injectable";
import themeStoreInjectable from "./themes/store.injectable";
import hotbarStoreInjectable from "../common/hotbars/store.injectable";
-import openDeleteClusterDialogInjectable from "./components/delete-cluster-dialog/open.injectable";
import assert from "assert";
import startFrameInjectable from "./start-frame/start-frame.injectable";
import loggerInjectable from "../common/logger.injectable";
@@ -45,12 +43,6 @@ export async function bootstrap(di: DiContainer) {
assert(rootElem, "#app MUST exist");
- logger.info(`${logPrefix} initializing Catalog`);
- initializers.initCatalog({
- openCommandDialog: di.inject(commandOverlayInjectable).open,
- openDeleteClusterDialog: di.inject(openDeleteClusterDialogInjectable),
- });
-
const extensionLoader = di.inject(extensionLoaderInjectable);
logger.info(`${logPrefix} initializing IpcRendererListeners`);
diff --git a/src/renderer/initializers/catalog.tsx b/src/renderer/initializers/catalog.tsx
deleted file mode 100644
index 908c65a976..0000000000
--- a/src/renderer/initializers/catalog.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) OpenLens Authors. All rights reserved.
- * Licensed under MIT License. See LICENSE in root directory for more information.
- */
-
-import React from "react";
-import fs from "fs";
-import "../../common/catalog-entities/kubernetes-cluster";
-import { catalogCategoryRegistry } from "../api/catalog-category-registry";
-import { WeblinkAddCommand } from "../components/catalog-entities/weblink-add-command";
-import { loadConfigFromString } from "../../common/kube-helpers";
-import type { OpenDeleteClusterDialog } from "../components/delete-cluster-dialog/open.injectable";
-import { asLegacyGlobalFunctionForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api";
-import getClusterByIdInjectable from "../../common/cluster-store/get-by-id.injectable";
-
-const getClusterById = asLegacyGlobalFunctionForExtensionApi(getClusterByIdInjectable);
-
-async function onClusterDelete(clusterId: string, openDeleteClusterDialog: OpenDeleteClusterDialog) {
- const cluster = getClusterById(clusterId);
-
- if (!cluster) {
- return console.warn("[KUBERNETES-CLUSTER]: cannot delete cluster, does not exist in store", { clusterId });
- }
-
- const result = loadConfigFromString(await fs.promises.readFile(cluster.kubeConfigPath, "utf-8"));
-
- if (result.error) {
- throw result.error;
- }
-
- openDeleteClusterDialog({ cluster, config: result.config });
-}
-
-interface Dependencies {
- openCommandDialog: (component: React.ReactElement) => void;
- openDeleteClusterDialog: OpenDeleteClusterDialog;
-}
-
-export function initCatalog({ openCommandDialog, openDeleteClusterDialog }: Dependencies) {
- catalogCategoryRegistry
- .getForGroupKind("entity.k8slens.dev", "WebLink")
- ?.on("catalogAddMenu", ctx => {
- ctx.menuItems.push({
- title: "Add web link",
- icon: "public",
- onClick: () => openCommandDialog(),
- });
- });
-
- catalogCategoryRegistry
- .getForGroupKind("entity.k8slens.dev", "KubernetesCluster")
- ?.on("contextMenuOpen", (entity, context) => {
- if (entity.metadata?.source == "local") {
- context.menuItems.push({
- title: "Remove",
- icon: "delete",
- onClick: () => onClusterDelete(entity.getId(), openDeleteClusterDialog),
- });
- }
- });
-}
diff --git a/src/renderer/initializers/index.ts b/src/renderer/initializers/index.ts
index e7b846550c..62bba2e24f 100644
--- a/src/renderer/initializers/index.ts
+++ b/src/renderer/initializers/index.ts
@@ -3,5 +3,4 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
-export * from "./catalog";
export * from "./ipc";