Repository: stateful/vscode-runme
Pull request #1464 (2024-07-03 22:21:06)

Add initial GKE Nodes Tab
# Tasks
- [x] Show node pools
- [x] Node Pool Name CTA to GCloud console
- [x] Show Nodes
- [x] Node Name CTA to GCloud console

sonarcloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [15.8% Coverage on New Code](https://sonarcloud.io/component_measures?id=stateful_vscode-runme&pullRequest=1464&metric=new_coverage&view=list) (required ≥ 45%)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464)


sonarcloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [13.5% Coverage on New Code](https://sonarcloud.io/component_measures?id=stateful_vscode-runme&pullRequest=1464&metric=new_coverage&view=list) (required ≥ 45%)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464)


sonarcloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [20.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=stateful_vscode-runme&pullRequest=1464&metric=new_coverage&view=list) (required ≥ 45%)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464)


sonarcloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [20.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=stateful_vscode-runme&pullRequest=1464&metric=new_coverage&view=list) (required ≥ 45%)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464)


sourishkrout: @pastuxso I'm getting a large stack trace and no rendered output. Not sure what I'm doing wrong. Ideas?

```
Uncaught TypeError TypeError: Cannot destructure property 'clusterBasics' of 'this._clusterDetails' as it is undefined.
    at renderClusterBasics (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/src/client/components/gcp/gke/cluster.ts:101:13)
    at renderCluster (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/src/client/components/gcp/gke/cluster.ts:526:22)
    at render (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/src/client/components/gcp/gke/cluster.ts:559:19)
    at update (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-element/development/lit-element.js:117:1)
    at performUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:854:1)
    at scheduleUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:765:1)
    at __enqueueUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:738:1)
    --- await ---
    at requestUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:701:1)
    at __initialize (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:495:1)
    at ReactiveElement (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:481:1)
    at LitElement (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-element/development/lit-element.js:86:1)
    at Clusters (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/out/client.js:8033:9)
    at _clone (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-html/development/lit-html.js:692:1)
    at _commitTemplateResult (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-html/development/lit-html.js:997:1)
    at _$setValue (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-html/development/lit-html.js:853:1)
    at render (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-html/development/lit-html.js:1459:1)
    at update (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-element/development/lit-element.js:122:34)
    at performUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:854:1)
    at scheduleUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:765:1)
    at __enqueueUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:738:1)
    --- await ---
    at requestUpdate (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:701:1)
    at __initialize (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:495:1)
    at ReactiveElement (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/@lit/reactive-element/development/reactive-element.js:481:1)
    at LitElement (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/node_modules/lit-element/development/lit-element.js:86:1)
    at GCPViews (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/src/client/components/gcp/index.ts:15:8)
    at renderOutputItem (/Users/sourishkrout/Projects/stateful/oss/vscode-runme/src/client/index.ts:141:39)
    at renderOutputItem (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:24303)
    --- await ---
    at h (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:28884)
    at render (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:28448)
    at render (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:39555)
    at renderOutputElement (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:36290)
    at renderOutputCell (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:31222)
    --- await ---
    at <anonymous> (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:21209)
    at c.set.queue (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:27015)
    at enqueue (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:26996)
    at <anonymous> (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/notebookWebviewPreloads.js:3:21182)
    --- postMessage ---
    at <anonymous> (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/index.html?id=6cb0e3f0-1164-4d88-8e15-db6137fa0768&origin=fcd78bff-f7d9-4cc8-b1ad-e1dab4026fe3&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer꞉18:30:1213:45)
    at HostMessaging.channel.port1.onmessage (09886e3b9dn7h1l5r9dnqvvhbqre5rq3lddngc44i9aspp77gjcp/index.html?id=6cb0e3f0-1164-4d88-8e15-db6137fa0768&origin=fcd78bff-f7d9-4cc8-b1ad-e1dab4026fe3&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer꞉18:30:323:8)
```
pastuxso: @sourishkrout Thank you for reviewing. I've just pushed a change to infer the Kubectl context. It should solve the reported issue.
sonarcloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [17.9% Coverage on New Code](https://sonarcloud.io/component_measures?id=stateful_vscode-runme&pullRequest=1464&metric=new_coverage&view=list) (required ≥ 45%)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464)


sonarcloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [18.2% Coverage on New Code](https://sonarcloud.io/component_measures?id=stateful_vscode-runme&pullRequest=1464&metric=new_coverage&view=list) (required ≥ 45%)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464)


sonarcloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [18.2% Coverage on New Code](https://sonarcloud.io/component_measures?id=stateful_vscode-runme&pullRequest=1464&metric=new_coverage&view=list) (required ≥ 45%)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=stateful_vscode-runme&pullRequest=1464)



Patch:
diff --git a/.eslintrc.json b/.eslintrc.json
index 6de72705..d786ec0e 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -38,7 +38,7 @@
     ],
     "max-len": [
       2,
-      120
+      { "code": 120, "ignoreUrls": true, "ignoreTemplateLiterals": true }
     ]
   },
   "ignorePatterns": [
diff --git a/.github/scripts/overwrites/stateful.md b/.github/scripts/overwrites/stateful.md
index 9a5a9572..4503559f 100644
--- a/.github/scripts/overwrites/stateful.md
+++ b/.github/scripts/overwrites/stateful.md
@@ -14,5 +14,5 @@ bash .github/scripts/overwrites/stateful.sh
 To clean up and revert back to Runme's defaults, run the following commands:
 
 ```sh {"id":"01J1N2CE95P9D3ZQZNDQGMVFGX","name":"overwrite-reset"}
-git checkout -f assets package.json 
+git checkout -f assets package.json README.md
 ```
diff --git a/.github/scripts/overwrites/stateful.sh b/.github/scripts/overwrites/stateful.sh
index 7b1b1e41..ab2b33df 100755
--- a/.github/scripts/overwrites/stateful.sh
+++ b/.github/scripts/overwrites/stateful.sh
@@ -21,3 +21,5 @@ cp -f "assets/$EXTENSION_NAME-icon.gif" "assets/icon.gif"
 cp -f "assets/$EXTENSION_NAME-logo-open-dark.svg" "assets/logo-open-dark.svg"
 cp -f "assets/$EXTENSION_NAME-logo-open-light.svg" "assets/logo-open-light.svg"
 cp -f "assets/$EXTENSION_NAME-logo-sidebar.svg" "assets/logo-sidebar.svg"
+
+cp -f "README-$EXTENSION_NAME.md" "README.md"
diff --git a/README-platform.md b/README-platform.md
new file mode 100644
index 00000000..142b910a
--- /dev/null
+++ b/README-platform.md
@@ -0,0 +1,61 @@
+# Stateful for [Visual Studio Code](https://code.visualstudio.com/) [![Tests](https://github.com/stateful/vscode-runme/actions/workflows/test.yml/badge.svg)](https://github.com/stateful/vscode-runme/actions/workflows/test.yml)
+
+Stateful provides a powerful set of tools for creating, running, discovering, storing, and sharing DevOps Notebooks. These Notebooks offer a new way of codifying engineering processes by integrating code/commands, configurations, secrets, and cloud-native tools/services. The platform enables secure collaboration using these Notebooks and their metadata to build a knowledge-base focused on streamlining DevOps.
+
+## Overview
+
+Stateful combines the power of interactive DevOps Notebooks with a robust set of features designed to streamline your development and operational processes. There are two major pieces:
+
+- **Stateful Extension**: A super set of the open-source Runme project, offering enhanced features for authentication, collaboration, and security, making it ideal for teams and enterprises.
+- **Stateful Platform**: A SaaS solution that integrates with GitHub and Slack, serving as a collaboration hub for finding, launching, running, sharing, and troubleshooting Notebooks and their metadata.
+
+<br />
+
+![Demo GIF](https://stateful.com/images/marketplace_readme.gif)
+
+## Key Features
+
+### DevOps Notebooks
+
+- **Rich Code Execution**: Execute code in real-time with support for multiple programming languages.
+- **Data Visualization**: Integrate powerful visualization tools to create insightful data representations.
+- **Collaboration**: Share DevOps Notebooks and collaborate with team members in real-time.
+
+### Platform
+
+The Stateful platform offers a suite of tools and services designed to enhance your development lifecycle.
+
+- **Believe in Your Docs Again**: Transform your documentation into actionable, GitOps-compatible, cloud-native DevOps Notebooks that are collaborative and searchable.
+- **Markdown and VS Code Integration**: Repurpose your existing engineering docs (READMEs, runbooks, etc.) by making commands runnable and configurable, stored next to code in Git.
+- **Knowledge-Base for DevOps**: Search across Git repositories to find the necessary DevOps Notebook, explore historical sessions, commands, diffs, conversations, and metadata to accelerate investigations.
+- **Team Collaboration**: Set up groups and permissions to share DevOps Notebook sessions and metadata with other engineers. Participate in discussion threads and escalate issues to Slack.
+- **Visibility and Observability**: Analyze the health and structure of your DevOps processes with secure activity logs, and integrate with observability tools for flexible data use.
+- **Enterprise-Ready Security**: Integrated with IAM tools like Okta, Active Directory, and Google Workspace for frictionless access provisioning and secure data storage with end-to-end encryption.
+
+
+### Features
+
+- **Runnable Engineering Docs**: Launch Markdown files from GitHub as runnable DevOps Notebooks, saving sessions to the Stateful platform.
+- **Easy Discovery**: Quickly locate and launch DevOps Notebooks from your GitHub organization with one click to open in VS Code, clone the repo, and start running.
+- **History and Metadata**: Automatically save commands, metadata, outputs, and history to Stateful. Search your history, see diffs, share, and troubleshoot processes.
+- **Slack Integration**: Easily escalate or share DevOps Notebooks and commands on Slack for team troubleshooting and discussion.
+- **Backstage Plugin**: View activity feeds, search, and launch project docs directly into runnable DevOps Notebooks with the Stateful plugin for Backstage.
+- **Activity Overview**: Get a quick overview of team DevOps activities and request details for outage investigations with one click.
+- **Robust Team Management**: Streamlined user and group management with permissions for sensitive workflows to avoid costly accidents, integrated with key enterprise tools like SIEM.
+
+## Getting Started
+
+1. **Sign Up**: Create your free account at [Stateful](https://platform.stateful.com/).
+2. **Install VS Code Extension**: Download the Stateful extension from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=stateful.platform). The extension is fully compatible with Runme, but adds authentication, collaboration, and security features, making it secure for teams and inside companies.
+3. **Explore**: Start creating, running, sharing, and discussing your first DevOps Notebook and its commands using the Stateful platform.
+
+For detailed documentation and tutorials, visit our [Documentation](https://stateful.com/docs).
+
+## Learn More About Runme
+
+To learn more about the open-source Runme project and join the community, visit [runme.dev](https://runme.dev).
+
+## Community and Support
+
+- **Join Our Community**: Connect with other developers and get support on our [Discord](https://discord.gg/stateful).
+- **Support**: For additional help, visit our [Support page](https://stateful.com/support) to contact us via email or Discord.
diff --git a/examples/gcp/gke.md b/examples/gcp/gke.md
index 6d446c20..f4a85193 100644
--- a/examples/gcp/gke.md
+++ b/examples/gcp/gke.md
@@ -30,6 +30,15 @@ Now you have configured the region and project, run the following command to lis
 $ gcloud container clusters list --region=$CLUSTERS_REGION --project $CLUSTERS_PROJECT_NAME
 ```
 
+### Connect gcloud with Kubectl
+
+[Install kubectl and configure cluster access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl)
+
+```sh {"id":"01J254YX4R2EZK3B63WX8ZFFQ5"}
+$ export CLUSTER_NAME="cluster-2"
+$ gcloud container clusters get-credentials $CLUSTER_NAME --region=$CLUSTERS_REGION --project=$CLUSTERS_PROJECT_NAME
+```
+
 ### Using Runme Native Cloud Renderers
 
 Runme introduces a **Cloud Native Renderer** tailored for listing Kubernetes clusters, essentially functioning as a mission control dashboard.
@@ -47,7 +56,11 @@ You'll be presented with a resources table akin to the Google Cloud interface, s
 Run the following command (ensure you have provided a valid value for project-id)
 
 ```sh {"id":"01HP535BD16K2VDKBSB2RX7AZW"}
-https://console.cloud.google.com/kubernetes/list/overview?project=project-id
+https://console.cloud.google.com/kubernetes/list/overview?project=$CLUSTERS_PROJECT_NAME
+```
+
+```sh {"background":"false","id":"01J1QPXCQB3WQ41SCHQHNS93T0"}
+https://console.cloud.google.com/kubernetes/clusters/details/us-central1-c/cluster-2/details?project=runme-ci
 ```
 
 You can also paste a cluster details link:
diff --git a/package-lock.json b/package-lock.json
index 106a43b1..cc4ebb53 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "runme",
-  "version": "3.6.2",
+  "version": "3.6.3-edge.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "runme",
-      "version": "3.6.2",
+      "version": "3.6.3-edge.0",
       "hasInstallScript": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -19,6 +19,7 @@
         "@google-cloud/compute": "^4.1.0",
         "@google-cloud/container": "^5.6.0",
         "@google-cloud/run": "^1.2.0",
+        "@kubernetes/client-node": "^0.21.0",
         "@protobuf-ts/grpc-transport": "^2.9.1",
         "@protobuf-ts/runtime": "^2.9.1",
         "@protobuf-ts/runtime-rpc": "^2.9.1",
@@ -4243,7 +4244,6 @@
       "version": "8.0.2",
       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
       "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
-      "dev": true,
       "dependencies": {
         "string-width": "^5.1.2",
         "string-width-cjs": "npm:string-width@^4.2.0",
@@ -4260,7 +4260,6 @@
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
       "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "dev": true,
       "engines": {
         "node": ">=12"
       },
@@ -4271,14 +4270,12 @@
     "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
       "version": "9.2.2",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
-      "dev": true
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
     },
     "node_modules/@isaacs/cliui/node_modules/string-width": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
-      "dev": true,
       "dependencies": {
         "eastasianwidth": "^0.2.0",
         "emoji-regex": "^9.2.2",
@@ -4295,7 +4292,6 @@
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
       "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^6.1.0",
         "string-width": "^5.0.1",
@@ -4308,6 +4304,17 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
+    "node_modules/@isaacs/fs-minipass": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+      "dependencies": {
+        "minipass": "^7.0.4"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
     "node_modules/@istanbuljs/schema": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
@@ -4431,6 +4438,38 @@
       "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==",
       "dev": true
     },
+    "node_modules/@kubernetes/client-node": {
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.21.0.tgz",
+      "integrity": "sha512-yYRbgMeyQbvZDHt/ZqsW3m4lRefzhbbJEuj8sVXM+bufKrgmzriA2oq7lWPH/k/LQIicAME9ixPUadTrxIF6dQ==",
+      "dependencies": {
+        "@types/js-yaml": "^4.0.1",
+        "@types/node": "^20.1.1",
+        "@types/request": "^2.47.1",
+        "@types/ws": "^8.5.3",
+        "byline": "^5.0.0",
+        "isomorphic-ws": "^5.0.0",
+        "js-yaml": "^4.1.0",
+        "jsonpath-plus": "^8.0.0",
+        "request": "^2.88.0",
+        "rfc4648": "^1.3.0",
+        "stream-buffers": "^3.0.2",
+        "tar": "^7.0.0",
+        "tslib": "^2.4.1",
+        "ws": "^8.11.0"
+      },
+      "optionalDependencies": {
+        "openid-client": "^5.3.0"
+      }
+    },
+    "node_modules/@kubernetes/client-node/node_modules/@types/node": {
+      "version": "20.14.9",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz",
+      "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
     "node_modules/@kwsites/file-exists": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
@@ -5847,7 +5886,6 @@
       "version": "0.11.0",
       "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
       "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
-      "dev": true,
       "optional": true,
       "engines": {
         "node": ">=14"
@@ -6926,8 +6964,7 @@
     "node_modules/@types/js-yaml": {
       "version": "4.0.9",
       "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
-      "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
-      "dev": true
+      "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="
     },
     "node_modules/@types/json-schema": {
       "version": "7.0.15",
@@ -7115,7 +7152,6 @@
       "version": "8.5.10",
       "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
       "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
-      "dev": true,
       "dependencies": {
         "@types/node": "*"
       }
@@ -9058,7 +9094,6 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "devOptional": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -9497,8 +9532,7 @@
     "node_modules/argparse": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
     },
     "node_modules/aria-query": {
       "version": "5.3.0",
@@ -9644,6 +9678,14 @@
       "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
       "dev": true
     },
+    "node_modules/asn1": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "dependencies": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
     "node_modules/asn1js": {
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz",
@@ -9658,6 +9700,14 @@
         "node": ">=12.0.0"
       }
     },
+    "node_modules/assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/assertion-error": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
@@ -9798,6 +9848,19 @@
         "fastq": "^1.17.1"
       }
     },
+    "node_modules/aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/aws4": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz",
+      "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g=="
+    },
     "node_modules/axios": {
       "version": "1.7.2",
       "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
@@ -9948,6 +10011,14 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "dependencies": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
     "node_modules/before-after-hook": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
@@ -10205,6 +10276,14 @@
         "node": ">=10.16.0"
       }
     },
+    "node_modules/byline": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
+      "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/cac": {
       "version": "6.7.14",
       "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
@@ -10334,6 +10413,11 @@
         "upper-case-first": "^2.0.2"
       }
     },
+    "node_modules/caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+    },
     "node_modules/chai": {
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
@@ -11211,6 +11295,17 @@
         "url": "https://github.com/sponsors/fb55"
       }
     },
+    "node_modules/dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
     "node_modules/data-guardian": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/data-guardian/-/data-guardian-1.1.3.tgz",
@@ -12277,8 +12372,7 @@
     "node_modules/eastasianwidth": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
-      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
-      "dev": true
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
     },
     "node_modules/easy-table": {
       "version": "1.2.0",
@@ -12292,6 +12386,20 @@
         "wcwidth": "^1.0.1"
       }
     },
+    "node_modules/ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "dependencies": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "node_modules/ecc-jsbn/node_modules/jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+    },
     "node_modules/ecdsa-sig-formatter": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -13553,6 +13661,14 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "engines": [
+        "node >=0.6.0"
+      ]
+    },
     "node_modules/fast-content-type-parse": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz",
@@ -13568,8 +13684,7 @@
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "devOptional": true
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
     },
     "node_modules/fast-fifo": {
       "version": "1.3.2",
@@ -13596,8 +13711,7 @@
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "devOptional": true
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
     },
     "node_modules/fast-json-stringify": {
       "version": "5.16.1",
@@ -14045,7 +14159,6 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
       "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
-      "dev": true,
       "dependencies": {
         "cross-spawn": "^7.0.0",
         "signal-exit": "^4.0.1"
@@ -14057,6 +14170,14 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/fork-ts-checker-webpack-plugin": {
       "version": "9.0.2",
       "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz",
@@ -14597,6 +14718,14 @@
         "node": ">= 10.0.0"
       }
     },
+    "node_modules/getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      }
+    },
     "node_modules/github-from-package": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
@@ -14982,6 +15111,27 @@
         "node": ">=14.0.0"
       }
     },
+    "node_modules/har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "deprecated": "this library is no longer supported",
+      "dependencies": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/has-bigints": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
@@ -15223,6 +15373,20 @@
         "node": ">= 14"
       }
     },
+    "node_modules/http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      },
+      "engines": {
+        "node": ">=0.8",
+        "npm": ">=1.3.7"
+      }
+    },
     "node_modules/http2-wrapper": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
@@ -15981,6 +16145,11 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+    },
     "node_modules/is-unc-path": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
@@ -16111,11 +16280,15 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
       "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
-      "dev": true,
       "peerDependencies": {
         "ws": "*"
       }
     },
+    "node_modules/isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+    },
     "node_modules/istanbul-lib-coverage": {
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -16183,7 +16356,6 @@
       "version": "3.4.2",
       "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.2.tgz",
       "integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==",
-      "dev": true,
       "dependencies": {
         "@isaacs/cliui": "^8.0.2"
       },
@@ -16397,7 +16569,6 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
       "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dev": true,
       "dependencies": {
         "argparse": "^2.0.1"
       },
@@ -16448,6 +16619,11 @@
       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
       "dev": true
     },
+    "node_modules/json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+    },
     "node_modules/json-schema-ref-resolver": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz",
@@ -16460,8 +16636,7 @@
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "devOptional": true
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
@@ -16469,6 +16644,11 @@
       "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true
     },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+    },
     "node_modules/json-to-pretty-yaml": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz",
@@ -16507,6 +16687,18 @@
         "graceful-fs": "^4.1.6"
       }
     },
+    "node_modules/jsonpath-plus": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-8.1.0.tgz",
+      "integrity": "sha512-qVTiuKztFGw0dGhYi3WNqvddx3/SHtyDT0xJaeyz4uP0d1tkpG+0y5uYQ4OcIo1TLAz3PE/qDOW9F0uDt3+CTw==",
+      "bin": {
+        "jsonpath": "bin/jsonpath-cli.js",
+        "jsonpath-plus": "bin/jsonpath-cli.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
     "node_modules/jsonwebtoken": {
       "version": "9.0.2",
       "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
@@ -16547,6 +16739,20 @@
         "safe-buffer": "^5.0.1"
       }
     },
+    "node_modules/jsprim": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+      "dependencies": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
     "node_modules/jszip": {
       "version": "3.10.1",
       "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
@@ -17420,11 +17626,75 @@
       "version": "7.1.2",
       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
       "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "dev": true,
       "engines": {
         "node": ">=16 || 14 >=14.17"
       }
     },
+    "node_modules/minizlib": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz",
+      "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==",
+      "dependencies": {
+        "minipass": "^7.0.4",
+        "rimraf": "^5.0.5"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/minizlib/node_modules/glob": {
+      "version": "10.4.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
+      "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/minizlib/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/minizlib/node_modules/rimraf": {
+      "version": "5.0.7",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz",
+      "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==",
+      "dependencies": {
+        "glob": "^10.3.7"
+      },
+      "bin": {
+        "rimraf": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": ">=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/mitt": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
@@ -18111,6 +18381,14 @@
       "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
       "dev": true
     },
+    "node_modules/oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -18427,6 +18705,15 @@
         "@octokit/openapi-types": "^22.2.0"
       }
     },
+    "node_modules/oidc-token-hash": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz",
+      "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==",
+      "optional": true,
+      "engines": {
+        "node": "^10.13.0 || >=12.0.0"
+      }
+    },
     "node_modules/on-exit-leak-free": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",
@@ -18502,6 +18789,57 @@
         "node": ">=8"
       }
     },
+    "node_modules/openid-client": {
+      "version": "5.6.5",
+      "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.5.tgz",
+      "integrity": "sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==",
+      "optional": true,
+      "dependencies": {
+        "jose": "^4.15.5",
+        "lru-cache": "^6.0.0",
+        "object-hash": "^2.2.0",
+        "oidc-token-hash": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/openid-client/node_modules/jose": {
+      "version": "4.15.7",
+      "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.7.tgz",
+      "integrity": "sha512-L7ioP+JAuZe8v+T5+zVI9Tx8LtU8BL7NxkyDFVMv+Qr3JW0jSoYDedLtodaXwfqMpeCyx4WXFNyu9tJt4WvC1A==",
+      "optional": true,
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/openid-client/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "optional": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/openid-client/node_modules/object-hash": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+      "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+      "optional": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/openid-client/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "optional": true
+    },
     "node_modules/optimism": {
       "version": "0.18.0",
       "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz",
@@ -18730,8 +19068,7 @@
     "node_modules/package-json-from-dist": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
-      "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
-      "dev": true
+      "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="
     },
     "node_modules/pako": {
       "version": "1.0.11",
@@ -18921,7 +19258,6 @@
       "version": "1.11.1",
       "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
       "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
-      "dev": true,
       "dependencies": {
         "lru-cache": "^10.2.0",
         "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
@@ -18937,7 +19273,6 @@
       "version": "10.4.2",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.2.tgz",
       "integrity": "sha512-voV4dDrdVZVNz84n39LFKDaRzfwhdzJ7akpyXfTMxCgRUp07U3lcJUXRlhTKP17rgt09sUzLi5iCitpEAr+6ug==",
-      "dev": true,
       "engines": {
         "node": "14 || 16 || 18 || 20 || >=22"
       }
@@ -18977,6 +19312,11 @@
       "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
       "dev": true
     },
+    "node_modules/performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+    },
     "node_modules/picocolors": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
@@ -19502,6 +19842,11 @@
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
       "dev": true
     },
+    "node_modules/psl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+    },
     "node_modules/pump": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -20302,6 +20647,67 @@
         "node": ">=0.10"
       }
     },
+    "node_modules/request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+      "dependencies": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/request/node_modules/form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 0.12"
+      }
+    },
+    "node_modules/request/node_modules/qs": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+      "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/request/node_modules/uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
+      "bin": {
+        "uuid": "bin/uuid"
+      }
+    },
     "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -20506,6 +20912,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/rfc4648": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.3.tgz",
+      "integrity": "sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ=="
+    },
     "node_modules/rfdc": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
@@ -20817,8 +21228,7 @@
     "node_modules/safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/sax": {
       "version": "1.4.1",
@@ -21345,6 +21755,35 @@
       "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
       "dev": true
     },
+    "node_modules/sshpk": {
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+      "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+      "dependencies": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      },
+      "bin": {
+        "sshpk-conv": "bin/sshpk-conv",
+        "sshpk-sign": "bin/sshpk-sign",
+        "sshpk-verify": "bin/sshpk-verify"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sshpk/node_modules/jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+    },
     "node_modules/stack-chain": {
       "version": "1.3.7",
       "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz",
@@ -21456,7 +21895,6 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz",
       "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==",
-      "dev": true,
       "engines": {
         "node": ">= 0.10.0"
       }
@@ -21544,7 +21982,6 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -21558,7 +21995,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -21648,7 +22084,6 @@
       "version": "7.1.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^6.0.1"
       },
@@ -21664,7 +22099,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -21676,7 +22110,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
       "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
-      "dev": true,
       "engines": {
         "node": ">=12"
       },
@@ -21863,6 +22296,22 @@
         "node": ">=6"
       }
     },
+    "node_modules/tar": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.0.tgz",
+      "integrity": "sha512-XQs0S8fuAkQWuqhDeCdMlJXDX80D7EOVLDPVFkna9yQfzS+PHKgfxcei0jf6/+QAWcjqrnC8uM3fSAnrQl+XYg==",
+      "dependencies": {
+        "@isaacs/fs-minipass": "^4.0.0",
+        "chownr": "^3.0.0",
+        "minipass": "^7.1.2",
+        "minizlib": "^3.0.1",
+        "mkdirp": "^3.0.1",
+        "yallist": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/tar-fs": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz",
@@ -21888,6 +22337,36 @@
         "streamx": "^2.15.0"
       }
     },
+    "node_modules/tar/node_modules/chownr": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/tar/node_modules/mkdirp": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+      "bin": {
+        "mkdirp": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/tar/node_modules/yallist": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/tcp-port-used": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz",
@@ -22194,6 +22673,26 @@
         "node": ">=0.6"
       }
     },
+    "node_modules/tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "dependencies": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/tough-cookie/node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/tr46": {
       "version": "0.0.3",
       "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -22381,8 +22880,6 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
-      "dev": true,
-      "optional": true,
       "dependencies": {
         "safe-buffer": "^5.0.1"
       },
@@ -22390,6 +22887,11 @@
         "node": "*"
       }
     },
+    "node_modules/tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+    },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -22734,7 +23236,6 @@
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "devOptional": true,
       "dependencies": {
         "punycode": "^2.1.0"
       }
@@ -22743,7 +23244,6 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "devOptional": true,
       "engines": {
         "node": ">=6"
       }
@@ -22832,6 +23332,24 @@
         "node": ">=12"
       }
     },
+    "node_modules/verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "node_modules/verror/node_modules/core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+    },
     "node_modules/vite": {
       "version": "5.3.3",
       "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
@@ -23834,7 +24352,6 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -23851,7 +24368,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -23880,7 +24396,6 @@
       "version": "8.18.0",
       "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
       "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
-      "dev": true,
       "engines": {
         "node": ">=10.0.0"
       },
diff --git a/package.json b/package.json
index 15f983a8..6285fb6d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "runme",
-  "version": "3.6.2",
+  "version": "3.6.3-edge.0",
   "publisher": "stateful",
   "displayName": "Runme DevOps Notebooks",
   "description": "Notebooks for DevOps written in Markdown. Runnable, configurable commands/code and embedded terminals. Integrated with cloud consoles, containers and pipelines.",
@@ -1128,6 +1128,7 @@
     "@google-cloud/compute": "^4.1.0",
     "@google-cloud/container": "^5.6.0",
     "@google-cloud/run": "^1.2.0",
+    "@kubernetes/client-node": "^0.21.0",
     "@protobuf-ts/grpc-transport": "^2.9.1",
     "@protobuf-ts/runtime": "^2.9.1",
     "@protobuf-ts/runtime-rpc": "^2.9.1",
diff --git a/sonar-project.properties b/sonar-project.properties
index 423f36a6..6e98e541 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -6,7 +6,7 @@ sonar.tests=tests/
 sonar.working.directory=/tmp/sonar
 sonar.test.inclusions=**/*_test.ts
 sonar.test.exclusions=**/*e2e.ts
-sonar.exclusions=**/__generated-platform__,**/__generated__,dist/**,build/**,out/**,**/__mocks__,coverage/**
+sonar.exclusions=**/__generated-platform__,**/__generated__,dist/**,build/**,out/**,**/__mocks__,coverage/**,src/client/components/gcp/**,src/client/components/aws/**
 sonar.sourceEncoding=UTF-8
 sonar.host.url=https://sonarcloud.io
 sonar.javascript.lcov.reportPaths=./coverage/lcov.info
diff --git a/src/client/components/gcp/gke/cluster.ts b/src/client/components/gcp/gke/cluster.ts
index 4025a4b0..612682e6 100644
--- a/src/client/components/gcp/gke/cluster.ts
+++ b/src/client/components/gcp/gke/cluster.ts
@@ -1,10 +1,10 @@
-import { LitElement, css, html } from 'lit'
+import { LitElement, html } from 'lit'
 import { customElement, property, state } from 'lit/decorators.js'
 import { Disposable } from 'vscode'
 import { when } from 'lit/directives/when.js'
 
 import '../../table'
-import './clusterStatus'
+import '../statusIcon'
 
 import { ClientMessages } from '../../../../constants'
 import { ClientMessage, GcpGkeCluster } from '../../../../types'
@@ -13,6 +13,8 @@ import { getContext } from '../../../utils'
 import { ArrowLeft } from '../../icons/arrowLeft'
 import { ClusterIcon } from '../../icons/cluster'
 
+import { clusterStyles } from './styles'
+
 @customElement('gcp-gke-cluster')
 export class Clusters extends LitElement implements Disposable {
   protected disposables: Disposable[] = []
@@ -44,111 +46,7 @@ export class Clusters extends LitElement implements Disposable {
   @state()
   executedInNewCell?: boolean | undefined
 
-  /* eslint-disable */
-  static styles = css`
-    vscode-button {
-      color: var(--vscode-button-foreground);
-      background-color: var(--vscode-button-background);
-      transform: scale(0.9);
-    }
-
-    vscode-button:hover {
-      background: var(--vscode-button-secondaryHoverBackground);
-    }
-
-    table {
-      box-sizing: border-box;
-      margin: 0px;
-      padding: 0px;
-      font-weight: 400;
-      line-height: 20px;
-      text-indent: 0px;
-      vertical-align: baseline;
-    }
-
-    .action-notice {
-      position: relative;
-      border-bottom: 2px solid var(--vscode-settings-rowHoverBackground);
-      animation-name: action-notice;
-      animation-duration: 2s;
-      animation-iteration-count: 2;
-    }
-
-    @keyframes action-notice {
-      0% {
-        border-color: var(--vscode-settings-rowHoverBackground);
-      }
-
-      50% {
-        border-color: var(--github-button-background);
-      }
-
-      100% {
-        border-color: var(--vscode-settings-rowHoverBackground);
-      }
-    }
-
-    .integration {
-      display: flex;
-      margin: 10px 0;
-      gap: 2px;
-      align-items: center;
-      font-weight: 400;
-      font-size: 18px;
-    }
-
-    .footer {
-      display: flex;
-      place-content: center flex-end;
-      margin-top: 10px;
-      align-items: baseline;
-    }
-
-    .footer .link {
-      font-size: 10px;
-      padding: 0 5px;
-    }
-
-    .tab,
-    .panel {
-      color: var(--vscode-editor-foreground);
-    }
-
-    .active-tab {
-      color: var(--vscode-textLink-activeForeground);
-      fill: currentcolor;
-      border-bottom: solid 2px var(--vscode-activityBarTop-activeBorder);
-    }
-
-    .cluster-view {
-      width: 100%;
-    }
-
-    .cluster-view tbody tr {
-      text-align: left;
-    }
-
-    .cluster-actions {
-      display: flex;
-      align-items: center;
-      gap: 10px;
-      border-top: solid 1px var(--vscode-editorInlayHint-foreground);
-      border-bottom: solid 1px var(--vscode-editorInlayHint-foreground);
-      border-left: none;
-      border-right: none;
-    }
-
-    tbody tr {
-      text-align: left;
-    }
-
-    .loading {
-      display: flex;
-      align-items: center;
-      gap: 10px;
-      place-content: center;
-    }
-  `
+  static styles = clusterStyles
 
   private getClusterDetails() {
     const ctx = getContext()
@@ -246,7 +144,7 @@ export class Clusters extends LitElement implements Disposable {
           value: clusterBasics.privateEndpoint,
         },
       ]}"
-      .displayable="${(row: GcpGkeCluster, field: string) => {
+      .displayable="${(_row: GcpGkeCluster, _field: string) => {
         return true
       }}"
       .renderer="${(row: GcpGkeCluster, field: string) => {
@@ -298,7 +196,7 @@ export class Clusters extends LitElement implements Disposable {
           value: automation.autoscaling?.autoscalingProfile,
         },
       ]}"
-      .displayable="${(row: GcpGkeCluster, field: string) => {
+      .displayable="${(_row: GcpGkeCluster, _field: string) => {
         return true
       }}"
       .renderer="${(row: GcpGkeCluster, field: string) => {
@@ -408,7 +306,7 @@ export class Clusters extends LitElement implements Disposable {
           value: this.displayFeatureStatus(networking.multinetworking),
         },
       ]}"
-      .displayable="${(row: GcpGkeCluster, field: string) => {
+      .displayable="${(_row: GcpGkeCluster, _field: string) => {
         return true
       }}"
       .renderer="${(row: GcpGkeCluster, field: string) => {
@@ -417,6 +315,134 @@ export class Clusters extends LitElement implements Disposable {
     ></table-view>`
   }
 
+  private resolveNodeLink(nodeName: string) {
+    return `https://console.cloud.google.com/kubernetes/node/${this.location}/${this.cluster}/${nodeName}/summary?project=${this.projectId}`
+  }
+
+  private resolveNodePoolLink(nodePoolName: string) {
+    return `https://console.cloud.google.com/kubernetes/nodepool/${this.location}/${this.cluster}/${nodePoolName}?project=${this.projectId}`
+  }
+
+  private renderClusterNodePools() {
+    const basePath = `https://console.cloud.google.com/kubernetes/clusters/details/${this.location}/${this.cluster}`
+
+    const {
+      clusterBasics: { nodePools, clusterNodes },
+    } = this._clusterDetails
+    return html`<div>
+      <vscode-link href="${basePath}/nodes?project=${this.projectId}">
+        <h3>Node Pools</h3>
+      </vscode-link>
+      <table-view
+        .columns="${[
+          {
+            text: 'Status',
+            key: 'status',
+          },
+          {
+            text: 'Name',
+            key: 'name',
+          },
+          {
+            text: 'Version',
+          },
+          {
+            text: 'Number of nodes',
+          },
+          {
+            text: 'Machine type',
+          },
+          {
+            text: 'Image type',
+          },
+        ]}"
+        .rows="${nodePools.map((nodePool: any) => {
+          return {
+            status: nodePool.status,
+            name: nodePool.name,
+            version: nodePool.version,
+            numberOfNodes: nodePool.numberOfNodes,
+            machineType: nodePool.machineType,
+            imageType: nodePool.imageType,
+          }
+        })}"
+        .displayable="${(_row: GcpGkeCluster, _field: string) => {
+          return true
+        }}"
+        .renderer="${(row: GcpGkeCluster, field: string) => {
+          switch (field) {
+            case 'name':
+              return html`<vscode-link href="${this.resolveNodePoolLink(row[field])}"
+                >${row[field]}</vscode-link
+              >`
+            case 'status':
+              return html`<status-icon .status="${row[field]}"></status-icon>`
+            default:
+              return html`${row[field]}`
+          }
+        }}"
+      ></table-view>
+      <vscode-link href="${basePath}/nodes?project=${this.projectId}">
+        <h3>Nodes</h3>
+      </vscode-link>
+      <table-view
+        .columns="${[
+          {
+            text: 'Status',
+          },
+          {
+            text: 'Name',
+          },
+          {
+            text: 'CPU Requested',
+          },
+          {
+            text: 'CPU Allocatable',
+          },
+          {
+            text: 'Memory Requested',
+          },
+          {
+            text: 'Memory Allocatable',
+          },
+          {
+            text: 'Storage Requested',
+          },
+          {
+            text: 'Storage Allocatable',
+          },
+        ]}"
+        .rows="${clusterNodes.map((node: any) => {
+          return {
+            instanceStatus: node.instanceStatus,
+            name: node.name,
+            cpuRequested: node.cpuRequested,
+            cpuAllocatable: node.cpuAllocatable,
+            memoryRequested: node.memoryRequested,
+            memoryAllocatable: node.memoryAllocatable,
+            storageRequested: node.storageRequested,
+            storageAllocatable: node.storageAllocatable,
+          }
+        })}"
+        .displayable="${(_row: GcpGkeCluster, _field: string) => {
+          return true
+        }}"
+        .renderer="${(row: GcpGkeCluster, field: string) => {
+          switch (field) {
+            case 'name':
+              return html`<vscode-link href="${this.resolveNodeLink(row[field])}"
+                >${row[field]}</vscode-link
+              >`
+            case 'instanceStatus':
+              return html`<status-icon .status="${row[field]}"></status-icon>`
+            default:
+              return html`${row[field]}`
+          }
+        }}"
+      ></table-view>
+    </div>`
+  }
+
   private getTabClass(tab: string) {
     return this.activeTabId === tab ? 'tab active-tab' : 'tab'
   }
@@ -502,9 +528,9 @@ export class Clusters extends LitElement implements Disposable {
             </section>
           </vscode-panel-view>
           <vscode-panel-view id="view-2" class="panel">
-            <vscode-link href="${basePath}/nodes?project=${this.projectId}">
-              View nodes
-            </vscode-link>
+            <section class="cluster-view flex flex-column">
+              ${this.renderClusterNodePools()}
+            </section>
           </vscode-panel-view>
           <vscode-panel-view id="view-3" class="panel">
             <vscode-link href="${basePath}/storage?project=${this.projectId}">
diff --git a/src/client/components/gcp/gke/styles.ts b/src/client/components/gcp/gke/styles.ts
new file mode 100644
index 00000000..1770ffaa
--- /dev/null
+++ b/src/client/components/gcp/gke/styles.ts
@@ -0,0 +1,117 @@
+import { css } from 'lit'
+/* eslint-disable */
+
+export const clusterStyles = css`
+  vscode-button {
+    color: var(--vscode-button-foreground);
+    background-color: var(--vscode-button-background);
+    transform: scale(0.9);
+  }
+
+  vscode-button:hover {
+    background: var(--vscode-button-secondaryHoverBackground);
+  }
+
+  table {
+    box-sizing: border-box;
+    margin: 0px;
+    padding: 0px;
+    font-weight: 400;
+    line-height: 20px;
+    text-indent: 0px;
+    vertical-align: baseline;
+  }
+
+  .action-notice {
+    position: relative;
+    border-bottom: 2px solid var(--vscode-settings-rowHoverBackground);
+    animation-name: action-notice;
+    animation-duration: 2s;
+    animation-iteration-count: 2;
+  }
+
+  @keyframes action-notice {
+    0% {
+      border-color: var(--vscode-settings-rowHoverBackground);
+    }
+
+    50% {
+      border-color: var(--github-button-background);
+    }
+
+    100% {
+      border-color: var(--vscode-settings-rowHoverBackground);
+    }
+  }
+
+  .integration {
+    display: flex;
+    margin: 10px 0;
+    gap: 2px;
+    align-items: center;
+    font-weight: 400;
+    font-size: 18px;
+  }
+
+  .footer {
+    display: flex;
+    place-content: center flex-end;
+    margin-top: 10px;
+    align-items: baseline;
+  }
+
+  .footer .link {
+    font-size: 10px;
+    padding: 0 5px;
+  }
+
+  .tab,
+  .panel {
+    color: var(--vscode-editor-foreground);
+  }
+
+  .active-tab {
+    color: var(--vscode-textLink-activeForeground);
+    fill: currentcolor;
+    border-bottom: solid 2px var(--vscode-activityBarTop-activeBorder);
+  }
+
+  .cluster-view {
+    width: 100%;
+  }
+
+  .cluster-view tbody tr {
+    text-align: left;
+  }
+
+  .cluster-actions {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    border-top: solid 1px var(--vscode-editorInlayHint-foreground);
+    border-bottom: solid 1px var(--vscode-editorInlayHint-foreground);
+    border-left: none;
+    border-right: none;
+  }
+
+  tbody tr {
+    text-align: left;
+  }
+
+  .loading {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    place-content: center;
+  }
+
+  .flex {
+    display: flex;
+    align-items: left;
+    gap: 8px;
+  }
+
+  .flex-column {
+    flex-direction: column;
+  }
+`
diff --git a/src/extension/executors/gcp/gke/clusters.ts b/src/extension/executors/gcp/gke/clusters.ts
index 5b1474b0..c4da4831 100644
--- a/src/extension/executors/gcp/gke/clusters.ts
+++ b/src/extension/executors/gcp/gke/clusters.ts
@@ -1,5 +1,6 @@
 import container from '@google-cloud/container'
 import compute from '@google-cloud/compute'
+import { KubeConfig, CoreV1Api } from '@kubernetes/client-node'
 
 import { GcpGkeCluster } from '../../../../types'
 
@@ -92,6 +93,17 @@ export async function getCluster(clusterName: string, location: string, project:
   }
 }
 
+type NodeInfo = {
+  name: string
+  instanceStatus: string
+  cpuRequested?: string
+  cpuAllocatable?: string
+  memoryRequested?: string
+  memoryAllocatable?: string
+  storageRequested?: string
+  storageAllocatable?: string
+}
+
 /**
  * Get full cluster details including Nodes information.
  * Response is mapped to reflect cluster details in Google Cloud Console.
@@ -102,7 +114,59 @@ export async function getClusterDetails(clusterName: string, location: string, p
     const response = await clusterManagement.getCluster({
       name: `projects/${project}/locations/${location}/clusters/${clusterName}`,
     })
+
     const [cluster] = response
+    const instanceGroupsUrls = cluster.instanceGroupUrls || []
+
+    let gcloudNodes: NodeInfo[] = []
+
+    for (const instanceGroupUrl of instanceGroupsUrls) {
+      const instanceGroupName = instanceGroupUrl.split('/').pop()
+      const instancesClient = new compute.v1.InstanceGroupManagersClient()
+      const [instances] = await instancesClient.listManagedInstances({
+        project: project,
+        zone: location,
+        instanceGroupManager: instanceGroupName,
+      })
+
+      const nodes: NodeInfo[] = instances.map((instance) => ({
+        name: instance?.name?.split('/').pop()!,
+        instanceStatus: instance.instanceStatus as string,
+      }))
+
+      gcloudNodes.push(...nodes)
+    }
+
+    const k8sClusterName = `gke_${project}_${location}_${cluster.name}`
+    const kubeConfig = new KubeConfig()
+    kubeConfig.loadFromDefault()
+
+    const context = kubeConfig.getContexts().find((context) => context.cluster === k8sClusterName)
+    if (context) {
+      kubeConfig.setCurrentContext(context.name)
+    }
+
+    const coreV1Api = kubeConfig.makeApiClient(CoreV1Api)
+
+    const k8sNodes = await coreV1Api.listNode()
+
+    const clusterNodes = gcloudNodes.map((gcloudNode) => {
+      const node = k8sNodes.body.items.find((node) => node.metadata?.name === gcloudNode.name)
+      if (!node) {
+        return gcloudNode
+      }
+
+      return {
+        ...gcloudNode,
+        cpuRequested: '-',
+        cpuAllocatable: node?.status?.allocatable?.cpu,
+        memoryRequested: node?.status?.capacity?.memory,
+        memoryAllocatable: node?.status?.allocatable?.memory,
+        storageRequested: node?.status?.capacity?.['ephemeral-storage'],
+        storageAllocatable: node?.status?.allocatable?.['ephemeral-storage'],
+      }
+    })
+
     return {
       itFailed: false,
       data: {
@@ -116,7 +180,7 @@ export async function getClusterDetails(clusterName: string, location: string, p
           privateEndpoint: cluster.privateClusterConfig?.privateEndpoint,
           clusterCertificate: cluster.masterAuth?.clusterCaCertificate,
           basicCredentialsEnabled: !!cluster.masterAuth?.password,
-          node: cluster.nodePools?.map((nodePool) => {
+          nodePools: cluster.nodePools?.map((nodePool) => {
             return {
               name: nodePool.name,
               status: nodePool.status,
@@ -128,6 +192,7 @@ export async function getClusterDetails(clusterName: string, location: string, p
               ipv4PodAddressRange: nodePool.networkConfig?.podIpv4CidrBlock,
             }
           }),
+          clusterNodes,
         },
         automation: {
           maintenance: cluster.maintenancePolicy?.window,
diff --git a/src/extension/messages/platformRequest/saveCellExecution.ts b/src/extension/messages/platformRequest/saveCellExecution.ts
index dc622c6c..1c21769a 100644
--- a/src/extension/messages/platformRequest/saveCellExecution.ts
+++ b/src/extension/messages/platformRequest/saveCellExecution.ts
@@ -1,4 +1,4 @@
-import { Uri, window, workspace } from 'vscode'
+import { Uri, workspace } from 'vscode'
 import { TelemetryReporter } from 'vscode-telemetry'
 import YAML from 'yaml'
 
@@ -79,7 +79,7 @@ export default async function saveCellExecution(
     let notebookInput: CreateNotebookInput | undefined
 
     const gitCtx = await getGitContext()
-    const path = window.activeTextEditor?.document.uri.fsPath
+    const path = editor.notebook.uri.fsPath
     const filePath = gitCtx.repository ? `${gitCtx.relativePath}${path?.split('/').pop()}` : path
     const fileContent = path ? await workspace.fs.readFile(Uri.file(path)) : null
 


Test patch:
diff --git a/tests/extension/messages/platformApiRequest/saveCellExecution.test.ts b/tests/extension/messages/platformApiRequest/saveCellExecution.test.ts
index 266c97a6..cde33f2d 100644
--- a/tests/extension/messages/platformApiRequest/saveCellExecution.test.ts
+++ b/tests/extension/messages/platformApiRequest/saveCellExecution.test.ts
@@ -27,14 +27,6 @@ vi.mock('vscode', async () => {
     },
     window: {
       ...mocked.window,
-      activeTextEditor: {
-        document: {
-          fileName: '/foo/bar/README.md',
-          uri: {
-            fsPath: '/foo/bar/README.md',
-          },
-        },
-      },
     },
   }
 })
@@ -122,6 +114,7 @@ suite('Save cell execution', () => {
       message,
       editor: {
         notebook: {
+          uri: { fsPath: '/foo/bar/README.md' },
           metadata: {
             ['runme.dev/frontmatterParsed']: { runme: { id: 'ulid' } },
           },
@@ -201,6 +194,7 @@ suite('Save cell execution', () => {
       message,
       editor: {
         notebook: {
+          uri: { fsPath: '/foo/bar/README.md' },
           metadata: {
             ['runme.dev/frontmatterParsed']: { runme: { id: 'ulid' } },
           },
diff --git a/vitest.conf.ts b/vitest.conf.ts
index 1c7314f5..18680b20 100644
--- a/vitest.conf.ts
+++ b/vitest.conf.ts
@@ -28,6 +28,8 @@ export default defineConfig({
         // vendored code
         'src/utils/deno',
         'src/extension/wasm',
+        'src/client/components/aws/**',
+        'src/client/components/gcp/**',
       ],
       thresholds: {
         statements: 43,