Cleanup: ClusterProvider.connect() returns a K8sClient

Goal

ClusterProvider.connect() returns raw kubeconfig data (dict | None); callers build a K8sClient from it. Change it to return a K8sClient (or subclass) directly, so a provider needing custom client behavior (e.g. token refresh) can subclass K8sClient and override its methods, instead of the base classes growing new parameters/hooks per use case.

Current state

Change

backend/services/cluster_providers/__init__.py - connect(self, provider_config: dict, namespace: str) -> "K8sClient" (signature + return type change). - test_connection() default body: client = self.connect(provider_config, "default").

backend/services/cluster_providers/same_as_backend.py

def connect(self, provider_config, namespace):
    return K8sClient(namespace=namespace, kubeconfig=None)

backend/services/cluster_providers/kubeconfig.py

def connect(self, provider_config, namespace):
    return K8sClient(namespace=namespace, kubeconfig=provider_config["kubeconfig"])

test_connection() unchanged.

backend/services/k8s_client.py - K8sClientRegistry.get() body: self._clients[cluster.id] = provider.connect(cluster.provider_config, cluster.namespace). - K8sClient class: unchanged.

backend/services/cluster_providers/minikube.py: no change (inherits KubeconfigClusterProvider).

Verification