Repository: stateful/vscode-runme
Pull request #585 (2023-06-05 20:17:23)

Allow to define a start-up file to be opened by Runme when extension activates
> As a repository maintainer I want to have developers open an e.g. `CONTRIBUTING.md` file every time they start the project. 

This patch adds a `runme.flags.startFile` setting that allows to define a file to be opened by Runme at application start. This would be helpful for anyone that has an important file for contributor to look at to have it opened when VS Code starts. Especially for developers defining a `devcontainer.json` file it could allow new contributors to see all important documentation and commands to start get productive.

If the file is not existing in the repository, it will just return silently. This allows devs to have a global configuration to always open e.g. a `CONTRIBUTING.md` file if existing. Otherwise this option is meant to be used mainly in `.vscode/settings.json` files.

I am not entirely sure if it is a desired behavior for experienced developers to have the same file over and over opened again when starting their IDE. I could think of adding a confirmation popup asking to open again on start up. Feedback on this would be appreciated.

sourishkrout: > I am aware of the `runOn` feature but doubt it fulfils to provide the same seamless experience we use for the Runme link I was looking for. I will play around with your suggested approach and will report back.

The best match would probably be a CLI command that triggers the task execution inside VS Code. Ideally, the Kernel would absorb task management/visibility so that, no matter where you start a task, CLI, or Extension, it's aware if they are already running. To unblock you we could use the file-based approach but I wouldn't want to document and advocated it broadly (yet).
christian-bromann: > Ideally, the Kernel would absorb task management/visibility so that, no matter where you start a task, CLI, or Extension, it's aware if they are already running.

Can you explain what you mean by that?

I don't think this feature makes sense anywhere outside of VS Code context which is why this is solely added in the extension. To reiterate: the goal is to allow a user (project contributors) to have the extension automatically open a notebook when the IDE opens. project maintainer can set this pref as part of a `devcontainer.json` or `.vscode/settings.json`. This is not about running any tasks, just opening the right start file in the IDE.
sourishkrout: > > Ideally, the Kernel would absorb task management/visibility so that, no matter where you start a task, CLI, or Extension, it's aware if they are already running.
> 
> Can you explain what you mean by that?
> 
> I don't think this feature makes sense anywhere outside of VS Code context which is why this is solely added in the extension. To reiterate: the goal is to allow a user (project contributors) to have the extension automatically open a notebook when the IDE opens. project maintainer can set this pref as part of a `devcontainer.json` or `.vscode/settings.json`. This is not about running any tasks, just opening the right start file in the IDE.

Yes, I understand. I got a bit ahead of myself here, which I see makes this confusing. However, I meant having a command that allows opening a file in the notebook view in the Extension from the CLI. Trigger by a attach or launch "hook". Further removing the boundaries between the two clients. Anyways, the implemented approach is good enough to unblock you.

Patch:
diff --git a/README.md b/README.md
index 46ddab4f..1c2dc19c 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ This VS Code extension transparently opens markdown files (i.e. README.md) as ru
 
 > 💡 If you don't want the runme notebook, you can always right click on the .md file, click `Open With...` and select the text editor. To make your choice permanent pick "Configure default editor for...".
 
-![Text and notebook view side-by-side](https://runme.dev/img/intro.gif)
+![Text and notebook view side-by-side](https://runme.dev/img/short.gif)
 
 ## Documentation
 
diff --git a/__mocks__/vscode-telemetry.ts b/__mocks__/vscode-telemetry.ts
index 70ef8d25..3fdee089 100644
--- a/__mocks__/vscode-telemetry.ts
+++ b/__mocks__/vscode-telemetry.ts
@@ -1,5 +1,6 @@
 import { vi } from 'vitest'
 
 export const TelemetryReporter = {
-  sendTelemetryEvent: vi.fn()
+  sendTelemetryEvent: vi.fn(),
+  sendTelemetryErrorEvent: vi.fn()
 }
diff --git a/examples/README.md b/examples/README.md
index f3b7c23f..b9c68c8f 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -151,3 +151,11 @@ echo Rows: \$(tput lines)
 echo Columns: \$(tput cols)
 "
 ```
+
+## Inspect JSON files
+
+With [`antonmedv/fx`](https://github.com/antonmedv/fx) you can inspect JSON files interactively in Runme notebooks, e.g.:
+
+```sh
+curl "https://api.marquee.activecove.com/getWeather?lat=52&lon=10" | fx
+```
diff --git a/package-lock.json b/package-lock.json
index 373e1485..3d4ad260 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "runme",
-  "version": "1.5.2-edge.1",
+  "version": "1.5.3",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "runme",
-      "version": "1.5.2-edge.1",
+      "version": "1.5.3",
       "hasInstallScript": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -4537,9 +4537,9 @@
       "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
     },
     "node_modules/@types/node": {
-      "version": "20.2.5",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz",
-      "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ=="
+      "version": "20.3.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz",
+      "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ=="
     },
     "node_modules/@types/node-fetch": {
       "version": "2.6.3",
@@ -4752,14 +4752,14 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "5.59.7",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz",
-      "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==",
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz",
+      "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.59.7",
-        "@typescript-eslint/types": "5.59.7",
-        "@typescript-eslint/typescript-estree": "5.59.7",
+        "@typescript-eslint/scope-manager": "5.59.9",
+        "@typescript-eslint/types": "5.59.9",
+        "@typescript-eslint/typescript-estree": "5.59.9",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -4778,14 +4778,33 @@
         }
       }
     },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz",
+      "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.9",
+        "@typescript-eslint/visitor-keys": "5.59.9"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/type-utils": {
       "version": "5.59.7",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz",
-      "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz",
+      "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.59.7",
-        "@typescript-eslint/visitor-keys": "5.59.7"
+        "@typescript-eslint/typescript-estree": "5.59.7",
+        "@typescript-eslint/utils": "5.59.7",
+        "debug": "^4.3.4",
+        "tsutils": "^3.21.0"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4793,9 +4812,17 @@
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
+    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
       "version": "5.59.7",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz",
       "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==",
@@ -4808,7 +4835,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
+    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
       "version": "5.59.7",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz",
       "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==",
@@ -4835,7 +4862,7 @@
         }
       }
     },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
+    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
       "version": "5.59.7",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz",
       "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==",
@@ -4852,54 +4879,27 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
-    "node_modules/@typescript-eslint/type-utils": {
-      "version": "5.59.7",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz",
-      "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==",
+    "node_modules/@typescript-eslint/types": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz",
+      "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==",
       "dev": true,
-      "dependencies": {
-        "@typescript-eslint/typescript-estree": "5.59.7",
-        "@typescript-eslint/utils": "5.59.7",
-        "debug": "^4.3.4",
-        "tsutils": "^3.21.0"
-      },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "*"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
       }
     },
-    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
-      "version": "5.59.7",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz",
-      "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==",
-      "dev": true,
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
-      "version": "5.59.7",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz",
-      "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==",
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz",
+      "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.59.7",
-        "@typescript-eslint/visitor-keys": "5.59.7",
+        "@typescript-eslint/types": "5.59.9",
+        "@typescript-eslint/visitor-keys": "5.59.9",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -4919,23 +4919,6 @@
         }
       }
     },
-    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
-      "version": "5.59.7",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz",
-      "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "5.59.7",
-        "eslint-visitor-keys": "^3.3.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
     "node_modules/@typescript-eslint/utils": {
       "version": "5.59.7",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz",
@@ -5036,6 +5019,23 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz",
+      "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.9",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
     "node_modules/@vanilla-extract/babel-plugin-debug-ids": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.3.tgz",
@@ -5968,6 +5968,115 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
+    "node_modules/@wdio/cli/node_modules/devtools": {
+      "version": "8.10.7",
+      "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
+      "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "^20.1.0",
+        "@wdio/config": "8.10.7",
+        "@wdio/logger": "8.10.6",
+        "@wdio/protocols": "8.10.2",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.10.7",
+        "chrome-launcher": "^0.15.0",
+        "edge-paths": "^3.0.5",
+        "import-meta-resolve": "^3.0.0",
+        "puppeteer-core": "20.3.0",
+        "query-selector-shadow-dom": "^1.0.0",
+        "ua-parser-js": "^1.0.1",
+        "uuid": "^9.0.0",
+        "which": "^3.0.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/@wdio/cli/node_modules/devtools-protocol": {
+      "version": "0.0.1149535",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
+      "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+      "dev": true
+    },
+    "node_modules/@wdio/cli/node_modules/is-plain-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@wdio/cli/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@wdio/cli/node_modules/webdriverio": {
+      "version": "8.10.7",
+      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
+      "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "^20.1.0",
+        "@wdio/config": "8.10.7",
+        "@wdio/logger": "8.10.6",
+        "@wdio/protocols": "8.10.2",
+        "@wdio/repl": "8.10.1",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.10.7",
+        "archiver": "^5.0.0",
+        "aria-query": "^5.0.0",
+        "css-shorthand-properties": "^1.1.1",
+        "css-value": "^0.0.1",
+        "devtools": "8.10.7",
+        "devtools-protocol": "^0.0.1149535",
+        "grapheme-splitter": "^1.0.2",
+        "import-meta-resolve": "^3.0.0",
+        "is-plain-obj": "^4.1.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.zip": "^4.2.0",
+        "minimatch": "^9.0.0",
+        "puppeteer-core": "20.3.0",
+        "query-selector-shadow-dom": "^1.0.0",
+        "resq": "^1.9.1",
+        "rgb2hex": "0.2.5",
+        "serialize-error": "^8.0.0",
+        "webdriver": "8.10.7"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/@wdio/cli/node_modules/which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+      "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/@wdio/config": {
       "version": "8.10.7",
       "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.10.7.tgz",
@@ -6074,6 +6183,121 @@
         "webdriverio": "8.10.7"
       }
     },
+    "node_modules/@wdio/globals/node_modules/devtools": {
+      "version": "8.10.7",
+      "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
+      "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "@types/node": "^20.1.0",
+        "@wdio/config": "8.10.7",
+        "@wdio/logger": "8.10.6",
+        "@wdio/protocols": "8.10.2",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.10.7",
+        "chrome-launcher": "^0.15.0",
+        "edge-paths": "^3.0.5",
+        "import-meta-resolve": "^3.0.0",
+        "puppeteer-core": "20.3.0",
+        "query-selector-shadow-dom": "^1.0.0",
+        "ua-parser-js": "^1.0.1",
+        "uuid": "^9.0.0",
+        "which": "^3.0.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/@wdio/globals/node_modules/devtools-protocol": {
+      "version": "0.0.1149535",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
+      "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/@wdio/globals/node_modules/is-plain-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@wdio/globals/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@wdio/globals/node_modules/webdriverio": {
+      "version": "8.10.7",
+      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
+      "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "@types/node": "^20.1.0",
+        "@wdio/config": "8.10.7",
+        "@wdio/logger": "8.10.6",
+        "@wdio/protocols": "8.10.2",
+        "@wdio/repl": "8.10.1",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.10.7",
+        "archiver": "^5.0.0",
+        "aria-query": "^5.0.0",
+        "css-shorthand-properties": "^1.1.1",
+        "css-value": "^0.0.1",
+        "devtools": "8.10.7",
+        "devtools-protocol": "^0.0.1149535",
+        "grapheme-splitter": "^1.0.2",
+        "import-meta-resolve": "^3.0.0",
+        "is-plain-obj": "^4.1.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.zip": "^4.2.0",
+        "minimatch": "^9.0.0",
+        "puppeteer-core": "20.3.0",
+        "query-selector-shadow-dom": "^1.0.0",
+        "resq": "^1.9.1",
+        "rgb2hex": "0.2.5",
+        "serialize-error": "^8.0.0",
+        "webdriver": "8.10.7"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/@wdio/globals/node_modules/which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+      "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/@wdio/local-runner": {
       "version": "8.10.7",
       "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.10.7.tgz",
@@ -6183,13 +6407,13 @@
       }
     },
     "node_modules/@wdio/reporter": {
-      "version": "8.10.6",
-      "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.10.6.tgz",
-      "integrity": "sha512-dJFzhO4bZJLNgk+V4NYuZcugDjW3vJzL0gmThWwLAxfui5dXKJeVBL96ZnvBLcHSAK4rVx1+KdCI3M26rpOS8w==",
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.11.0.tgz",
+      "integrity": "sha512-eNQxzaTzouyCGRT8ljSzdOf5oJnQxgiKwOs9Cw/j4r5eqd5JQs+GCFP6tFVNjGtPpVIbfsfTb7yI+xmvjNRXhw==",
       "dev": true,
       "dependencies": {
         "@types/node": "^20.1.0",
-        "@wdio/logger": "8.10.6",
+        "@wdio/logger": "8.11.0",
         "@wdio/types": "8.10.4",
         "diff": "^5.0.0",
         "object-inspect": "^1.12.0",
@@ -6199,6 +6423,60 @@
         "node": "^16.13 || >=18"
       }
     },
+    "node_modules/@wdio/reporter/node_modules/@wdio/logger": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
+      "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^5.1.2",
+        "loglevel": "^1.6.0",
+        "loglevel-plugin-prefix": "^0.8.4",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/@wdio/reporter/node_modules/ansi-regex": {
+      "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"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@wdio/reporter/node_modules/chalk": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+      "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+      "dev": true,
+      "engines": {
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/@wdio/reporter/node_modules/strip-ansi": {
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
     "node_modules/@wdio/runner": {
       "version": "8.10.7",
       "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.10.7.tgz",
@@ -6221,13 +6499,122 @@
         "node": "^16.13 || >=18"
       }
     },
+    "node_modules/@wdio/runner/node_modules/devtools": {
+      "version": "8.10.7",
+      "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
+      "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "^20.1.0",
+        "@wdio/config": "8.10.7",
+        "@wdio/logger": "8.10.6",
+        "@wdio/protocols": "8.10.2",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.10.7",
+        "chrome-launcher": "^0.15.0",
+        "edge-paths": "^3.0.5",
+        "import-meta-resolve": "^3.0.0",
+        "puppeteer-core": "20.3.0",
+        "query-selector-shadow-dom": "^1.0.0",
+        "ua-parser-js": "^1.0.1",
+        "uuid": "^9.0.0",
+        "which": "^3.0.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/@wdio/runner/node_modules/devtools-protocol": {
+      "version": "0.0.1149535",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
+      "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+      "dev": true
+    },
+    "node_modules/@wdio/runner/node_modules/is-plain-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@wdio/runner/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@wdio/runner/node_modules/webdriverio": {
+      "version": "8.10.7",
+      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
+      "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "^20.1.0",
+        "@wdio/config": "8.10.7",
+        "@wdio/logger": "8.10.6",
+        "@wdio/protocols": "8.10.2",
+        "@wdio/repl": "8.10.1",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.10.7",
+        "archiver": "^5.0.0",
+        "aria-query": "^5.0.0",
+        "css-shorthand-properties": "^1.1.1",
+        "css-value": "^0.0.1",
+        "devtools": "8.10.7",
+        "devtools-protocol": "^0.0.1149535",
+        "grapheme-splitter": "^1.0.2",
+        "import-meta-resolve": "^3.0.0",
+        "is-plain-obj": "^4.1.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.zip": "^4.2.0",
+        "minimatch": "^9.0.0",
+        "puppeteer-core": "20.3.0",
+        "query-selector-shadow-dom": "^1.0.0",
+        "resq": "^1.9.1",
+        "rgb2hex": "0.2.5",
+        "serialize-error": "^8.0.0",
+        "webdriver": "8.10.7"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/@wdio/runner/node_modules/which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+      "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/@wdio/spec-reporter": {
-      "version": "8.10.6",
-      "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.10.6.tgz",
-      "integrity": "sha512-CbdyAY063THUqYnhj+7yr7WLjFYxG++d1AuGdJvYn8CL1/5Wjr3E+EGyofIZs4GtYAJsXH69kNtRO7lwDClvcQ==",
+      "version": "8.11.2",
+      "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.11.2.tgz",
+      "integrity": "sha512-ylhxICgen4eEMXgGBEAN6lYs/UnQ4WUYy2ld/4978vRObXy7pGINz96pIPZHAMn01ENU0+gWr8edwawfZyrqLw==",
       "dev": true,
       "dependencies": {
-        "@wdio/reporter": "8.10.6",
+        "@wdio/reporter": "8.11.0",
         "@wdio/types": "8.10.4",
         "chalk": "^5.1.2",
         "easy-table": "^1.2.0",
@@ -6428,9 +6815,9 @@
       }
     },
     "node_modules/@webpack-cli/configtest": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz",
-      "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+      "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
       "dev": true,
       "engines": {
         "node": ">=14.15.0"
@@ -6441,9 +6828,9 @@
       }
     },
     "node_modules/@webpack-cli/info": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz",
-      "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+      "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
       "dev": true,
       "engines": {
         "node": ">=14.15.0"
@@ -6454,9 +6841,9 @@
       }
     },
     "node_modules/@webpack-cli/serve": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz",
-      "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+      "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
       "dev": true,
       "engines": {
         "node": ">=14.15.0"
@@ -8163,6 +8550,18 @@
         "node": ">=16"
       }
     },
+    "node_modules/chromium-bidi": {
+      "version": "0.4.9",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.9.tgz",
+      "integrity": "sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==",
+      "dev": true,
+      "dependencies": {
+        "mitt": "3.0.0"
+      },
+      "peerDependencies": {
+        "devtools-protocol": "*"
+      }
+    },
     "node_modules/ci-info": {
       "version": "3.8.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
@@ -8673,6 +9072,15 @@
       "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
       "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
     },
+    "node_modules/cross-fetch": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
+      "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
+      "dev": true,
+      "dependencies": {
+        "node-fetch": "^2.6.11"
+      }
+    },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -9366,17 +9774,17 @@
       }
     },
     "node_modules/devtools": {
-      "version": "8.10.7",
-      "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
-      "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.11.0.tgz",
+      "integrity": "sha512-j1wXFQyjswJ6doAV1+h4Bxl8+Oeb8SMpWTpBVa0DurGsxfft8sU2OhDlMo5tx/zbX82X5sGyJDMnKHqBJ2XRvQ==",
       "dev": true,
       "dependencies": {
         "@types/node": "^20.1.0",
-        "@wdio/config": "8.10.7",
-        "@wdio/logger": "8.10.6",
-        "@wdio/protocols": "8.10.2",
+        "@wdio/config": "8.11.0",
+        "@wdio/logger": "8.11.0",
+        "@wdio/protocols": "8.11.0",
         "@wdio/types": "8.10.4",
-        "@wdio/utils": "8.10.7",
+        "@wdio/utils": "8.11.0",
         "chrome-launcher": "^0.15.0",
         "edge-paths": "^3.0.5",
         "import-meta-resolve": "^3.0.0",
@@ -9391,11 +9799,179 @@
       }
     },
     "node_modules/devtools-protocol": {
-      "version": "0.0.1149535",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
-      "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+      "version": "0.0.1152884",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1152884.tgz",
+      "integrity": "sha512-9eP6OmCoU1cWArpXLuzyZQcBJ2PkINOh8Nwx8W5i8u6NDigDE5/mPlLLBAfshwn5YVvIz6ZQ9jbs0PZvKGccdQ==",
+      "dev": true
+    },
+    "node_modules/devtools/node_modules/@wdio/config": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.11.0.tgz",
+      "integrity": "sha512-nBQXsXbPCjddtI/3rAK5yFs3eD3f0T3lZMivweTkLLR7GKBxGjiFoBjXtfqUrHJYa+2uwfXrwxo6y+dA6fVbuw==",
+      "dev": true,
+      "dependencies": {
+        "@wdio/logger": "8.11.0",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.11.0",
+        "decamelize": "^6.0.0",
+        "deepmerge-ts": "^5.0.0",
+        "glob": "^10.2.2",
+        "import-meta-resolve": "^3.0.0",
+        "read-pkg-up": "^9.1.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/devtools/node_modules/@wdio/logger": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
+      "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^5.1.2",
+        "loglevel": "^1.6.0",
+        "loglevel-plugin-prefix": "^0.8.4",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/devtools/node_modules/@wdio/protocols": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.11.0.tgz",
+      "integrity": "sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==",
       "dev": true
     },
+    "node_modules/devtools/node_modules/@wdio/utils": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.11.0.tgz",
+      "integrity": "sha512-XBl1zalk5UPu8QKZ7LZIA82Ad363fpNHZHP5uI5OxUFnk4ZPWgY9eCWpeD+4f9a0DS0w2Dro15E4PORNX84pIw==",
+      "dev": true,
+      "dependencies": {
+        "@wdio/logger": "8.11.0",
+        "@wdio/types": "8.10.4",
+        "import-meta-resolve": "^3.0.0",
+        "p-iteration": "^1.1.8"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/devtools/node_modules/ansi-regex": {
+      "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"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/devtools/node_modules/chalk": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+      "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+      "dev": true,
+      "engines": {
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/devtools/node_modules/foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/devtools/node_modules/glob": {
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz",
+      "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==",
+      "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.0.3",
+        "minimatch": "^9.0.1",
+        "minipass": "^5.0.0 || ^6.0.2",
+        "path-scurry": "^1.7.0"
+      },
+      "bin": {
+        "glob": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/devtools/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/devtools/node_modules/minipass": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+      "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/devtools/node_modules/signal-exit": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+      "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/devtools/node_modules/strip-ansi": {
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
     "node_modules/devtools/node_modules/which": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
@@ -9507,11 +10083,14 @@
       }
     },
     "node_modules/dotenv": {
-      "version": "16.0.3",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
-      "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+      "version": "16.1.4",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz",
+      "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==",
       "engines": {
         "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/motdotla/dotenv?sponsor=1"
       }
     },
     "node_modules/download": {
@@ -11513,9 +12092,9 @@
       }
     },
     "node_modules/expect-webdriverio": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.2.3.tgz",
-      "integrity": "sha512-B5y5NYVUWHQGbMiBzH8UBHcGTHhwu13o4/uUZEpc1wmJk2JxWP7fNpmpkUyiW5yygb2Sp0/02ds4b/xw6sBR/A==",
+      "version": "4.2.6",
+      "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.2.6.tgz",
+      "integrity": "sha512-/7wImWgef6ooZSoivXq6jkCDE1vvDC42WcM7Iyguspah/h384nprUdpQPLIUkkvTCorSQdYtRftNvHJjEpVUmA==",
       "dev": true,
       "dependencies": {
         "expect": "^29.5.0",
@@ -15058,9 +15637,9 @@
       "dev": true
     },
     "node_modules/lit": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.4.tgz",
-      "integrity": "sha512-cgD7xrZoYr21mbrkZIuIrj98YTMw/snJPg52deWVV4A8icLyNHI3bF70xsJeAgwTuiq5Kkd+ZR8gybSJDCPB7g==",
+      "version": "2.7.5",
+      "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.5.tgz",
+      "integrity": "sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==",
       "dependencies": {
         "@lit/reactive-element": "^1.6.0",
         "lit-element": "^3.3.0",
@@ -18507,27 +19086,6 @@
         }
       }
     },
-    "node_modules/puppeteer-core/node_modules/chromium-bidi": {
-      "version": "0.4.9",
-      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.9.tgz",
-      "integrity": "sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==",
-      "dev": true,
-      "dependencies": {
-        "mitt": "3.0.0"
-      },
-      "peerDependencies": {
-        "devtools-protocol": "*"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/cross-fetch": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
-      "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
-      "dev": true,
-      "dependencies": {
-        "node-fetch": "^2.6.11"
-      }
-    },
     "node_modules/puppeteer-core/node_modules/devtools-protocol": {
       "version": "0.0.1120988",
       "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1120988.tgz",
@@ -21332,15 +21890,15 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
-      "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz",
+      "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==",
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
       },
       "engines": {
-        "node": ">=12.20"
+        "node": ">=14.17"
       }
     },
     "node_modules/ua-parser-js": {
@@ -22755,24 +23313,24 @@
       }
     },
     "node_modules/webdriverio": {
-      "version": "8.10.7",
-      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
-      "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+      "version": "8.11.2",
+      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.11.2.tgz",
+      "integrity": "sha512-e/9WkdNTfWeoaSo2UzK0Giec/nQX3i7U9J8esimhozH/EpwSqIaEJ2pRRlxRVafEhe2OBG1QDhnLnDjdCC5Hxg==",
       "dev": true,
       "dependencies": {
         "@types/node": "^20.1.0",
-        "@wdio/config": "8.10.7",
-        "@wdio/logger": "8.10.6",
-        "@wdio/protocols": "8.10.2",
+        "@wdio/config": "8.11.0",
+        "@wdio/logger": "8.11.0",
+        "@wdio/protocols": "8.11.0",
         "@wdio/repl": "8.10.1",
         "@wdio/types": "8.10.4",
-        "@wdio/utils": "8.10.7",
+        "@wdio/utils": "8.11.0",
         "archiver": "^5.0.0",
         "aria-query": "^5.0.0",
         "css-shorthand-properties": "^1.1.1",
         "css-value": "^0.0.1",
-        "devtools": "8.10.7",
-        "devtools-protocol": "^0.0.1149535",
+        "devtools": "8.11.0",
+        "devtools-protocol": "^0.0.1152884",
         "grapheme-splitter": "^1.0.2",
         "import-meta-resolve": "^3.0.0",
         "is-plain-obj": "^4.1.0",
@@ -22784,12 +23342,129 @@
         "resq": "^1.9.1",
         "rgb2hex": "0.2.5",
         "serialize-error": "^8.0.0",
-        "webdriver": "8.10.7"
+        "webdriver": "8.11.1"
       },
       "engines": {
         "node": "^16.13 || >=18"
       }
     },
+    "node_modules/webdriverio/node_modules/@wdio/config": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.11.0.tgz",
+      "integrity": "sha512-nBQXsXbPCjddtI/3rAK5yFs3eD3f0T3lZMivweTkLLR7GKBxGjiFoBjXtfqUrHJYa+2uwfXrwxo6y+dA6fVbuw==",
+      "dev": true,
+      "dependencies": {
+        "@wdio/logger": "8.11.0",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.11.0",
+        "decamelize": "^6.0.0",
+        "deepmerge-ts": "^5.0.0",
+        "glob": "^10.2.2",
+        "import-meta-resolve": "^3.0.0",
+        "read-pkg-up": "^9.1.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/webdriverio/node_modules/@wdio/logger": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
+      "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^5.1.2",
+        "loglevel": "^1.6.0",
+        "loglevel-plugin-prefix": "^0.8.4",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/webdriverio/node_modules/@wdio/protocols": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.11.0.tgz",
+      "integrity": "sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==",
+      "dev": true
+    },
+    "node_modules/webdriverio/node_modules/@wdio/utils": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.11.0.tgz",
+      "integrity": "sha512-XBl1zalk5UPu8QKZ7LZIA82Ad363fpNHZHP5uI5OxUFnk4ZPWgY9eCWpeD+4f9a0DS0w2Dro15E4PORNX84pIw==",
+      "dev": true,
+      "dependencies": {
+        "@wdio/logger": "8.11.0",
+        "@wdio/types": "8.10.4",
+        "import-meta-resolve": "^3.0.0",
+        "p-iteration": "^1.1.8"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
+    "node_modules/webdriverio/node_modules/ansi-regex": {
+      "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"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/webdriverio/node_modules/chalk": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+      "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+      "dev": true,
+      "engines": {
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/webdriverio/node_modules/foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/webdriverio/node_modules/glob": {
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz",
+      "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==",
+      "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.0.3",
+        "minimatch": "^9.0.1",
+        "minipass": "^5.0.0 || ^6.0.2",
+        "path-scurry": "^1.7.0"
+      },
+      "bin": {
+        "glob": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/webdriverio/node_modules/is-plain-obj": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
@@ -22817,6 +23492,64 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/webdriverio/node_modules/minipass": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+      "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/webdriverio/node_modules/signal-exit": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+      "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/webdriverio/node_modules/strip-ansi": {
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/webdriverio/node_modules/webdriver": {
+      "version": "8.11.1",
+      "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.11.1.tgz",
+      "integrity": "sha512-hSpUZYzUA65t4DDtKujCHUX6hpFTUleb7lWMcf5xjPz8sxWrK9R8NIw7pXt/GU6PVS331nGAaYkzoXrqz2VB8w==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "^20.1.0",
+        "@types/ws": "^8.5.3",
+        "@wdio/config": "8.11.0",
+        "@wdio/logger": "8.11.0",
+        "@wdio/protocols": "8.11.0",
+        "@wdio/types": "8.10.4",
+        "@wdio/utils": "8.11.0",
+        "deepmerge-ts": "^5.0.0",
+        "got": "^ 12.6.1",
+        "ky": "^0.33.0",
+        "ws": "^8.8.0"
+      },
+      "engines": {
+        "node": "^16.13 || >=18"
+      }
+    },
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -22870,15 +23603,15 @@
       }
     },
     "node_modules/webpack-cli": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz",
-      "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==",
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
+      "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
       "dev": true,
       "dependencies": {
         "@discoveryjs/json-ext": "^0.5.0",
-        "@webpack-cli/configtest": "^2.1.0",
-        "@webpack-cli/info": "^2.0.1",
-        "@webpack-cli/serve": "^2.0.4",
+        "@webpack-cli/configtest": "^2.1.1",
+        "@webpack-cli/info": "^2.0.2",
+        "@webpack-cli/serve": "^2.0.5",
         "colorette": "^2.0.14",
         "commander": "^10.0.1",
         "cross-spawn": "^7.0.3",
@@ -27141,9 +27874,9 @@
       "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
     },
     "@types/node": {
-      "version": "20.2.5",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz",
-      "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ=="
+      "version": "20.3.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz",
+      "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ=="
     },
     "@types/node-fetch": {
       "version": "2.6.3",
@@ -27321,58 +28054,25 @@
       }
     },
     "@typescript-eslint/parser": {
-      "version": "5.59.7",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz",
-      "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==",
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz",
+      "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "5.59.7",
-        "@typescript-eslint/types": "5.59.7",
-        "@typescript-eslint/typescript-estree": "5.59.7",
+        "@typescript-eslint/scope-manager": "5.59.9",
+        "@typescript-eslint/types": "5.59.9",
+        "@typescript-eslint/typescript-estree": "5.59.9",
         "debug": "^4.3.4"
-      },
-      "dependencies": {
-        "@typescript-eslint/scope-manager": {
-          "version": "5.59.7",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz",
-          "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==",
-          "dev": true,
-          "requires": {
-            "@typescript-eslint/types": "5.59.7",
-            "@typescript-eslint/visitor-keys": "5.59.7"
-          }
-        },
-        "@typescript-eslint/types": {
-          "version": "5.59.7",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz",
-          "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==",
-          "dev": true
-        },
-        "@typescript-eslint/typescript-estree": {
-          "version": "5.59.7",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz",
-          "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==",
-          "dev": true,
-          "requires": {
-            "@typescript-eslint/types": "5.59.7",
-            "@typescript-eslint/visitor-keys": "5.59.7",
-            "debug": "^4.3.4",
-            "globby": "^11.1.0",
-            "is-glob": "^4.0.3",
-            "semver": "^7.3.7",
-            "tsutils": "^3.21.0"
-          }
-        },
-        "@typescript-eslint/visitor-keys": {
-          "version": "5.59.7",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz",
-          "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==",
-          "dev": true,
-          "requires": {
-            "@typescript-eslint/types": "5.59.7",
-            "eslint-visitor-keys": "^3.3.0"
-          }
-        }
+      }
+    },
+    "@typescript-eslint/scope-manager": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz",
+      "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.59.9",
+        "@typescript-eslint/visitor-keys": "5.59.9"
       }
     },
     "@typescript-eslint/type-utils": {
@@ -27420,6 +28120,27 @@
         }
       }
     },
+    "@typescript-eslint/types": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz",
+      "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz",
+      "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.59.9",
+        "@typescript-eslint/visitor-keys": "5.59.9",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      }
+    },
     "@typescript-eslint/utils": {
       "version": "5.59.7",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz",
@@ -27479,6 +28200,16 @@
         }
       }
     },
+    "@typescript-eslint/visitor-keys": {
+      "version": "5.59.9",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz",
+      "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.59.9",
+        "eslint-visitor-keys": "^3.3.0"
+      }
+    },
     "@vanilla-extract/babel-plugin-debug-ids": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.3.tgz",
@@ -28249,6 +28980,91 @@
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
           "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
           "dev": true
+        },
+        "devtools": {
+          "version": "8.10.7",
+          "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
+          "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+          "dev": true,
+          "requires": {
+            "@types/node": "^20.1.0",
+            "@wdio/config": "8.10.7",
+            "@wdio/logger": "8.10.6",
+            "@wdio/protocols": "8.10.2",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.10.7",
+            "chrome-launcher": "^0.15.0",
+            "edge-paths": "^3.0.5",
+            "import-meta-resolve": "^3.0.0",
+            "puppeteer-core": "20.3.0",
+            "query-selector-shadow-dom": "^1.0.0",
+            "ua-parser-js": "^1.0.1",
+            "uuid": "^9.0.0",
+            "which": "^3.0.0"
+          }
+        },
+        "devtools-protocol": {
+          "version": "0.0.1149535",
+          "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
+          "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+          "dev": true
+        },
+        "is-plain-obj": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+          "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+          "dev": true
+        },
+        "minimatch": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+          "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "webdriverio": {
+          "version": "8.10.7",
+          "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
+          "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+          "dev": true,
+          "requires": {
+            "@types/node": "^20.1.0",
+            "@wdio/config": "8.10.7",
+            "@wdio/logger": "8.10.6",
+            "@wdio/protocols": "8.10.2",
+            "@wdio/repl": "8.10.1",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.10.7",
+            "archiver": "^5.0.0",
+            "aria-query": "^5.0.0",
+            "css-shorthand-properties": "^1.1.1",
+            "css-value": "^0.0.1",
+            "devtools": "8.10.7",
+            "devtools-protocol": "^0.0.1149535",
+            "grapheme-splitter": "^1.0.2",
+            "import-meta-resolve": "^3.0.0",
+            "is-plain-obj": "^4.1.0",
+            "lodash.clonedeep": "^4.5.0",
+            "lodash.zip": "^4.2.0",
+            "minimatch": "^9.0.0",
+            "puppeteer-core": "20.3.0",
+            "query-selector-shadow-dom": "^1.0.0",
+            "resq": "^1.9.1",
+            "rgb2hex": "0.2.5",
+            "serialize-error": "^8.0.0",
+            "webdriver": "8.10.7"
+          }
+        },
+        "which": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+          "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
         }
       }
     },
@@ -28322,6 +29138,99 @@
       "requires": {
         "expect-webdriverio": "^4.0.1",
         "webdriverio": "8.10.7"
+      },
+      "dependencies": {
+        "devtools": {
+          "version": "8.10.7",
+          "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
+          "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "@types/node": "^20.1.0",
+            "@wdio/config": "8.10.7",
+            "@wdio/logger": "8.10.6",
+            "@wdio/protocols": "8.10.2",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.10.7",
+            "chrome-launcher": "^0.15.0",
+            "edge-paths": "^3.0.5",
+            "import-meta-resolve": "^3.0.0",
+            "puppeteer-core": "20.3.0",
+            "query-selector-shadow-dom": "^1.0.0",
+            "ua-parser-js": "^1.0.1",
+            "uuid": "^9.0.0",
+            "which": "^3.0.0"
+          }
+        },
+        "devtools-protocol": {
+          "version": "0.0.1149535",
+          "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
+          "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+          "dev": true,
+          "optional": true
+        },
+        "is-plain-obj": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+          "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+          "dev": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+          "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "webdriverio": {
+          "version": "8.10.7",
+          "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
+          "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "@types/node": "^20.1.0",
+            "@wdio/config": "8.10.7",
+            "@wdio/logger": "8.10.6",
+            "@wdio/protocols": "8.10.2",
+            "@wdio/repl": "8.10.1",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.10.7",
+            "archiver": "^5.0.0",
+            "aria-query": "^5.0.0",
+            "css-shorthand-properties": "^1.1.1",
+            "css-value": "^0.0.1",
+            "devtools": "8.10.7",
+            "devtools-protocol": "^0.0.1149535",
+            "grapheme-splitter": "^1.0.2",
+            "import-meta-resolve": "^3.0.0",
+            "is-plain-obj": "^4.1.0",
+            "lodash.clonedeep": "^4.5.0",
+            "lodash.zip": "^4.2.0",
+            "minimatch": "^9.0.0",
+            "puppeteer-core": "20.3.0",
+            "query-selector-shadow-dom": "^1.0.0",
+            "resq": "^1.9.1",
+            "rgb2hex": "0.2.5",
+            "serialize-error": "^8.0.0",
+            "webdriver": "8.10.7"
+          }
+        },
+        "which": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+          "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
       }
     },
     "@wdio/local-runner": {
@@ -28405,17 +29314,52 @@
       }
     },
     "@wdio/reporter": {
-      "version": "8.10.6",
-      "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.10.6.tgz",
-      "integrity": "sha512-dJFzhO4bZJLNgk+V4NYuZcugDjW3vJzL0gmThWwLAxfui5dXKJeVBL96ZnvBLcHSAK4rVx1+KdCI3M26rpOS8w==",
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.11.0.tgz",
+      "integrity": "sha512-eNQxzaTzouyCGRT8ljSzdOf5oJnQxgiKwOs9Cw/j4r5eqd5JQs+GCFP6tFVNjGtPpVIbfsfTb7yI+xmvjNRXhw==",
       "dev": true,
       "requires": {
         "@types/node": "^20.1.0",
-        "@wdio/logger": "8.10.6",
+        "@wdio/logger": "8.11.0",
         "@wdio/types": "8.10.4",
         "diff": "^5.0.0",
         "object-inspect": "^1.12.0",
         "supports-color": "9.3.1"
+      },
+      "dependencies": {
+        "@wdio/logger": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
+          "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
+          "dev": true,
+          "requires": {
+            "chalk": "^5.1.2",
+            "loglevel": "^1.6.0",
+            "loglevel-plugin-prefix": "^0.8.4",
+            "strip-ansi": "^7.1.0"
+          }
+        },
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+          "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+          "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^6.0.1"
+          }
+        }
       }
     },
     "@wdio/runner": {
@@ -28435,15 +29379,102 @@
         "gaze": "^1.1.2",
         "webdriver": "8.10.7",
         "webdriverio": "8.10.7"
+      },
+      "dependencies": {
+        "devtools": {
+          "version": "8.10.7",
+          "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
+          "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+          "dev": true,
+          "requires": {
+            "@types/node": "^20.1.0",
+            "@wdio/config": "8.10.7",
+            "@wdio/logger": "8.10.6",
+            "@wdio/protocols": "8.10.2",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.10.7",
+            "chrome-launcher": "^0.15.0",
+            "edge-paths": "^3.0.5",
+            "import-meta-resolve": "^3.0.0",
+            "puppeteer-core": "20.3.0",
+            "query-selector-shadow-dom": "^1.0.0",
+            "ua-parser-js": "^1.0.1",
+            "uuid": "^9.0.0",
+            "which": "^3.0.0"
+          }
+        },
+        "devtools-protocol": {
+          "version": "0.0.1149535",
+          "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
+          "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+          "dev": true
+        },
+        "is-plain-obj": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+          "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+          "dev": true
+        },
+        "minimatch": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+          "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "webdriverio": {
+          "version": "8.10.7",
+          "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
+          "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+          "dev": true,
+          "requires": {
+            "@types/node": "^20.1.0",
+            "@wdio/config": "8.10.7",
+            "@wdio/logger": "8.10.6",
+            "@wdio/protocols": "8.10.2",
+            "@wdio/repl": "8.10.1",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.10.7",
+            "archiver": "^5.0.0",
+            "aria-query": "^5.0.0",
+            "css-shorthand-properties": "^1.1.1",
+            "css-value": "^0.0.1",
+            "devtools": "8.10.7",
+            "devtools-protocol": "^0.0.1149535",
+            "grapheme-splitter": "^1.0.2",
+            "import-meta-resolve": "^3.0.0",
+            "is-plain-obj": "^4.1.0",
+            "lodash.clonedeep": "^4.5.0",
+            "lodash.zip": "^4.2.0",
+            "minimatch": "^9.0.0",
+            "puppeteer-core": "20.3.0",
+            "query-selector-shadow-dom": "^1.0.0",
+            "resq": "^1.9.1",
+            "rgb2hex": "0.2.5",
+            "serialize-error": "^8.0.0",
+            "webdriver": "8.10.7"
+          }
+        },
+        "which": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+          "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
       }
     },
     "@wdio/spec-reporter": {
-      "version": "8.10.6",
-      "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.10.6.tgz",
-      "integrity": "sha512-CbdyAY063THUqYnhj+7yr7WLjFYxG++d1AuGdJvYn8CL1/5Wjr3E+EGyofIZs4GtYAJsXH69kNtRO7lwDClvcQ==",
+      "version": "8.11.2",
+      "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.11.2.tgz",
+      "integrity": "sha512-ylhxICgen4eEMXgGBEAN6lYs/UnQ4WUYy2ld/4978vRObXy7pGINz96pIPZHAMn01ENU0+gWr8edwawfZyrqLw==",
       "dev": true,
       "requires": {
-        "@wdio/reporter": "8.10.6",
+        "@wdio/reporter": "8.11.0",
         "@wdio/types": "8.10.4",
         "chalk": "^5.1.2",
         "easy-table": "^1.2.0",
@@ -28631,23 +29662,23 @@
       }
     },
     "@webpack-cli/configtest": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz",
-      "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+      "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
       "dev": true,
       "requires": {}
     },
     "@webpack-cli/info": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz",
-      "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+      "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
       "dev": true,
       "requires": {}
     },
     "@webpack-cli/serve": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz",
-      "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+      "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
       "dev": true,
       "requires": {}
     },
@@ -29926,6 +30957,15 @@
         "tcp-port-used": "^1.0.1"
       }
     },
+    "chromium-bidi": {
+      "version": "0.4.9",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.9.tgz",
+      "integrity": "sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==",
+      "dev": true,
+      "requires": {
+        "mitt": "3.0.0"
+      }
+    },
     "ci-info": {
       "version": "3.8.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
@@ -30303,6 +31343,15 @@
       "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
       "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
     },
+    "cross-fetch": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
+      "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
+      "dev": true,
+      "requires": {
+        "node-fetch": "^2.6.11"
+      }
+    },
     "cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -30823,17 +31872,17 @@
       }
     },
     "devtools": {
-      "version": "8.10.7",
-      "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.10.7.tgz",
-      "integrity": "sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==",
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.11.0.tgz",
+      "integrity": "sha512-j1wXFQyjswJ6doAV1+h4Bxl8+Oeb8SMpWTpBVa0DurGsxfft8sU2OhDlMo5tx/zbX82X5sGyJDMnKHqBJ2XRvQ==",
       "dev": true,
       "requires": {
         "@types/node": "^20.1.0",
-        "@wdio/config": "8.10.7",
-        "@wdio/logger": "8.10.6",
-        "@wdio/protocols": "8.10.2",
+        "@wdio/config": "8.11.0",
+        "@wdio/logger": "8.11.0",
+        "@wdio/protocols": "8.11.0",
         "@wdio/types": "8.10.4",
-        "@wdio/utils": "8.10.7",
+        "@wdio/utils": "8.11.0",
         "chrome-launcher": "^0.15.0",
         "edge-paths": "^3.0.5",
         "import-meta-resolve": "^3.0.0",
@@ -30844,6 +31893,117 @@
         "which": "^3.0.0"
       },
       "dependencies": {
+        "@wdio/config": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.11.0.tgz",
+          "integrity": "sha512-nBQXsXbPCjddtI/3rAK5yFs3eD3f0T3lZMivweTkLLR7GKBxGjiFoBjXtfqUrHJYa+2uwfXrwxo6y+dA6fVbuw==",
+          "dev": true,
+          "requires": {
+            "@wdio/logger": "8.11.0",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.11.0",
+            "decamelize": "^6.0.0",
+            "deepmerge-ts": "^5.0.0",
+            "glob": "^10.2.2",
+            "import-meta-resolve": "^3.0.0",
+            "read-pkg-up": "^9.1.0"
+          }
+        },
+        "@wdio/logger": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
+          "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
+          "dev": true,
+          "requires": {
+            "chalk": "^5.1.2",
+            "loglevel": "^1.6.0",
+            "loglevel-plugin-prefix": "^0.8.4",
+            "strip-ansi": "^7.1.0"
+          }
+        },
+        "@wdio/protocols": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.11.0.tgz",
+          "integrity": "sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==",
+          "dev": true
+        },
+        "@wdio/utils": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.11.0.tgz",
+          "integrity": "sha512-XBl1zalk5UPu8QKZ7LZIA82Ad363fpNHZHP5uI5OxUFnk4ZPWgY9eCWpeD+4f9a0DS0w2Dro15E4PORNX84pIw==",
+          "dev": true,
+          "requires": {
+            "@wdio/logger": "8.11.0",
+            "@wdio/types": "8.10.4",
+            "import-meta-resolve": "^3.0.0",
+            "p-iteration": "^1.1.8"
+          }
+        },
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+          "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+          "dev": true
+        },
+        "foreground-child": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+          "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "signal-exit": "^4.0.1"
+          }
+        },
+        "glob": {
+          "version": "10.2.7",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz",
+          "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==",
+          "dev": true,
+          "requires": {
+            "foreground-child": "^3.1.0",
+            "jackspeak": "^2.0.3",
+            "minimatch": "^9.0.1",
+            "minipass": "^5.0.0 || ^6.0.2",
+            "path-scurry": "^1.7.0"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+          "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "minipass": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+          "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
+          "dev": true
+        },
+        "signal-exit": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+          "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+          "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^6.0.1"
+          }
+        },
         "which": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
@@ -30856,9 +32016,9 @@
       }
     },
     "devtools-protocol": {
-      "version": "0.0.1149535",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1149535.tgz",
-      "integrity": "sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==",
+      "version": "0.0.1152884",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1152884.tgz",
+      "integrity": "sha512-9eP6OmCoU1cWArpXLuzyZQcBJ2PkINOh8Nwx8W5i8u6NDigDE5/mPlLLBAfshwn5YVvIz6ZQ9jbs0PZvKGccdQ==",
       "dev": true
     },
     "diff": {
@@ -30927,9 +32087,9 @@
       }
     },
     "dotenv": {
-      "version": "16.0.3",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
-      "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
+      "version": "16.1.4",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz",
+      "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw=="
     },
     "download": {
       "version": "8.0.0",
@@ -32373,9 +33533,9 @@
       }
     },
     "expect-webdriverio": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.2.3.tgz",
-      "integrity": "sha512-B5y5NYVUWHQGbMiBzH8UBHcGTHhwu13o4/uUZEpc1wmJk2JxWP7fNpmpkUyiW5yygb2Sp0/02ds4b/xw6sBR/A==",
+      "version": "4.2.6",
+      "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.2.6.tgz",
+      "integrity": "sha512-/7wImWgef6ooZSoivXq6jkCDE1vvDC42WcM7Iyguspah/h384nprUdpQPLIUkkvTCorSQdYtRftNvHJjEpVUmA==",
       "dev": true,
       "requires": {
         "@wdio/globals": "^8.8.8",
@@ -35053,9 +36213,9 @@
       "dev": true
     },
     "lit": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.4.tgz",
-      "integrity": "sha512-cgD7xrZoYr21mbrkZIuIrj98YTMw/snJPg52deWVV4A8icLyNHI3bF70xsJeAgwTuiq5Kkd+ZR8gybSJDCPB7g==",
+      "version": "2.7.5",
+      "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.5.tgz",
+      "integrity": "sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==",
       "requires": {
         "@lit/reactive-element": "^1.6.0",
         "lit-element": "^3.3.0",
@@ -37506,24 +38666,6 @@
         "ws": "8.13.0"
       },
       "dependencies": {
-        "chromium-bidi": {
-          "version": "0.4.9",
-          "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.9.tgz",
-          "integrity": "sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==",
-          "dev": true,
-          "requires": {
-            "mitt": "3.0.0"
-          }
-        },
-        "cross-fetch": {
-          "version": "3.1.6",
-          "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
-          "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
-          "dev": true,
-          "requires": {
-            "node-fetch": "^2.6.11"
-          }
-        },
         "devtools-protocol": {
           "version": "0.0.1120988",
           "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1120988.tgz",
@@ -39628,9 +40770,9 @@
       }
     },
     "typescript": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
-      "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw=="
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz",
+      "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw=="
     },
     "ua-parser-js": {
       "version": "1.0.35",
@@ -40521,24 +41663,24 @@
       }
     },
     "webdriverio": {
-      "version": "8.10.7",
-      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.10.7.tgz",
-      "integrity": "sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==",
+      "version": "8.11.2",
+      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.11.2.tgz",
+      "integrity": "sha512-e/9WkdNTfWeoaSo2UzK0Giec/nQX3i7U9J8esimhozH/EpwSqIaEJ2pRRlxRVafEhe2OBG1QDhnLnDjdCC5Hxg==",
       "dev": true,
       "requires": {
         "@types/node": "^20.1.0",
-        "@wdio/config": "8.10.7",
-        "@wdio/logger": "8.10.6",
-        "@wdio/protocols": "8.10.2",
+        "@wdio/config": "8.11.0",
+        "@wdio/logger": "8.11.0",
+        "@wdio/protocols": "8.11.0",
         "@wdio/repl": "8.10.1",
         "@wdio/types": "8.10.4",
-        "@wdio/utils": "8.10.7",
+        "@wdio/utils": "8.11.0",
         "archiver": "^5.0.0",
         "aria-query": "^5.0.0",
         "css-shorthand-properties": "^1.1.1",
         "css-value": "^0.0.1",
-        "devtools": "8.10.7",
-        "devtools-protocol": "^0.0.1149535",
+        "devtools": "8.11.0",
+        "devtools-protocol": "^0.0.1152884",
         "grapheme-splitter": "^1.0.2",
         "import-meta-resolve": "^3.0.0",
         "is-plain-obj": "^4.1.0",
@@ -40550,9 +41692,90 @@
         "resq": "^1.9.1",
         "rgb2hex": "0.2.5",
         "serialize-error": "^8.0.0",
-        "webdriver": "8.10.7"
+        "webdriver": "8.11.1"
       },
       "dependencies": {
+        "@wdio/config": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.11.0.tgz",
+          "integrity": "sha512-nBQXsXbPCjddtI/3rAK5yFs3eD3f0T3lZMivweTkLLR7GKBxGjiFoBjXtfqUrHJYa+2uwfXrwxo6y+dA6fVbuw==",
+          "dev": true,
+          "requires": {
+            "@wdio/logger": "8.11.0",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.11.0",
+            "decamelize": "^6.0.0",
+            "deepmerge-ts": "^5.0.0",
+            "glob": "^10.2.2",
+            "import-meta-resolve": "^3.0.0",
+            "read-pkg-up": "^9.1.0"
+          }
+        },
+        "@wdio/logger": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
+          "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
+          "dev": true,
+          "requires": {
+            "chalk": "^5.1.2",
+            "loglevel": "^1.6.0",
+            "loglevel-plugin-prefix": "^0.8.4",
+            "strip-ansi": "^7.1.0"
+          }
+        },
+        "@wdio/protocols": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.11.0.tgz",
+          "integrity": "sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==",
+          "dev": true
+        },
+        "@wdio/utils": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.11.0.tgz",
+          "integrity": "sha512-XBl1zalk5UPu8QKZ7LZIA82Ad363fpNHZHP5uI5OxUFnk4ZPWgY9eCWpeD+4f9a0DS0w2Dro15E4PORNX84pIw==",
+          "dev": true,
+          "requires": {
+            "@wdio/logger": "8.11.0",
+            "@wdio/types": "8.10.4",
+            "import-meta-resolve": "^3.0.0",
+            "p-iteration": "^1.1.8"
+          }
+        },
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+          "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+          "dev": true
+        },
+        "foreground-child": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+          "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "signal-exit": "^4.0.1"
+          }
+        },
+        "glob": {
+          "version": "10.2.7",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz",
+          "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==",
+          "dev": true,
+          "requires": {
+            "foreground-child": "^3.1.0",
+            "jackspeak": "^2.0.3",
+            "minimatch": "^9.0.1",
+            "minipass": "^5.0.0 || ^6.0.2",
+            "path-scurry": "^1.7.0"
+          }
+        },
         "is-plain-obj": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
@@ -40567,6 +41790,46 @@
           "requires": {
             "brace-expansion": "^2.0.1"
           }
+        },
+        "minipass": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+          "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
+          "dev": true
+        },
+        "signal-exit": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+          "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+          "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^6.0.1"
+          }
+        },
+        "webdriver": {
+          "version": "8.11.1",
+          "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.11.1.tgz",
+          "integrity": "sha512-hSpUZYzUA65t4DDtKujCHUX6hpFTUleb7lWMcf5xjPz8sxWrK9R8NIw7pXt/GU6PVS331nGAaYkzoXrqz2VB8w==",
+          "dev": true,
+          "requires": {
+            "@types/node": "^20.1.0",
+            "@types/ws": "^8.5.3",
+            "@wdio/config": "8.11.0",
+            "@wdio/logger": "8.11.0",
+            "@wdio/protocols": "8.11.0",
+            "@wdio/types": "8.10.4",
+            "@wdio/utils": "8.11.0",
+            "deepmerge-ts": "^5.0.0",
+            "got": "^ 12.6.1",
+            "ky": "^0.33.0",
+            "ws": "^8.8.0"
+          }
         }
       }
     },
@@ -40608,15 +41871,15 @@
       }
     },
     "webpack-cli": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz",
-      "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==",
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
+      "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
       "dev": true,
       "requires": {
         "@discoveryjs/json-ext": "^0.5.0",
-        "@webpack-cli/configtest": "^2.1.0",
-        "@webpack-cli/info": "^2.0.1",
-        "@webpack-cli/serve": "^2.0.4",
+        "@webpack-cli/configtest": "^2.1.1",
+        "@webpack-cli/info": "^2.0.2",
+        "@webpack-cli/serve": "^2.0.5",
         "colorette": "^2.0.14",
         "commander": "^10.0.1",
         "cross-spawn": "^7.0.3",
diff --git a/package.json b/package.json
index 355eb4ce..67057723 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "runme",
-  "version": "1.5.2-edge.1",
+  "version": "1.5.3",
   "publisher": "stateful",
   "displayName": "Runme",
   "description": "Execute commands inside your runbooks, docs, and READMEs.",
@@ -313,6 +313,11 @@
             "default": true,
             "markdownDescription": "If enabled, Runme's save restriction on non checked-in files will be lifted."
           },
+          "runme.flags.startFile": {
+            "type": "string",
+            "scope": "window",
+            "markdownDescription": "Relative path to a file within the workspace to open within a Runme notebook view, when VS Code starts (e.g. `./CONTRIBUTING.md`)."
+          },
           "runme.experiments.grpcSerializer": {
             "type": "boolean",
             "scope": "machine",
@@ -425,6 +430,11 @@
             "type": "boolean",
             "default": true,
             "markdownDescription": "Load environment files from workspace into all scripts"
+          },
+          "runme.cli.useIntegratedRunme": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Whether to use full path to integrated runme executable when running CLI commands. This is mostly useful for development purposes."
           }
         }
       }
diff --git a/src/extension/commands/index.ts b/src/extension/commands/index.ts
index c2469222..d35af58f 100644
--- a/src/extension/commands/index.ts
+++ b/src/extension/commands/index.ts
@@ -18,12 +18,21 @@ import {
 } from 'vscode'
 import { v4 as uuidv4 } from 'uuid'
 
-import { getTLSDir, getTLSEnabled, isNotebookTerminalEnabledForCell } from '../../utils/configuration'
+import {
+  getBinaryPath,
+  getCLIUseIntegratedRunme,
+  getTLSDir,
+  getTLSEnabled,
+  isNotebookTerminalEnabledForCell
+} from '../../utils/configuration'
 import { Kernel } from '../kernel'
 import { getAnnotations, getNotebookCategories, getTerminalByCell, openFileAsRunmeNotebook } from '../utils'
 import RunmeServer from '../server/runmeServer'
 import { GrpcRunnerEnvironment } from '../runner'
 import { NotebookToolbarCommand } from '../../types'
+import getLogger from '../logger'
+
+const log = getLogger('Commands')
 
 function showWarningMessage() {
   return window.showWarningMessage('Couldn\'t find terminal! Was it already closed?')
@@ -116,12 +125,38 @@ export function runCLICommand(
   server: RunmeServer,
   kernel: Kernel
 ) {
-  return async function (cell: { metadata?: any, document: TextDocument }) {
+  return async function (cell: NotebookCell) {
+    if (cell.notebook.isDirty) {
+      const option = await window.showInformationMessage(
+        'You have unsaved changes. Save and run in CLI?',
+        'Save',
+        'Cancel'
+      )
+
+      if (option === 'Cancel' || !option) {
+        return
+      }
+
+      await cell.notebook.save()
+    }
+
     const cwd = path.dirname(cell.document.uri.fsPath)
 
+    const index = cell.notebook.getCells()
+      .filter(x => x.kind === NotebookCellKind.Code)
+      .indexOf(cell)
+
+    if (index < 0) {
+      window.showErrorMessage('Internal error identifying cell index')
+      log.error(`Failed getting code cell index for cell at index ${cell.index}`)
+
+      return
+    }
+
     const args = [
       `--chdir="${cwd}"`,
-      `--filename="${path.basename(cell.document.uri.fsPath)}"`
+      `--filename="${path.basename(cell.document.uri.fsPath)}"`,
+      `--index=${index}`
     ]
 
     const envs: Record<string, string> = {}
@@ -148,8 +183,10 @@ export function runCLICommand(
       env: envs,
     })
 
+    const runmeExec = getCLIUseIntegratedRunme() ? getBinaryPath(extensionBaseUri, process.platform).fsPath : 'runme'
+
     term.show(false)
-    term.sendText(`runme run ${annotations.name} ${args.join(' ')}`)
+    term.sendText(`${runmeExec} run ${args.join(' ')}`)
   }
 }
 
diff --git a/src/extension/extension.ts b/src/extension/extension.ts
index 96b04e69..c97169d3 100644
--- a/src/extension/extension.ts
+++ b/src/extension/extension.ts
@@ -1,4 +1,4 @@
-import { workspace, notebooks, commands, ExtensionContext, tasks, window, Uri } from 'vscode'
+import { workspace, notebooks, commands, ExtensionContext, tasks, window } from 'vscode'
 import { TelemetryReporter } from 'vscode-telemetry'
 
 import { Serializer } from '../types'
@@ -9,7 +9,7 @@ import RunmeServer from './server/runmeServer'
 import RunmeServerError from './server/runmeServerError'
 import { ToggleTerminalProvider, BackgroundTaskProvider, StopBackgroundTaskProvider } from './provider/background'
 import { CopyProvider } from './provider/copy'
-import { getDefaultWorkspace, resetEnv } from './utils'
+import { getDefaultWorkspace, resetEnv, bootFile } from './utils'
 import { AnnotationsProvider } from './provider/annotations'
 import { RunmeTaskProvider } from './provider/runmeTask'
 import {
@@ -31,7 +31,6 @@ import {
 import { WasmSerializer, GrpcSerializer } from './serializer'
 import { RunmeLauncherProvider } from './provider/launcher'
 import { RunmeUriHandler } from './handler/uri'
-import { BOOTFILE } from './constants'
 import { GrpcRunner, IRunner } from './runner'
 import { CliProvider } from './provider/cli'
 import * as survey from './survey'
@@ -157,16 +156,7 @@ export class RunmeExtension {
       window.registerUriHandler(uriHandler)
     )
 
-    if (workspace.workspaceFolders?.length && workspace.workspaceFolders[0]) {
-      const startupFileUri = Uri.joinPath(workspace.workspaceFolders[0].uri, BOOTFILE)
-      const hasStartupFile = await workspace.fs.stat(startupFileUri).then(() => true, () => false)
-      if (hasStartupFile) {
-        const bootFile = new TextDecoder().decode(await workspace.fs.readFile(startupFileUri))
-        const bootFileUri = Uri.joinPath(workspace.workspaceFolders[0].uri, bootFile)
-        await workspace.fs.delete(startupFileUri)
-        await commands.executeCommand('vscode.openWith', bootFileUri, Kernel.type)
-      }
-    }
+    await bootFile()
   }
 
   static registerCommand(command: string, callback: (...args: any[]) => any, thisArg?: any) {
diff --git a/src/extension/serializer.ts b/src/extension/serializer.ts
index b4ecbcd2..8ae72841 100644
--- a/src/extension/serializer.ts
+++ b/src/extension/serializer.ts
@@ -48,7 +48,6 @@ export abstract class SerializerBase implements NotebookSerializer, Disposable {
       workspace.onDidChangeNotebookDocument(
         this.handleNotebookChanged.bind(this)
       ),
-      // TODO(mxs): https://github.com/stateful/vscode-runme/issues/566#issuecomment-1574128419
       // workspace.onDidSaveNotebookDocument(
       //   this.handleNotebookSaved.bind(this)
       // )
diff --git a/src/extension/utils.ts b/src/extension/utils.ts
index e0277f59..6712a0a8 100644
--- a/src/extension/utils.ts
+++ b/src/extension/utils.ts
@@ -28,7 +28,7 @@ import { getEnvLoadWorkspaceFiles, getEnvWorkspaceFileOrder, getPortNumber } fro
 import getLogger from './logger'
 import type executor from './executors'
 import { Kernel } from './kernel'
-import { ENV_STORE, DEFAULT_ENV } from './constants'
+import { ENV_STORE, DEFAULT_ENV, BOOTFILE } from './constants'
 
 declare var globalThis: any
 
@@ -446,9 +446,9 @@ export async function setNotebookCategories(context: ExtensionContext, uri: Uri,
 
 /**
  * Get the notebook cell categories from the global state
- * @param context 
- * @param uri 
- * @returns 
+ * @param context
+ * @param uri
+ * @returns
  */
 export async function getNotebookCategories(context: ExtensionContext, uri: Uri): Promise<string[]> {
   const notebooksCategories = context.globalState.get<Record<string, string[]>>(NOTEBOOK_AVAILABLE_CATEGORIES)
@@ -467,3 +467,41 @@ export function getNamespacedMid(namespace: string) {
   const ns = uuidv5(namespace, uuidv5.URL)
   return uuidv5(env.machineId, ns)
 }
+
+/**
+ * Opens a start-up file either defined within a `.runme_bootstrap` file or
+ * set as Runme configuration
+ */
+export async function bootFile() {
+  if (!workspace.workspaceFolders?.length || !workspace.workspaceFolders[0]) {
+    return
+  }
+
+  const startupFileUri = Uri.joinPath(workspace.workspaceFolders[0].uri, BOOTFILE)
+  const hasStartupFile = await workspace.fs.stat(startupFileUri).then(() => true, () => false)
+  if (hasStartupFile) {
+    const bootFile = new TextDecoder().decode(await workspace.fs.readFile(startupFileUri))
+    const bootFileUri = Uri.joinPath(workspace.workspaceFolders[0].uri, bootFile)
+    await workspace.fs.delete(startupFileUri)
+    log.info(`Open file defined in "${BOOTFILE}" file: ${bootFileUri.fsPath}`)
+    return commands.executeCommand('vscode.openWith', bootFileUri, Kernel.type)
+  }
+
+  /**
+   * if config is set, open file path directly
+   */
+  const config = workspace.getConfiguration('runme.flags')
+  const startupFilePath = config.get<string | undefined>('startFile')
+  if (!startupFilePath) {
+    return
+  }
+
+  const startupFileUriConfig = Uri.joinPath(workspace.workspaceFolders[0].uri, startupFilePath)
+  const hasStartupFileConfig = await workspace.fs.stat(startupFileUriConfig).then(() => true, () => false)
+  if (!hasStartupFileConfig) {
+    return
+  }
+
+  log.info(`Open file defined in "runme.flag.startFile" setting: ${startupFileUriConfig.fsPath}`)
+  return commands.executeCommand('vscode.openWith', startupFileUriConfig, Kernel.type)
+}
diff --git a/src/utils/configuration.ts b/src/utils/configuration.ts
index c8a16efa..2e0e994b 100644
--- a/src/utils/configuration.ts
+++ b/src/utils/configuration.ts
@@ -12,6 +12,7 @@ const SERVER_SECTION_NAME = 'runme.server'
 const TERMINAL_SECTION_NAME = 'runme.terminal'
 const CODELENS_SECTION_NAME = 'runme.codelens'
 const ENV_SECTION_NAME = 'runme.env'
+const CLI_SECTION_NAME = 'runme.cli'
 
 export const DEFAULT_TLS_DIR = path.join(os.tmpdir(), 'runme', uuidv4(), 'tls')
 const DEFAULT_WORKSPACE_FILE_ORDER = ['.env.local', '.env']
@@ -52,6 +53,9 @@ const configurationSchema = {
     env: {
       workspaceFileOrder: z.array(z.string()).default(DEFAULT_WORKSPACE_FILE_ORDER),
       loadWorkspaceFiles: z.boolean().default(true),
+    },
+    cli: {
+      useIntegratedRunme: z.boolean().default(false),
     }
 }
 
@@ -95,6 +99,16 @@ const getEnvConfigurationValue = <T>(configName: keyof typeof configurationSchem
   return defaultValue
 }
 
+const getCLIConfigurationValue = <T>(configName: keyof typeof configurationSchema.cli, defaultValue: T) => {
+  const configurationSection = workspace.getConfiguration(CLI_SECTION_NAME)
+  const configurationValue = configurationSection.get<T>(configName)!
+  const parseResult = configurationSchema.cli[configName].safeParse(configurationValue)
+  if (parseResult.success) {
+      return parseResult.data as T
+  }
+  return defaultValue
+}
+
 const getPortNumber = (): number => {
   return SERVER_PORT
 }
@@ -185,6 +199,10 @@ const getEnvLoadWorkspaceFiles = (): boolean => {
   return getEnvConfigurationValue('loadWorkspaceFiles', true)
 }
 
+const getCLIUseIntegratedRunme = (): boolean => {
+  return getCLIConfigurationValue('useIntegratedRunme', false)
+}
+
 export {
     getPortNumber,
     getBinaryPath,
@@ -202,4 +220,5 @@ export {
     getCustomServerAddress,
     getEnvWorkspaceFileOrder,
     getEnvLoadWorkspaceFiles,
+    getCLIUseIntegratedRunme,
 }


Test patch:
diff --git a/tests/extension/commands/index.test.ts b/tests/extension/commands/index.test.ts
index bcacc6d0..32f66380 100644
--- a/tests/extension/commands/index.test.ts
+++ b/tests/extension/commands/index.test.ts
@@ -1,6 +1,6 @@
 import path from 'node:path'
 
-import { beforeEach, expect, test, vi } from 'vitest'
+import { beforeEach, expect, test, vi, suite } from 'vitest'
 import {
   window,
   env,
@@ -28,7 +28,11 @@ import {
   openFileInRunme
 } from '../../../src/extension/commands'
 import { getTerminalByCell, getAnnotations, openFileAsRunmeNotebook } from '../../../src/extension/utils'
-import { getBinaryPath, isNotebookTerminalEnabledForCell } from '../../../src/utils/configuration'
+import {
+  getBinaryPath,
+  getCLIUseIntegratedRunme,
+  isNotebookTerminalEnabledForCell
+} from '../../../src/utils/configuration'
 
 vi.mock('vscode', () => import(path.join(process.cwd(), '__mocks__', 'vscode')))
 vi.mock('vscode-telemetry')
@@ -41,6 +45,7 @@ vi.mock('../../../src/extension/utils', () => ({
 vi.mock('../../../src/utils/configuration', () => ({
   getBinaryPath: vi.fn(),
   isNotebookTerminalEnabledForCell: vi.fn(),
+  getCLIUseIntegratedRunme: vi.fn().mockReturnValue(false),
 }))
 vi.mock('../../../src/extension/provider/cli', () => ({
   CliProvider: {
@@ -106,21 +111,96 @@ test('copyCellToClipboard', () => {
   expect(window.showInformationMessage).toBeCalledTimes(1)
 })
 
-test('runCLICommand', async () => {
-  const cell: any = {
-    metadata: { name: 'foobar' },
-    document: { uri: { fsPath: '/foo/bar/README.md' }}
-  }
-  vi.mocked(getAnnotations).mockReturnValueOnce({
-    name: 'foo-bar',
-  } as any)
-  vi.mocked(getBinaryPath).mockReturnValueOnce(Uri.file('/bin/runme'))
-  vi.mocked(window.showInformationMessage).mockResolvedValueOnce(false as any)
-
-  await runCLICommand({} as any, false, {} as any, {} as any)(cell)
-  expect(vi.mocked((terminal as any).sendText)).toHaveBeenCalledWith(
-    'runme run foo-bar --chdir="/foo/bar" --filename="README.md"'
-  )
+suite('runCliCommand', () => {
+  beforeEach(() => {
+    vi.mocked(getBinaryPath).mockClear()
+    vi.mocked(window.showInformationMessage).mockClear()
+    vi.mocked(getAnnotations).mockClear()
+    vi.mocked(terminal.sendText).mockClear()
+    vi.mocked(getCLIUseIntegratedRunme).mockClear()
+  })
+
+  test('runs command when not dirty, using index', async () => {
+    const cell: any = {
+      metadata: { name: 'foobar' },
+      document: { uri: { fsPath: '/foo/bar/README.md' }},
+      kind: 1
+    }
+
+    cell.notebook = {
+      getCells: () => [cell],
+      isDirty: false
+    }
+
+    // vi.mocked(getAnnotations).mockReturnValueOnce({
+    //   name: 'foo-bar',
+    // } as any)
+
+    // vi.mocked(getBinaryPath).mockReturnValueOnce(Uri.file('/bin/runme'))
+    // vi.mocked(window.showInformationMessage).mockResolvedValueOnce(false as any)
+
+    await runCLICommand({} as any, false, {} as any, {} as any)(cell)
+    expect(vi.mocked((terminal as any).sendText)).toHaveBeenCalledWith(
+      'runme run --chdir="/foo/bar" --filename="README.md" --index=0'
+    )
+  })
+
+  test('uses integrated runme if config set', async () => {
+    const cell: any = {
+      metadata: { name: 'foobar' },
+      document: { uri: { fsPath: '/foo/bar/README.md' }},
+      kind: 1
+    }
+
+    cell.notebook = {
+      getCells: () => [cell],
+      isDirty: false
+    }
+
+    vi.mocked(getBinaryPath).mockReturnValueOnce(Uri.file('/bin/runme'))
+    vi.mocked(getCLIUseIntegratedRunme).mockReturnValueOnce(true)
+
+    await runCLICommand({} as any, false, {} as any, {} as any)(cell)
+    expect(vi.mocked((terminal as any).sendText)).toHaveBeenCalledWith(
+      '/bin/runme run --chdir="/foo/bar" --filename="README.md" --index=0'
+    )
+  })
+
+  test('prompts user when dirty and fails if cancelled or closed', async () => {
+    const cell: any = {
+      metadata: { name: 'foobar' },
+      document: { uri: { fsPath: '/foo/bar/README.md' }},
+      kind: 1
+    }
+
+    cell.notebook = {
+      getCells: () => [cell],
+      isDirty: true,
+      save: vi.fn()
+    }
+
+    // Cancelled
+    vi.mocked(window.showInformationMessage).mockResolvedValueOnce('Cancel' as any)
+    await runCLICommand({} as any, false, {} as any, {} as any)(cell)
+    expect(vi.mocked(terminal.sendText)).not.toHaveBeenCalled()
+
+    vi.mocked(terminal.sendText).mockClear()
+
+    // Closed
+    vi.mocked(window.showInformationMessage).mockResolvedValueOnce(undefined as any)
+    await runCLICommand({} as any, false, {} as any, {} as any)(cell)
+
+    expect(vi.mocked(terminal.sendText)).not.toHaveBeenCalled()
+
+    vi.mocked(terminal.sendText).mockClear()
+
+    // Saved
+    vi.mocked(window.showInformationMessage).mockResolvedValueOnce('Save' as any)
+    await runCLICommand({} as any, false, {} as any, {} as any)(cell)
+
+    expect(vi.mocked(terminal.sendText)).toHaveBeenCalled()
+    expect(cell.notebook.save).toHaveBeenCalledOnce()
+  })
 })
 
 test('open markdown as Runme notebook', (file: NotebookDocument) => {
diff --git a/tests/extension/configuration.test.ts b/tests/extension/configuration.test.ts
index 58220926..f1b1ec93 100644
--- a/tests/extension/configuration.test.ts
+++ b/tests/extension/configuration.test.ts
@@ -12,7 +12,8 @@ import {
   DEFAULT_TLS_DIR,
   getNotebookTerminalFontFamily,
   getNotebookTerminalFontSize,
-  getCodeLensEnabled
+  getCodeLensEnabled,
+  getCLIUseIntegratedRunme
 } from '../../src/utils/configuration'
 import { SERVER_PORT } from '../../src/constants'
 
@@ -150,6 +151,10 @@ suite('Configuration', () => {
       ).toStrictEqual(true)
     })
 
+    test('getCLIUseIntegratexRunme should return false by default', () => {
+      expect(getCLIUseIntegratedRunme()).toStrictEqual(false)
+    })
+
     suite('posix', () => {
       beforeEach(() => {
         platformPathMocks(path.posix)
diff --git a/tests/extension/extension.test.ts b/tests/extension/extension.test.ts
index 33e7f8e4..49129270 100644
--- a/tests/extension/extension.test.ts
+++ b/tests/extension/extension.test.ts
@@ -5,6 +5,7 @@ import {
 } from '@buf/grpc_grpc.community_timostamm-protobuf-ts/grpc/health/v1/health_pb'
 
 import { RunmeExtension } from '../../src/extension/extension'
+import { bootFile } from '../../src/extension/utils'
 import RunmeServer from '../../src/extension/server/runmeServer'
 import { testCertPEM, testPrivKeyPEM } from '../testTLSCert'
 
@@ -38,6 +39,15 @@ vi.mock('../../src/extension/grpc/client', () => {
   })
 })
 
+vi.mock('../../src/extension/utils', async () => ({
+  getDefaultWorkspace: vi.fn(),
+  resetEnv: vi.fn(),
+  initWasm: vi.fn(),
+  getNamespacedMid: vi.fn(),
+  isWindows: vi.fn().mockReturnValue(false),
+  bootFile: vi.fn().mockResolvedValue(undefined)
+}))
+
 vi.mock('../../src/extension/grpc/runnerTypes', () => ({}))
 
 test('initializes all providers', async () => {
@@ -66,8 +76,5 @@ test('initializes all providers', async () => {
   expect(commands.registerCommand).toBeCalledTimes(23)
   expect(window.registerTreeDataProvider).toBeCalledTimes(1)
   expect(window.registerUriHandler).toBeCalledTimes(1)
-
-  expect(commands.executeCommand).toBeCalledWith('vscode.openWith', dummyFilePath, 'runme')
-  expect(workspace.fs.stat).toBeCalledWith(dummyFilePath)
-  expect(workspace.fs.delete).toBeCalledWith(dummyFilePath)
+  expect(bootFile).toBeCalledTimes(1)
 })
diff --git a/tests/extension/utils.test.ts b/tests/extension/utils.test.ts
index ec63d9e3..4c3c3ef7 100644
--- a/tests/extension/utils.test.ts
+++ b/tests/extension/utils.test.ts
@@ -23,7 +23,8 @@ import {
   validateAnnotations,
   setNotebookCategories,
   getNotebookCategories,
-  getNamespacedMid
+  getNamespacedMid,
+  bootFile
 } from '../../src/extension/utils'
 import { ENV_STORE, DEFAULT_ENV } from '../../src/extension/constants'
 import { CellAnnotations } from '../../src/types'
@@ -78,6 +79,10 @@ beforeAll(() => {
   ENV_STORE.delete('PATH')
 })
 afterAll(() => { process.env.PATH = PATH })
+beforeEach(() => {
+  vi.mocked(workspace.getConfiguration).mockClear()
+  vi.mocked(commands.executeCommand).mockClear()
+})
 
 test('isInteractive', () => {
   expect(getAnnotations({ metadata: { interactive: 'true' } } as any).interactive).toBe(true)
@@ -621,3 +626,25 @@ test('getNamespacedMid', () => {
     getNamespacedMid('1836968c0b13822b48750c44bbb356d8ae45bebbd8f990c63b2641092a23ba89')
   ).toBe('af4f113b-0bd0-5d95-ac4c-4d354a9cb84a')
 })
+
+suite('bootFile', () => {
+  test('should prefer boot file before settings', async () => {
+    await bootFile()
+    expect(workspace.getConfiguration).toBeCalledTimes(0)
+  })
+
+  test('should load file defined in settings', async () => {
+    vi.mocked(workspace.getConfiguration).mockReturnValue({
+      get: () => '/foo/Settings.md'
+    } as any)
+    vi.mocked(workspace.fs.stat).mockImplementation(
+      async (uri) => uri.path.endsWith('Settings.md')
+        ? true
+        : Promise.reject(new Error('not existing')) as any
+    )
+    await bootFile()
+    expect(commands.executeCommand).toBeCalledWith('vscode.openWith', expect.objectContaining({
+      path: '/foo/bar/foo/Settings.md'
+    }), 'runme')
+  })
+})