diff --git a/.config/tsaoptions.json b/.config/tsaoptions.json
index a8ae267f03..44c83732fa 100644
--- a/.config/tsaoptions.json
+++ b/.config/tsaoptions.json
@@ -2,7 +2,7 @@
   "instanceUrl": "https://msazure.visualstudio.com",
   "projectName": "One",
   "areaPath": "One\\MGMT\\Compute\\Powershell\\Powershell",
-  "notificationAliases": [ "andschwa@microsoft.com", "slee@microsoft.com" ],
+  "notificationAliases": ["andschwa@microsoft.com", "slee@microsoft.com"],
   "codebaseName": "PowerShell_vscode-powershell_20240328",
-  "tools": [ "CredScan", "PoliCheck", "BinSkim" ]
+  "tools": ["CredScan", "PoliCheck", "BinSkim"]
 }
diff --git a/.editorconfig b/.editorconfig
index 9ad197dff6..31cbf8b559 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -5,6 +5,7 @@ charset = utf-8
 indent_style = space
 indent_size = 4
 insert_final_newline = true
+trim_trailing_whitespace = true
 
 [*.{json,yaml,yml,code-workspace}]
 indent_size = 2
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 369478b085..0000000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "env": {
-    "browser": true,
-    "es2021": true
-  },
-  "extends": [
-    "eslint:recommended",
-    "plugin:@typescript-eslint/stylistic-type-checked",
-    "plugin:@typescript-eslint/strict-type-checked"
-  ],
-  "overrides": [],
-  "parser": "@typescript-eslint/parser",
-  "parserOptions": {
-    "ecmaVersion": "latest",
-    "sourceType": "module",
-    "tsconfigRootDir": ".",
-    "project": true
-  },
-  "plugins": [
-    "@typescript-eslint",
-    "header"
-  ],
-  "rules": {
-    "indent": [
-      "error",
-      4
-    ],
-    "quotes": [
-      "error",
-      "double"
-    ],
-    "semi": [
-      "error",
-      "always"
-    ],
-    "@typescript-eslint/explicit-function-return-type": "error",
-    "@typescript-eslint/no-empty-object-type": "off",
-    "@typescript-eslint/no-floating-promises": [
-      "error",
-      {
-        "ignoreVoid": true
-      }
-    ],
-    "@typescript-eslint/no-non-null-assertion": "off",
-    "@typescript-eslint/no-require-imports": "off",
-    "@typescript-eslint/no-unused-vars": [
-      "error",
-      {
-        "argsIgnorePattern": "^_"
-      }
-    ],
-    "@typescript-eslint/no-unsafe-argument": "off",
-    "@typescript-eslint/no-unsafe-assignment": "off",
-    "@typescript-eslint/no-unsafe-call": "off",
-    "@typescript-eslint/no-unsafe-member-access": "off",
-    "@typescript-eslint/no-unsafe-return": "off",
-    "@typescript-eslint/restrict-template-expressions": "off",
-    "@typescript-eslint/prefer-nullish-coalescing": [
-      "error",
-      {
-        "ignoreConditionalTests": true,
-        "ignoreMixedLogicalExpressions": true
-      }
-    ],
-    "header/header": [
-      2,
-      "line",
-      [
-        " Copyright (c) Microsoft Corporation.",
-        " Licensed under the MIT License."
-      ],
-      2
-    ]
-  }
-}
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 0000000000..d775e01095
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,6 @@
+# Enabled on GitHub automatically
+# Enable this file in your git config:
+# git config blame.ignoreRevsFile .git-blame-ignore-revs
+
+# Prettier reformatting
+f978bae02ad48ddb5f8d4eb21512fe9b17541c5b
diff --git a/.gitattributes b/.gitattributes
index 2a922ee8df..e6caee9a0c 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,8 +3,3 @@
 
 # Set svg to binary type, as SVG is unlikely to be editted by hand. Can be treated as checked in blob
 *.svg binary
-
-# .gitattributes in project root
-# npm now seems to be insisting on LF - see https://github.com/npm/npm/issues/17161
-package.json      text eol=lf
-package-lock.json text eol=lf
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index 42d40f611f..d90459770a 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -2,98 +2,98 @@ name: 🐛 Bug report
 description: Open an issue about a bug that needs fixing.
 labels: ["Issue-Bug", "Needs: Triage"]
 body:
-- type: checkboxes
-  attributes:
-    label: Prerequisites
-    options:
-    - label: I have written a descriptive issue title.
+  - type: checkboxes
+    attributes:
+      label: Prerequisites
+      options:
+        - label: I have written a descriptive issue title.
+          required: true
+        - label: I have searched all [_open and closed_ issues](https://github.com/PowerShell/vscode-powershell/issues?q=is%3Aissue) to ensure it has not already been reported.
+        - label: I have read the [troubleshooting](https://github.com/PowerShell/vscode-powershell/blob/main/docs/troubleshooting.md) guide.
+        - label: I am sure this issue is with the _extension itself_ and does not reproduce in a standalone [PowerShell](https://github.com/PowerShell/PowerShell/issues/new/choose) instance.
+        - label: I have verified that I am using the latest version of Visual Studio Code and the PowerShell extension.
+        - label: If this is a security issue, I have read the [security issue reporting guidance](https://github.com/PowerShell/vscode-powershell/blob/main/SECURITY.md).
+  - type: textarea
+    id: summary
+    attributes:
+      label: Summary
+      description: Explain the problem briefly below.
+      placeholder: I am experiencing a problem with X. I think Y should be happening but Z is actually happening.
+    validations:
       required: true
-    - label: I have searched all [_open and closed_ issues](https://github.com/PowerShell/vscode-powershell/issues?q=is%3Aissue) to ensure it has not already been reported.
-    - label: I have read the [troubleshooting](https://github.com/PowerShell/vscode-powershell/blob/main/docs/troubleshooting.md) guide.
-    - label: I am sure this issue is with the _extension itself_ and does not reproduce in a standalone [PowerShell](https://github.com/PowerShell/PowerShell/issues/new/choose) instance.
-    - label: I have verified that I am using the latest version of Visual Studio Code and the PowerShell extension.
-    - label: If this is a security issue, I have read the [security issue reporting guidance](https://github.com/PowerShell/vscode-powershell/blob/main/SECURITY.md).
-- type: textarea
-  id: summary
-  attributes:
-    label: Summary
-    description: Explain the problem briefly below.
-    placeholder: I am experiencing a problem with X. I think Y should be happening but Z is actually happening.
-  validations:
-    required: true
-- type: textarea
-  id: powershell-version
-  attributes:
-    label: PowerShell Version
-    description: Paste verbatim output from `$PSVersionTable; $Host` below. **Please include `$Host`** so we know this version is from the Extension Terminal!
-    render: console
-    placeholder: |
-      PS> $PSVersionTable; $Host
+  - type: textarea
+    id: powershell-version
+    attributes:
+      label: PowerShell Version
+      description: Paste verbatim output from `$PSVersionTable; $Host` below. **Please include `$Host`** so we know this version is from the Extension Terminal!
+      render: console
+      placeholder: |
+        PS> $PSVersionTable; $Host
 
-      Name                           Value
-      ----                           -----
-      PSVersion                      7.4.0
-      PSEdition                      Core
-      GitCommitId                    7.4.0
-      OS                             Microsoft Windows 10.0.22631
-      Platform                       Win32NT
-      PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
-      PSRemotingProtocolVersion      2.3
-      SerializationVersion           1.1.0.1
-      WSManStackVersion              3.0
+        Name                           Value
+        ----                           -----
+        PSVersion                      7.4.0
+        PSEdition                      Core
+        GitCommitId                    7.4.0
+        OS                             Microsoft Windows 10.0.22631
+        Platform                       Win32NT
+        PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
+        PSRemotingProtocolVersion      2.3
+        SerializationVersion           1.1.0.1
+        WSManStackVersion              3.0
 
-      Name             : Visual Studio Code Host
-      Version          : 2023.11.0
-      InstanceId       : 803ce61b-6187-4574-9c1f-827ebb11b8b6
-      UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
-      CurrentCulture   : en-US
-      CurrentUICulture : en-US
-      PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
-      DebuggerEnabled  : True
-      IsRunspacePushed : False
-      Runspace         : System.Management.Automation.Runspaces.LocalRunspace
-  validations:
-    required: true
-- type: textarea
-  id: vscode-version
-  attributes:
-    label: Visual Studio Code Version
-    description: Paste verbatim output from `code --version` below.
-    render: console
-    placeholder: |
-      PS> code --version
+        Name             : Visual Studio Code Host
+        Version          : 2023.11.0
+        InstanceId       : 803ce61b-6187-4574-9c1f-827ebb11b8b6
+        UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
+        CurrentCulture   : en-US
+        CurrentUICulture : en-US
+        PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
+        DebuggerEnabled  : True
+        IsRunspacePushed : False
+        Runspace         : System.Management.Automation.Runspaces.LocalRunspace
+    validations:
+      required: true
+  - type: textarea
+    id: vscode-version
+    attributes:
+      label: Visual Studio Code Version
+      description: Paste verbatim output from `code --version` below.
+      render: console
+      placeholder: |
+        PS> code --version
 
-      1.57.1
-      507ce72a4466fbb27b715c3722558bb15afa9f48
-      arm64
-  validations:
-    required: true
-- type: textarea
-  id: extension-version
-  attributes:
-    label: Extension Version
-    description: Paste verbatim output from `code --list-extensions --show-versions | Select-String powershell` below.
-    render: console
-    placeholder: |
-      PS> code --list-extensions --show-versions | Select-String powershell
+        1.57.1
+        507ce72a4466fbb27b715c3722558bb15afa9f48
+        arm64
+    validations:
+      required: true
+  - type: textarea
+    id: extension-version
+    attributes:
+      label: Extension Version
+      description: Paste verbatim output from `code --list-extensions --show-versions | Select-String powershell` below.
+      render: console
+      placeholder: |
+        PS> code --list-extensions --show-versions | Select-String powershell
 
-      ms-vscode.powershell@2021.8.0
-  validations:
-    required: true
-- type: textarea
-  id: steps-to-reproduce
-  attributes:
-    label: Steps to Reproduce
-    description: List of steps, sample code, failing test or link to a project that reproduces the behavior. Make sure you place a stack trace inside a code (```) block to avoid linking unrelated issues.
-  validations:
-    required: true
-- type: textarea
-  id: visuals
-  attributes:
-    label: Visuals
-    description: Please upload images or animations that can be used to reproduce issues in the area below. Try the [Steps Recorder](https://support.microsoft.com/en-us/windows/record-steps-to-reproduce-a-problem-46582a9b-620f-2e36-00c9-04e25d784e47) on Windows or [Screenshot](https://support.apple.com/en-us/HT208721) on macOS.
-- type: textarea
-  id: logs
-  attributes:
-    label: Logs
-    description: Please upload logs collected by following these [instructions](https://github.com/PowerShell/vscode-powershell/blob/main/docs/troubleshooting.md#logs) in the area below. Be careful to scrub sensitive information!
+        ms-vscode.powershell@2021.8.0
+    validations:
+      required: true
+  - type: textarea
+    id: steps-to-reproduce
+    attributes:
+      label: Steps to Reproduce
+      description: List of steps, sample code, failing test or link to a project that reproduces the behavior. Make sure you place a stack trace inside a code (```) block to avoid linking unrelated issues.
+    validations:
+      required: true
+  - type: textarea
+    id: visuals
+    attributes:
+      label: Visuals
+      description: Please upload images or animations that can be used to reproduce issues in the area below. Try the [Steps Recorder](https://support.microsoft.com/en-us/windows/record-steps-to-reproduce-a-problem-46582a9b-620f-2e36-00c9-04e25d784e47) on Windows or [Screenshot](https://support.apple.com/en-us/HT208721) on macOS.
+  - type: textarea
+    id: logs
+    attributes:
+      label: Logs
+      description: Please upload logs collected by following these [instructions](https://github.com/PowerShell/vscode-powershell/blob/main/docs/troubleshooting.md#logs) in the area below. Be careful to scrub sensitive information!
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
index d6b9a6a080..22599f9c7e 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -2,25 +2,25 @@ name: ✨ Feature request
 description: Open an issue about a potential new feature or improvement.
 labels: ["Issue-Enhancement", "Needs: Triage"]
 body:
-- type: checkboxes
-  attributes:
-    label: Prerequisites
-    options:
-    - label: I have written a descriptive issue title.
+  - type: checkboxes
+    attributes:
+      label: Prerequisites
+      options:
+        - label: I have written a descriptive issue title.
+          required: true
+        - label: I have searched all [issues](https://github.com/PowerShell/vscode-powershell/issues?q=is%3Aissue) to ensure it has not already been reported.
+          required: true
+  - type: textarea
+    id: summary
+    attributes:
+      label: Summary
+      description: Explain the feature request below.
+      placeholder: I would like to do X because it would be useful for Y and I cannot currently do it with Z.
+    validations:
       required: true
-    - label: I have searched all [issues](https://github.com/PowerShell/vscode-powershell/issues?q=is%3Aissue) to ensure it has not already been reported.
-      required: true
-- type: textarea
-  id: summary
-  attributes:
-    label: Summary
-    description: Explain the feature request below.
-    placeholder: I would like to do X because it would be useful for Y and I cannot currently do it with Z.
-  validations:
-    required: true
-- type: textarea
-  id: proposed-design
-  attributes:
-    label: Proposed Design
-    description: Optionally explain any technical design below.
-    placeholder: We could accomplish this by extending X to take Y and yield Z.
+  - type: textarea
+    id: proposed-design
+    attributes:
+      label: Proposed Design
+      description: Optionally explain any technical design below.
+      placeholder: We could accomplish this by extending X to take Y and yield Z.
diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml
index 6dbf114432..c53d576379 100644
--- a/.github/workflows/ci-test.yml
+++ b/.github/workflows/ci-test.yml
@@ -1,25 +1,28 @@
 name: CI Tests
+permissions:
+  contents: read
 
 on:
   push:
-    branches: [ main ]
+    branches: [main]
   pull_request:
     # The branches below must be a subset of the branches above
-    branches: [ main ]
+    branches: [main]
   merge_group:
-    types: [ checks_requested ]
+    types: [checks_requested]
 
 jobs:
   ci:
     name: node
     strategy:
       matrix:
-        os: [ windows-latest, macos-latest, ubuntu-latest ]
+        os: [windows-latest, macos-latest, ubuntu-latest]
     runs-on: ${{ matrix.os }}
     env:
       DOTNET_NOLOGO: true
       DOTNET_GENERATE_ASPNET_CERTIFICATE: false
-      DISPLAY: ':99.0'
+      DISPLAY: ":99.0"
+    timeout-minutes: 10
     steps:
       - name: Checkout PowerShellEditorServices
         uses: actions/checkout@v4
@@ -32,6 +35,11 @@ jobs:
         with:
           path: vscode-powershell
 
+      - name: Validate snippets JSON file
+        shell: pwsh
+        run: $null = ConvertFrom-Json -InputObject (Get-Content -Raw -Path './snippets/PowerShell.json')
+        working-directory: vscode-powershell
+
       - name: Install dotnet
         uses: actions/setup-dotnet@v4
         with:
@@ -64,11 +72,11 @@ jobs:
         if: always()
         with:
           name: vscode-powershell-vsix-${{ matrix.os }}
-          path: '**/*.vsix'
+          path: "**/*.vsix"
 
       - name: Upload test results
         uses: actions/upload-artifact@v4
         if: always()
         with:
           name: vscode-powershell-test-results-${{ matrix.os }}
-          path: '**/test-results.xml'
+          path: "**/test-results.xml"
diff --git a/.markdownlint.json b/.markdownlint.json
index e1a57605cd..7f90a5dce8 100644
--- a/.markdownlint.json
+++ b/.markdownlint.json
@@ -1,6 +1,6 @@
 {
-    "MD013": false,
-    "MD033": false,
-    "MD022": false,
-    "MD024": false
+  "MD013": false,
+  "MD033": false,
+  "MD022": false,
+  "MD024": false
 }
diff --git a/.mocharc.json b/.mocharc.json
deleted file mode 100644
index 38eeea86ca..0000000000
--- a/.mocharc.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "color": true,
-  "enable-source-maps": true,
-  "extensions": [
-    ".js",
-    ".jsx"
-  ],
-  "require": "source-map-support/register",
-  "timeout": 600000,
-  "slow": 2000,
-  "spec": "test/**/*.test.js"
-}
diff --git a/.pipelines/vscode-powershell-Official.yml b/.pipelines/vscode-powershell-Official.yml
index 54b2a3564e..155e258706 100644
--- a/.pipelines/vscode-powershell-Official.yml
+++ b/.pipelines/vscode-powershell-Official.yml
@@ -9,21 +9,21 @@
 #################################################################################
 
 trigger:
-- main
+  - main
 
 schedules:
-- cron: '25 9 * * 3'
-  displayName: Weekly CodeQL
-  branches:
-    include:
-    - main
-  always: true
+  - cron: "25 9 * * 3"
+    displayName: Weekly CodeQL
+    branches:
+      include:
+        - main
+    always: true
 
 parameters:
-- name: debug
-  displayName: Enable debug output
-  type: boolean
-  default: false
+  - name: debug
+    displayName: Enable debug output
+    type: boolean
+    default: false
 
 variables:
   system.debug: ${{ parameters.debug }}
@@ -37,13 +37,13 @@ resources:
       name: OneBranch.Pipelines/GovernedTemplates
       ref: refs/heads/main
   pipelines:
-  - pipeline: PowerShellEditorServices-Official
-    source: PowerShellEditorServices-Official
-    trigger:
-      branches:
-      - main
-      stages:
-      - release
+    - pipeline: PowerShellEditorServices-Official
+      source: PowerShellEditorServices-Official
+      trigger:
+        branches:
+          - main
+        stages:
+          - release
 
 extends:
   # https://aka.ms/obpipelines/templates
@@ -58,184 +58,149 @@ extends:
       WindowsHostVersion:
         Version: 2022
         Network: KS3
+    release:
+      category: NonAzure
     stages:
-    - stage: build
-      jobs:
-      - job: main
-        displayName: Build package
-        pool:
-          type: windows
+      - stage: build
+        jobs:
+          - job: main
+            displayName: Build package
+            pool:
+              type: windows
+            variables:
+              ob_outputDirectory: $(Build.SourcesDirectory)/out
+              ob_sdl_codeSignValidation_excludes: -|**\*.js # Node.js JavaScript signatures are not supported
+            steps:
+              - pwsh: |
+                  $version = (Get-Content -Raw -Path package.json | ConvertFrom-Json).version
+                  Write-Output "##vso[task.setvariable variable=vsixVersion;isOutput=true]$version"
+                  $prerelease = ([semver]$version).Minor % 2 -ne 0
+                  if ($prerelease) { $version += "-preview" }
+                  Write-Output "##vso[task.setvariable variable=version;isOutput=true]$version"
+                  Write-Output "##vso[task.setvariable variable=prerelease;isOutput=true]$prerelease"
+                name: package
+                displayName: Get version from package.json
+              - task: onebranch.pipeline.version@1
+                displayName: Set OneBranch version
+                inputs:
+                  system: Custom
+                  customVersion: $(package.version)
+              - task: UseNode@1
+                displayName: Use Node 20.x
+                inputs:
+                  version: 20.x
+              - task: DownloadPipelineArtifact@2
+                displayName: Download PowerShellEditorServices
+                inputs:
+                  source: specific
+                  project: PowerShellCore
+                  definition: 2905
+                  specificBuildWithTriggering: true
+                  allowPartiallySucceededBuilds: true
+                  buildVersionToDownload: latestFromBranch
+                  branchName: refs/heads/main
+                  artifact: drop_build_main
+              - task: ExtractFiles@1
+                displayName: Extract PowerShellEditorServices
+                inputs:
+                  archiveFilePatterns: $(Pipeline.Workspace)/PowerShellEditorServices.zip
+                  destinationFolder: $(Build.SourcesDirectory)/modules
+              - pwsh: |
+                  $manifest = Test-ModuleManifest $(Build.SourcesDirectory)/modules/PowerShellEditorServices/PowerShellEditorServices.psd1
+                  Write-Host Using PowerShellEditorServices v$($manifest.Version)
+                displayName: PowerShellEditorServices version
+              - pwsh: ./tools/installPSResources.ps1 -PSRepository CFS
+                displayName: Install PSResources
+              - pwsh: Invoke-Build Test -Configuration $(BuildConfiguration)
+                displayName: Build and test
+              - task: onebranch.pipeline.signing@1
+                displayName: Sign 1st-party example PowerShell files
+                inputs:
+                  command: sign
+                  signing_profile: external_distribution
+                  search_root: $(Build.SourcesDirectory)/examples
+                  files_to_sign: "**/*.ps1;**/*.psd1;**/*.psm1"
+              - pwsh: Invoke-Build Package
+                displayName: Create package
+              - pwsh: |
+                  npx vsce generate-manifest --packagePath out/powershell-$(package.vsixVersion).vsix
+                  cp out/powershell-$(package.vsixVersion).manifest out/powershell-$(package.vsixVersion).signature.p7s
+                displayName: Generate VSIX manifest
+              - task: onebranch.pipeline.signing@1
+                displayName: Sign VSIX manifest
+                inputs:
+                  command: sign
+                  cp_code: "CP-401405-VSCodePublisherSign"
+                  search_root: $(Build.SourcesDirectory)/out
+                  files_to_sign: "*.signature.p7s"
+      - stage: release
+        dependsOn: build
+        condition: eq(variables['Build.Reason'], 'Manual')
         variables:
-          ob_outputDirectory: $(Build.SourcesDirectory)/out
-          ob_sdl_codeSignValidation_excludes: -|**\*.js # Node.js JavaScript signatures are not supported
-        steps:
-          - pwsh: |
-              $version = (Get-Content -Raw -Path package.json | ConvertFrom-Json).version
-              Write-Output "##vso[task.setvariable variable=vsixVersion;isOutput=true]$version"
-              $prerelease = ([semver]$version).Minor % 2 -ne 0
-              if ($prerelease) { $version += "-preview" }
-              Write-Output "##vso[task.setvariable variable=version;isOutput=true]$version"
-              Write-Output "##vso[task.setvariable variable=prerelease;isOutput=true]$prerelease"
-            name: package
-            displayName: Get version from package.json
-          - task: onebranch.pipeline.version@1
-            displayName: Set OneBranch version
-            inputs:
-              system: Custom
-              customVersion: $(package.version)
-          - task: UseNode@1
-            displayName: Use Node 20.x
-            inputs:
-              version: 20.x
-          - task: DownloadPipelineArtifact@2
-            displayName: Download PowerShellEditorServices
-            inputs:
-              source: specific
-              project: PowerShellCore
-              definition: 2905
-              specificBuildWithTriggering: true
-              branchName: refs/heads/main
-              artifact: drop_build_main
-              targetPath: $(Build.SourcesDirectory)/modules
-          - pwsh: |
-              Register-PSRepository -Name CFS -SourceLocation "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v2" -InstallationPolicy Trusted
-              Install-Module -Repository CFS -Name Microsoft.PowerShell.PSResourceGet
-              ./tools/installPSResources.ps1 -PSRepository CFS
-            displayName: Install PSResources
-          - pwsh: Invoke-Build Build -Configuration $(BuildConfiguration)
-            displayName: Build
-          - task: onebranch.pipeline.signing@1
-            displayName: Sign 1st-party example PowerShell files
-            inputs:
-              command: sign
-              signing_profile: external_distribution
-              search_root: $(Build.SourcesDirectory)/examples
-              files_to_sign: '**/*.ps1;**/*.psd1;**/*.psm1'
-          - pwsh: Invoke-Build Package
-            displayName: Create package
-          - pwsh: |
-              npx vsce generate-manifest --packagePath out/powershell-$(package.vsixVersion).vsix
-              cp out/powershell-$(package.vsixVersion).manifest out/powershell-$(package.vsixVersion).signature.p7s
-            displayName: Generate VSIX manifest
-          - task: onebranch.pipeline.signing@1
-            displayName: Sign VSIX manifest
-            inputs:
-              command: sign
-              cp_code: 'CP-401405-VSCodePublisherSign'
-              search_root: $(Build.SourcesDirectory)/out
-              files_to_sign: |
-                *.signature.p7s;
-      - job: test
-        displayName: Build and run tests
-        pool:
-          type: windows
-          isCustom: true
-          name: Azure Pipelines
-          vmImage: windows-latest
-        variables:
-          ob_outputDirectory: $(Build.SourcesDirectory)/out
-          skipComponentGovernanceDetection: true
-        steps:
-          - task: UseNode@1
-            displayName: Use Node 20.x
-            inputs:
-              version: 20.x
-          - task: UseDotNet@2
-            displayName: Use .NET 8.x SDK
-            inputs:
-              packageType: sdk
-              version: 8.x
-          - task: DownloadPipelineArtifact@2
-            displayName: Download PowerShellEditorServices
-            inputs:
-              source: specific
-              project: PowerShellCore
-              definition: 2905
-              specificBuildWithTriggering: true
-              branchName: refs/heads/main
-              artifact: drop_build_main
-              targetPath: $(Build.SourcesDirectory)/modules
-          - pwsh: |
-              Register-PSRepository -Name CFS -SourceLocation "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v2" -InstallationPolicy Trusted
-              Install-Module -Repository CFS -Name Microsoft.PowerShell.PSResourceGet
-              ./tools/installPSResources.ps1 -PSRepository CFS
-            displayName: Install PSResources
-          - pwsh: Invoke-Build Test -Configuration $(BuildConfiguration)
-            displayName: Run tests
-    - stage: release
-      dependsOn: build
-      condition: eq(variables['Build.Reason'], 'Manual')
-      variables:
-        version: $[ stageDependencies.build.main.outputs['package.version'] ]
-        vsixVersion: $[ stageDependencies.build.main.outputs['package.vsixVersion'] ]
-        prerelease: $[ stageDependencies.build.main.outputs['package.prerelease'] ]
-        drop: $(Pipeline.Workspace)/drop_build_main
-      jobs:
-      - job: github
-        displayName: Publish draft to GitHub
-        pool:
-          type: windows
-        variables:
-          ob_outputDirectory: $(Build.SourcesDirectory)/out
-        steps:
-        - download: current
-          displayName: Download artifacts
-        - task: GitHubRelease@1
-          displayName: Create GitHub release
-          inputs:
-            gitHubConnection: GitHub
-            repositoryName: PowerShell/vscode-powershell
-            assets: $(drop)/powershell-$(vsixVersion).vsix
-            tagSource: userSpecifiedTag
-            tag: v$(version)
-            isDraft: true
-            isPreRelease: $(prerelease)
-            addChangeLog: false
-            releaseNotesSource: inline
-            releaseNotesInline: "<!-- TODO: Generate release notes on GitHub! -->"
-      - job: validation
-        displayName: Manual validation
-        pool:
-          type: agentless
-        timeoutInMinutes: 1440
-        steps:
-        - task: ManualValidation@0
-          displayName: Wait 24 hours for validation
-          inputs:
-            notifyUsers: $(Build.RequestedForEmail)
-            instructions: Please validate the release and then publish it!
+          ob_release_environment: Production
+          version: $[ stageDependencies.build.main.outputs['package.version'] ]
+          vsixVersion: $[ stageDependencies.build.main.outputs['package.vsixVersion'] ]
+          prerelease: $[ stageDependencies.build.main.outputs['package.prerelease'] ]
+        jobs:
+          - job: github
+            displayName: Publish draft to GitHub
+            pool:
+              type: release
+            templateContext:
+              inputs:
+                - input: pipelineArtifact
+                  artifactName: drop_build_main
+            steps:
+              - task: GitHubRelease@1
+                displayName: Create GitHub release
+                inputs:
+                  gitHubConnection: GitHub
+                  repositoryName: PowerShell/vscode-powershell
+                  target: main
+                  assets: |
+                    $(Pipeline.Workspace)/powershell-$(vsixVersion).vsix
+                    $(Pipeline.Workspace)/powershell-$(vsixVersion).manifest
+                    $(Pipeline.Workspace)/powershell-$(vsixVersion).signature.p7s
+                  tagSource: userSpecifiedTag
+                  tag: v$(version)
+                  isDraft: true
+                  isPreRelease: $(prerelease)
+                  addChangeLog: false
+                  releaseNotesSource: inline
+                  releaseNotesInline: "<!-- TODO: Generate release notes on GitHub! -->"
+          - job: validation
+            displayName: Manual validation
+            pool:
+              type: server
             timeoutInMinutes: 1440
-      - job: vscode
-        dependsOn: validation
-        displayName: Publish to VS Code Marketplace
-        pool:
-          type: windows
-        variables:
-          ob_outputDirectory: $(Build.SourcesDirectory)/out
-        steps:
-        - download: current
-          displayName: Download artifacts
-        - task: UseNode@1
-          displayName: Use Node 20.x
-          inputs:
-            version: 20.x
-        - pwsh: npm ci
-          displayName: Install NPM packages (for vsce)
-        - task: AzureCLI@2
-          displayName: Run vsce publish
-          inputs:
-            azureSubscription: vscode-marketplace
-            scriptType: pscore
-            scriptLocation: inlineScript
-            inlineScript: |
-              $publishArgs = @(
-                '--azure-credential'
-                '--packagePath'
-                '$(drop)/powershell-$(vsixVersion).vsix'
-                '--manifestPath'
-                '$(drop)/powershell-$(vsixVersion).manifest'
-                '--signaturePath'
-                '$(drop)/powershell-$(vsixVersion).signature.p7s'
-                if ([bool]::Parse('$(prerelease)')) { '--pre-release' }
-              )
-              npm run publish -- @publishArgs
+            steps:
+              - task: ManualValidation@0
+                displayName: Wait 24 hours for validation
+                inputs:
+                  notifyUsers: $(Build.RequestedForEmail)
+                  instructions: Please validate the release and then publish it!
+          - job: vscode
+            dependsOn: validation
+            displayName: Publish to VS Code Marketplace
+            pool:
+              type: release
+            templateContext:
+              inputs:
+                - input: pipelineArtifact
+                  artifactName: drop_build_main
+              workflow: vsce
+              vsce:
+                serviceConnection: vscode-marketplace
+                vsixPath: "$(Pipeline.Workspace)/powershell-$(vsixVersion).vsix"
+                signaturePath: "$(Pipeline.Workspace)/powershell-$(vsixVersion).signature.p7s"
+                manifestPath: "$(Pipeline.Workspace)/powershell-$(vsixVersion).manifest"
+                preRelease: $(prerelease)
+                useCustomVSCE: true
+                feed:
+                  organization: mscodehub
+                  project: PowerShellCore
+                  feedName: PowerShellCore_PublicPackages
+            steps:
+              - pwsh: |
+                  Write-Host Publishing: $(vsixVersion), pre-release: $(prerelease)
+                displayName: No-op step to satisfy pipeline requirements
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000000..3772289cad
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,3 @@
+dist/
+modules/
+out/
diff --git a/.vscode-test.mjs b/.vscode-test.mjs
new file mode 100644
index 0000000000..7b14da081f
--- /dev/null
+++ b/.vscode-test.mjs
@@ -0,0 +1,21 @@
+import { defineConfig } from "@vscode/test-cli";
+import { existsSync } from "fs";
+
+export default defineConfig({
+    files: "test/**/*.test.ts",
+    // It may break CI but we'll know sooner rather than later
+    version: "insiders",
+    launchArgs: [
+        // Other extensions are unnecessary while testing
+        "--disable-extensions",
+        // Undocumented but valid option to use a temporary profile for testing
+        "--profile-temp",
+    ],
+    workspaceFolder: `test/${existsSync("C:\\powershell-7\\pwsh.exe") ? "OneBranch" : "TestEnvironment"}.code-workspace`,
+    mocha: {
+        ui: "bdd", // describe, it, etc.
+        require: ["esbuild-register"], // transpile TypeScript on-the-fly
+        slow: 2 * 1000, // 2 seconds for slow test
+        timeout: 2 * 60 * 1000, // 2 minutes to allow for debugging
+    },
+});
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index c8375dfe52..0000000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
-  "version": "0.2.0",
-  "configurations": [
-    // NOTE: These are not in the code-workspace file because StartDebugging cannot current resolve configs stored there so they have to be here for the Mocha Test Explorer feature.
-    // Ref: https://github.com/microsoft/vscode/issues/150663
-    {
-      "name": "Launch Extension",
-      "type": "extensionHost",
-      "request": "launch",
-      "runtimeExecutable": "${execPath}",
-      "args": [
-        "--extensionDevelopmentPath=${workspaceFolder}"
-      ],
-      "env": {
-        "__TEST_WORKSPACE_PATH": "${workspaceFolder}/examples",
-      },
-      "sourceMaps": true,
-      // This speeds up source map detection and makes smartStep work correctly
-      "outFiles": [
-        "${workspaceFolder}/**/*.js",
-        "!**/node_modules/**",
-        "!**/.vscode-test/**"
-      ],
-      "skipFiles": [
-        "<node_internals>/**",
-        "**/node_modules/**",
-        "**/.vscode-test/**"
-      ],
-      "presentation": {
-        "hidden": false,
-        "group": "test",
-        "order": 2
-      }
-    },
-    {
-      // Runs the extension in an empty temp profile that is automatically cleaned up after use
-      // Undocumented: https://github.com/microsoft/vscode-docs/issues/6220
-      "name": "Launch Extension - Temp Profile",
-      "type": "extensionHost",
-      "request": "launch",
-      "runtimeExecutable": "${execPath}",
-      "args": [
-        "--profile-temp",
-        "--extensionDevelopmentPath=${workspaceFolder}",
-        "${workspaceFolder}/examples"
-      ],
-      "sourceMaps": true,
-      // This speeds up source map detection and makes smartStep work correctly
-      "outFiles": [
-        "${workspaceFolder}/**/*.js",
-        "!**/node_modules/**",
-        "!**/.vscode-test/**"
-      ],
-      "skipFiles": [
-        "<node_internals>/**",
-        "**/node_modules/**",
-        "**/.vscode-test/**"
-      ],
-      "presentation": {
-        "hidden": false,
-        "group": "test",
-        "order": 2
-      }
-    },
-    {
-      // Runs the extension in an isolated but persistent profile separate from the user settings
-      // Undocumented: https://github.com/microsoft/vscode-docs/issues/6220
-      "name": "Launch Extension - Isolated Profile",
-      "type": "extensionHost",
-      "request": "launch",
-      "runtimeExecutable": "${execPath}",
-      "args": [
-        "--profile=debug",
-        "--extensionDevelopmentPath=${workspaceFolder}",
-        "${workspaceFolder}/examples"
-      ],
-      "sourceMaps": true,
-      // This speeds up source map detection and makes smartStep work correctly
-      "outFiles": [
-        "${workspaceFolder}/**/*.js",
-        "!**/node_modules/**",
-        "!**/.vscode-test/**"
-      ],
-      "skipFiles": [
-        "<node_internals>/**",
-        "**/node_modules/**",
-        "**/.vscode-test/**"
-      ],
-      "presentation": {
-        "hidden": false,
-        "group": "test",
-        "order": 2
-      }
-    },
-    {
-      "name": "Test Extension",
-      "type": "node",
-      "request": "launch",
-      "program": "${workspaceFolder}/test/runTests.js",
-      "cascadeTerminateToConfigurations": [
-        "ExtensionTests",
-      ],
-      // This speeds up source map detection and makes smartStep work correctly
-      "outFiles": [
-        "${workspaceFolder}/**/*.js",
-        "!**/node_modules/**",
-        "!**/.vscode-test/**"
-      ],
-      "skipFiles": [
-        "<node_internals>/**",
-        "**/node_modules/**",
-        "**/.vscode-test/**"
-      ],
-      "attachSimplePort": 59229, // The default is 9229 but we want to avoid conflicts because we will have two Code instances running.
-      "env": {
-        "__TEST_DEBUG_INSPECT_PORT": "59229" // Needs to match attachSimplePort
-      },
-      "presentation": {
-        "hidden": false,
-      },
-      "internalConsoleOptions": "neverOpen",
-      "console": "integratedTerminal",
-      "autoAttachChildProcesses": false,
-      "preLaunchTask": "watch-tests"
-    }
-  ]
-}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
deleted file mode 100644
index fa53736684..0000000000
--- a/.vscode/tasks.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "version": "2.0.0",
-  "tasks": [
-    {
-      "label": "watch-tests",
-      "icon": {
-        "color": "terminal.ansiCyan",
-        "id": "sync"
-      },
-      "type": "npm",
-      "script": "watch-tests",
-      "group": "test",
-      "problemMatcher": "$tsc-watch",
-      "isBackground": true,
-      "dependsOn": "watch"
-    },
-    {
-      "label": "watch",
-      "icon": {
-        "color": "terminal.ansiCyan",
-        "id": "sync"
-      },
-      "type": "npm",
-      "script": "watch",
-      "group": "build",
-      "problemMatcher": "$esbuild-watch",
-      "isBackground": true
-    }
-  ]
-}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d072a033b5..35e51191bb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,108 @@
 # PowerShell Extension Release History
 
+## v2025.2.0
+### Monday, June 30, 2025
+
+With PowerShell Editor Services [v4.3.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.3.0)!
+
+New stable release!
+
+See more details at the GitHub Release for [v2025.2.0](https://github.com/PowerShell/vscode-powershell/releases/tag/v2025.2.0).
+
+## v2025.3.1-preview
+### Wednesday, June 25, 2025
+
+With PowerShell Editor Services [v4.3.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.3.0)!
+
+PowerShell installed via `brew` now found!
+
+See more details at the GitHub Release for [v2025.3.1-preview](https://github.com/PowerShell/vscode-powershell/releases/tag/v2025.3.1-preview).
+
+## v2025.3.0-preview
+### Tuesday, March 18, 2025
+
+With PowerShell Editor Services [v4.3.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.3.0)!
+
+Now with [PSScriptAnalyzer v1.2.4](https://github.com/PowerShell/PSScriptAnalyzer/releases/tag/1.24.0)
+and [PSReadLine v2.4.1-beta1](https://github.com/PowerShell/PSReadLine/releases/tag/v2.4.1-beta1).
+
+See more details at the GitHub Release for [v2025.3.0-preview](https://github.com/PowerShell/vscode-powershell/releases/tag/v2025.3.0-preview).
+
+## v2025.0.0
+### Tuesday, January 21, 2025
+
+With PowerShell Editor Services [v4.2.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.2.0)!
+
+New Year Update!
+
+PowerShell 7.4+ and Windows PowerShell 5.1 (on a best-effort basis)
+are now solely supported as 7.3 LTS and 7.2 are past end-of-support.
+
+A major bug due to a Global Assembly Cache conflict with Serilog
+when using Windows PowerShell has been resolved by removing the
+troublesome dependency. This also came with a wonderful logging
+overhaul for both the server and client. Thanks Justin!
+
+Dependencies and VS Code engine have been updated. Snippets fixed.
+Extension settings are now categorized. Additional PowerShell
+executable path verification fixed.
+
+See more details at the GitHub Release for [v2025.0.0](https://github.com/PowerShell/vscode-powershell/releases/tag/v2025.0.0).
+
+## v2025.1.0-preview
+### Thursday, January 16, 2025
+
+With PowerShell Editor Services [v4.2.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.2.0)!
+
+VS Code engine update and snippet fix
+
+See more details at the GitHub Release for [v2025.1.0-preview](https://github.com/PowerShell/vscode-powershell/releases/tag/v2025.1.0-preview).
+
+## v2024.5.2-preview
+### Wednesday, December 04, 2024
+
+With PowerShell Editor Services [v4.1.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.1.0)!
+
+Bug fixes and build improvements.
+
+See more details at the GitHub Release for [v2024.5.2-preview](https://github.com/PowerShell/vscode-powershell/releases/tag/v2024.5.2-preview).
+
+## v2024.5.1-preview
+### Monday, November 18, 2024
+
+With PowerShell Editor Services [v4.0.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.0.0)!
+
+Drop support for PowerShell <7.4 and logging overhaul
+
+PowerShell 7.2 LTS and 7.3 are now past end-of-support and are now unsupported.
+This is an incompatible API change so we're bumping the major version
+of PowerShell Editor Services.
+Please update to PowerShell 7.4 LTS going forward.
+
+This release contains a logging overhaul which purposely removes our
+dependency on Serilog and should lead to improved stability with
+PowerShell 5.1 (by avoiding a major GAC assembly conflict).
+
+See more details at the GitHub Release for [v2024.5.1-preview](https://github.com/PowerShell/vscode-powershell/releases/tag/v2024.5.1-preview).
+
+## v2024.4.0
+### Monday, November 04, 2024
+
+With PowerShell Editor Services [v3.21.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v3.21.0)!
+
+Call-operator support and various bug fixes.
+
+See more details at the GitHub Release for [v2024.4.0](https://github.com/PowerShell/vscode-powershell/releases/tag/v2024.4.0).
+
+## v2024.5.0-preview
+### Wednesday, October 30, 2024
+
+With PowerShell Editor Services [v3.21.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v3.21.0)!
+
+Call-operator support and various bug fixes.
+
+See more details at the GitHub Release for [v2024.5.0-preview](https://github.com/PowerShell/vscode-powershell/releases/tag/v2024.5.0-preview).
+
 ## v2024.2.2
 ### Friday, May 03, 2024
 
diff --git a/README.md b/README.md
index 3c9398d92c..70f7df3726 100644
--- a/README.md
+++ b/README.md
@@ -53,23 +53,27 @@ picker][] and select **PowerShell ISE**.
 
 ## Platform Support
 
-The extension should work anywhere VS Code itself and PowerShell Core 7.2 or higher is
-[supported][]. For Windows PowerShell, only version 5.1 is supported and only on a best-effort
-basis. PowerShell Core 6, 7.0, and 7.1 have reached end-of-support. We test the following
-configurations:
+The extension should work everywhere [Visual Studio Code](https://code.visualstudio.com/docs/supporting/requirements) is supported using [PowerShell 7+ currently supported versions][].
 
-- **Windows Server 2022** with Windows PowerShell 5.1 and PowerShell Core 7.2, 7.3 and 7.4
-- **macOS 12** with PowerShell Core 7.2, 7.3 and 7.4
-- **Ubuntu 22.04** with PowerShell Core 7.2, 7.3 and 7.4
+> [!IMPORTANT]
+> For Windows PowerShell, only version 5.1 is supported and only on a best-effort basis. [.NET Framework 4.8][dotnet-framework] or higher is required.
+
+> [!IMPORTANT]
+> [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) is only supported for limited functionality such as basic syntax highlighting, as the PowerShell engine cannot run in this environment currently.
+
+[VS Code Remote Development](https://code.visualstudio.com/docs/remote/remote-overview) Environments, including [Github Codespaces](https://github.com/features/codespaces) and [VS Code Server](https://code.visualstudio.com/docs/remote/vscode-server) are supported.
+
+We actively test the following configurations [in Github Actions on every commit](https://github.com/PowerShell/vscode-powershell/actions/workflows/ci-test.yml):
+- **Windows Server 2022** with Windows PowerShell 5.1 and PowerShell 7+
+- **macOS 14.7** with PowerShell 7+
+- **Ubuntu 24.04** with PowerShell 7+
 
 On Windows, we also test with and without Constrained Language Mode enabled.
 
 Read the [installation instructions][]
 to get more details on how to use the extension on these platforms.
 
-For Windows PowerShell 5.1, [.NET Framework 4.8][dotnet-framework] or higher is required.
-
-[supported]: https://docs.microsoft.com/en-us/powershell/scripting/powershell-support-lifecycle
+[PowerShell 7+ currently supported versions]: https://docs.microsoft.com/en-us/powershell/scripting/powershell-support-lifecycle
 [installation instructions]: https://docs.microsoft.com/en-us/powershell/scripting/components/vscode/using-vscode
 [dotnet-framework]: https://dotnet.microsoft.com/en-us/download/dotnet-framework
 
diff --git a/docs/development.md b/docs/development.md
index 28b55750ab..3caac3bb01 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -4,22 +4,24 @@
 
 1. [Fork and clone][fork] the [vscode-powershell repository](https://github.com/PowerShell/vscode-powershell).
 
-2. [Fork and clone][fork] the [PowerShell Editor Services (PSES) repository](https://github.com/PowerShell/PowerShellEditorServices).
+1. [Fork and clone][fork] the [PowerShell Editor Services (PSES) repository](https://github.com/PowerShell/PowerShellEditorServices).
    > The `vscode-powershell` folder and the `PowerShellEditorServices` folder should be next to each other on the file
    > system. Code in `vscode-powershell` looks for PSES at `../PowerShellEditorServices` if you're building locally so
    > PSES must be in that location.
 
-3. Follow the [development instructions](https://github.com/PowerShell/PowerShellEditorServices#development) for
+1. Follow the [development instructions](https://github.com/PowerShell/PowerShellEditorServices#development) for
    PowerShell Editor Services. **You will need to complete this step before proceeding**.
 
-4. Install [Node.js](https://nodejs.org/en/) 18.x or higher.
+1. Install [Node.js](https://nodejs.org/en/) 18.x or higher.
 
-5. Install [Visual Studio Code](https://code.visualstudio.com).
+1. Install [Visual Studio Code](https://code.visualstudio.com).
    Open the multi-root workspace file in this repo, `extension-dev.code-workspace`.
    > This has a set of recommended extensions to install and provides tasks.
    > The ESLint formatter will require you to install ESLint globally, using `npm install -g eslint`.
    > Otherwise VS Code will erroneously complain that it isn't able to use it to format TypeScript files.
 
+1. (optional) Set `git config blame.ignoreRevsFile .git-blame-ignore-revs` to ignore formatting-related commits.
+
 [fork]: https://help.github.com/articles/fork-a-repo/
 
 ## Tracking Upstream Dependencies
@@ -34,11 +36,12 @@ of VS Code's own `package.json` file for their [`electron`][] dependency. The
 major version of [Electron][] will tell us which [Node.js][] is included, which
 dictates which version of Node.js the extension is eventually run with. This
 lets us finally update our `@types/node` development dependency to match, our
-developer machines if necessary, and the CI and OneBranch pipeline tasks.
+developer machines if necessary, the CI and OneBranch pipeline tasks, and the
+`.tsconfig` file. Note that the version of `@types/node` will not necessarily
+exactly match the version of Node.js, but the major version should.
 
-[`vscodeVersion`]: https://github.com/microsoft/azuredatastudio/blob/4970733324ef8254b7c22a5dc55af7f8a1dea93f/product.json#L50
-[`electron`]: https://github.com/microsoft/vscode/blob/384ff7382de624fb94dbaf6da11977bba1ecd427/package.json#L159
-[Electron]: https://www.electronjs.org/blog/electron-30-0
+[`electron`]: https://github.com/microsoft/vscode/blob/138f619c86f1199955d53b4166bef66ef252935c/package.json#L156
+[Electron]: https://releases.electronjs.org/release/v32.2.6
 [Node.js]: https://nodejs.org/en/download/package-manager
 
 ### Building the Code
@@ -56,10 +59,19 @@ Invoke-Build Build
 Explore the `vscode-powershell.build.ps1` file for other build targets.
 
 ### Launching the extension
+First, ensure you have completed a build as instructed above, as the launch templates do not check some prerequisites for performance reasons.
+
+To debug the extension use one of the provided `Launch Extension` debug configurations.
+1. `Launch Extension`: Launches the debugger using your personal profile settings.
+2. `Temp Profile`: Launches VS Code with a temp profile that resets on every launch. Useful for "out of the box" environment testing.
+3. `Isolated Profile`: Launches the debugger with a persistent debug profile specific to the extension, so you can preserve some settings or test certain prerequisites.
+
+All three templates use pre-launch tasks to build the code, and support automatic restart of the extension host on changes to the Extension source code. [Hot Reload](https://devblogs.microsoft.com/dotnet/introducing-net-hot-reload/) is also enabled for PowerShell Editor Services.
+
+> [!WARNING]
+> There is a current limitation that, if you restart the extension/extension host or it is restarted due to a extension code change, the editor services attachment will be disconnected due to the PSES terminal being terminated, and you will either need to restart the debug session completely, or do a manual build of PSES and run the `Attach to Editor Services` debug launch manually.
 
-To debug the extension use one of the provided `Launch Extension` debug configurations (remember to rebuild first).
-You can simultaneously use the `Attach to Editor Services` configuration to attach the .NET debugger to the PowerShell process running the server.
-Try the `powershell.developer.editorServicesWaitForDebugger` setting to attach before startup.
+Try the `powershell.developer.editorServicesWaitForDebugger` setting to ensure that you are fully attached before the extension startup process continues.
 
 ## Contributing Snippets
 
@@ -77,29 +89,34 @@ of Microsoft. Assume `origin` is GitHub and `ado` is Azure DevOps.
 cd ./PowerShellEditorServices
 git checkout -B release
 ./tools/updateVersion.ps1 -Version "4.0.0" -Changes "Major release!"
+# Amend changelog as necessary
 git push --force-with-lease origin
-git push ado HEAD:main
-
+# Open, approve, and merge PR on GitHub
 cd ../vscode-powershell
 git checkout -B release
 ./tools/updateVersion.ps1 -Version "2024.4.0" -Changes "Major release!"
+# Amend changelog as necessary
 git push --force-with-lease origin
-git push ado HEAD:main
+# Open, approve, and merge PR on GitHub
+cd ../PowerShellEditorServices
+git checkout main
+git pull
+git push ado HEAD:release
+cd ../vscode-powershell
+git checkout main
+git pull
+git push ado HEAD:release
+# Download and test assets from draft GitHub Releases
+# Publish releases, ensuring tag is at release commit in `main`
+# Permit pipeline to publish to marketplace
 ```
 
-1. Amend changelogs as necessary.
-2. Push `release` branches to GitHub and to Azure DevOps `main` branch.
-3. Download and test assets!
-4. Publish draft releases and merge (don't squash!) branches.
-5. Permit pipeline to publish to marketplace.
-
 If rolling from pre-release to release, do not change the version of PowerShell
 Editor Services between a pre-release and the subsequent release! We only
 need to release the extension.
 
-The Azure DevOps pipelines have to build off `main` branch for _reasons_,
-but we still want to use PRs. Hence pushing `release` to `main` and then
-merging (not squashing nor rebasing) those PRs so the commit stays the same.
+The Azure DevOps pipelines have to build off a PR merged to `main` for _reasons_,
+hence that repo is a superset including all our commits plus signed PR merge commits.
 
 ### Versioning
 
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
index 3c341a6e19..4c2b6195dd 100644
--- a/docs/troubleshooting.md
+++ b/docs/troubleshooting.md
@@ -15,7 +15,7 @@ active editor's language mode is PowerShell.
 
 ### Using Windows PowerShell 5.1
 
-While we _highly encourage_ the use of [PowerShell Core 7.2][], if you must use Windows
+While we _highly encourage_ the use of [PowerShell 7.4 LTS][], if you must use Windows
 PowerShell 5.1 we attempt to support it on a best-effort basis. Unfortunately, being two
 major versions behind and in maintenance mode, Windows PowerShell is missing many of the
 bug fixes and APIs we use to make the extension experience great. So please, if you can,
@@ -253,11 +253,11 @@ Logs provide context for what was happening when the issue occurred. **You shoul
 your logs for any sensitive information you would not like to share online!**
 
 * Before sending through logs, try and reproduce the issue with **log level set to
-  Diagnostic**. You can set this in the [VS Code Settings][]
+  Trace**. You can set this in the [VS Code Settings][]
   (<kbd>Ctrl</kbd>+<kbd>,</kbd>) with:
 
   ```json
-  "powershell.developer.editorServicesLogLevel": "Diagnostic"
+  "powershell.developer.editorServicesLogLevel": "Trace"
   ```
 
 * After you have captured the issue with the log level turned up, you may want to return
@@ -410,7 +410,7 @@ WSManStackVersion              3.0
 [more information]: #providing-information-about-your-environment
 [open a new issue]: https://github.com/PowerShell/vscode-powershell/issues/new/choose
 [open an issue there]: https://github.com/PowerShell/PSScriptAnalyzer/issues/new/choose
-[PowerShell Core 7.2]: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2
+[PowerShell 7.4 LTS]: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4
 [semantic highlighting]: https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide
 [tackling an issue]: ./development.md
 [v2021.2.2]: https://github.com/PowerShell/vscode-powershell/releases/tag/v2021.2.2
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000000..9ad447020d
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,50 @@
+import eslint from "@eslint/js";
+import eslintConfigPrettier from "eslint-config-prettier/flat";
+import tseslint from "typescript-eslint";
+
+export default tseslint.config(
+    eslint.configs.recommended,
+    tseslint.configs.strictTypeChecked,
+    tseslint.configs.stylisticTypeChecked,
+    eslintConfigPrettier,
+    {
+        languageOptions: {
+            parserOptions: {
+                projectService: true,
+                tsconfigRootDir: import.meta.dirname,
+            },
+        },
+        rules: {
+            "@typescript-eslint/explicit-function-return-type": "error",
+            "@typescript-eslint/no-empty-object-type": "off",
+            "@typescript-eslint/no-floating-promises": [
+                "error",
+                {
+                    ignoreVoid: true,
+                },
+            ],
+            "@typescript-eslint/no-non-null-assertion": "off",
+            "@typescript-eslint/no-require-imports": "off",
+            "@typescript-eslint/no-unused-vars": [
+                "error",
+                {
+                    argsIgnorePattern: "^_",
+                    destructuredArrayIgnorePattern: "^_",
+                },
+            ],
+            "@typescript-eslint/no-unsafe-argument": "off",
+            "@typescript-eslint/no-unsafe-assignment": "off",
+            "@typescript-eslint/no-unsafe-call": "off",
+            "@typescript-eslint/no-unsafe-member-access": "off",
+            "@typescript-eslint/no-unsafe-return": "off",
+            "@typescript-eslint/restrict-template-expressions": "off",
+            "@typescript-eslint/prefer-nullish-coalescing": [
+                "error",
+                {
+                    ignoreConditionalTests: true,
+                    ignoreMixedLogicalExpressions: true,
+                },
+            ],
+        },
+    },
+);
diff --git a/examples/.vscode/launch.json b/examples/.vscode/launch.json
index 88687248dd..310016412d 100644
--- a/examples/.vscode/launch.json
+++ b/examples/.vscode/launch.json
@@ -1,59 +1,59 @@
 {
-    "version": "0.2.0",
-    "configurations": [
-        {
-            "type": "PowerShell",
-            "request": "launch",
-            "name": "PowerShell Launch Current File",
-            "script": "${file}",
-            "args": [],
-            "cwd": "${file}"
-        },
-        {
-            "type": "PowerShell",
-            "request": "launch",
-            "name": "PowerShell Launch Current File in Temporary Console",
-            "script": "${file}",
-            "args": [],
-            "cwd": "${file}",
-            "createTemporaryIntegratedConsole": true
-        },
-        {
-            "type": "PowerShell",
-            "request": "launch",
-            "name": "PowerShell Launch Current File w/Args Prompt",
-            "script": "${file}",
-            "args": [ "${command:SpecifyScriptArgs}" ],
-            "cwd": "${file}"
-        },
-        {
-            "type": "PowerShell",
-            "request": "launch",
-            "name": "PowerShell Launch DebugTest.ps1",
-            "script": "${workspaceRoot}/DebugTest.ps1",
-            "args": ["-Count 55 -DelayMilliseconds 250"],
-            "cwd": "${workspaceRoot}"
-        },
-        {
-            "type": "PowerShell",
-            "request": "launch",
-            "name": "PowerShell Interactive Session",
-            "cwd": "${workspaceRoot}"
-        },
-        {
-            "type": "PowerShell",
-            "request": "launch",
-            "name": "PowerShell Pester Tests",
-            "script": "Invoke-Pester",
-            "args": [],
-            "cwd": "${workspaceRoot}"
-        },
-        {
-            "type": "PowerShell",
-            "request": "attach",
-            "name": "PowerShell Attach to Host Process",
-            "processId": "${command:PickPSHostProcess}",
-            "runspaceId": 1
-        }
-    ]
+  "version": "0.2.0",
+  "configurations": [
+    {
+      "type": "PowerShell",
+      "request": "launch",
+      "name": "PowerShell Launch Current File",
+      "script": "${file}",
+      "args": [],
+      "cwd": "${file}"
+    },
+    {
+      "type": "PowerShell",
+      "request": "launch",
+      "name": "PowerShell Launch Current File in Temporary Console",
+      "script": "${file}",
+      "args": [],
+      "cwd": "${file}",
+      "createTemporaryIntegratedConsole": true
+    },
+    {
+      "type": "PowerShell",
+      "request": "launch",
+      "name": "PowerShell Launch Current File w/Args Prompt",
+      "script": "${file}",
+      "args": ["${command:SpecifyScriptArgs}"],
+      "cwd": "${file}"
+    },
+    {
+      "type": "PowerShell",
+      "request": "launch",
+      "name": "PowerShell Launch DebugTest.ps1",
+      "script": "${workspaceRoot}/DebugTest.ps1",
+      "args": ["-Count 55 -DelayMilliseconds 250"],
+      "cwd": "${workspaceRoot}"
+    },
+    {
+      "type": "PowerShell",
+      "request": "launch",
+      "name": "PowerShell Interactive Session",
+      "cwd": "${workspaceRoot}"
+    },
+    {
+      "type": "PowerShell",
+      "request": "launch",
+      "name": "PowerShell Pester Tests",
+      "script": "Invoke-Pester",
+      "args": [],
+      "cwd": "${workspaceRoot}"
+    },
+    {
+      "type": "PowerShell",
+      "request": "attach",
+      "name": "PowerShell Attach to Host Process",
+      "processId": "${command:PickPSHostProcess}",
+      "runspaceId": 1
+    }
+  ]
 }
diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json
index a37044b519..23c9990db9 100644
--- a/examples/.vscode/settings.json
+++ b/examples/.vscode/settings.json
@@ -1,6 +1,6 @@
 {
-    // Use a custom PowerShell Script Analyzer settings file for this workspace.
-    // Relative paths for this setting are always relative to the workspace root dir.
-    "powershell.scriptAnalysis.settingsPath": "./PSScriptAnalyzerSettings.psd1",
-    "files.defaultLanguage": "powershell",
+  // Use a custom PowerShell Script Analyzer settings file for this workspace.
+  // Relative paths for this setting are always relative to the workspace root dir.
+  "powershell.scriptAnalysis.settingsPath": "./PSScriptAnalyzerSettings.psd1",
+  "files.defaultLanguage": "powershell"
 }
diff --git a/examples/.vscode/tasks.json b/examples/.vscode/tasks.json
index 9c5bf45ce1..8ae38829cc 100644
--- a/examples/.vscode/tasks.json
+++ b/examples/.vscode/tasks.json
@@ -30,73 +30,60 @@
 // ${cwd} the task runner's current working directory on startup
 // ${lineNumber} the current selected line number in the active file
 {
-    "version": "2.0.0",
-    "windows": {
-        "options": {
-            "shell": {
-                "executable": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
-                "args": [
-                    "-NoProfile",
-                    "-ExecutionPolicy",
-                    "Bypass",
-                    "-Command"
-                ]
-            }
-        }
+  "version": "2.0.0",
+  "windows": {
+    "options": {
+      "shell": {
+        "executable": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+        "args": ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
+      }
+    }
+  },
+  "linux": {
+    "options": {
+      "shell": {
+        "executable": "/usr/bin/pwsh",
+        "args": ["-NoProfile", "-Command"]
+      }
+    }
+  },
+  "osx": {
+    "options": {
+      "shell": {
+        "executable": "/usr/local/bin/pwsh",
+        "args": ["-NoProfile", "-Command"]
+      }
+    }
+  },
+  "tasks": [
+    {
+      "label": "Clean",
+      "type": "shell",
+      "command": "Invoke-PSake build.ps1 -taskList Clean"
     },
-    "linux": {
-        "options": {
-            "shell": {
-                "executable": "/usr/bin/pwsh",
-                "args": [
-                    "-NoProfile",
-                    "-Command"
-                ]
-            }
-        }
+    {
+      "label": "Build",
+      "type": "shell",
+      "command": "Invoke-PSake build.ps1 -taskList Build",
+      "group": {
+        "kind": "build",
+        "isDefault": true
+      }
     },
-    "osx": {
-        "options": {
-            "shell": {
-                "executable": "/usr/local/bin/pwsh",
-                "args": [
-                    "-NoProfile",
-                    "-Command"
-                ]
-            }
-        }
+    {
+      "label": "Test",
+      "type": "shell",
+      "command": "Invoke-Pester -PesterOption @{IncludeVSCodeMarker=$true}",
+      "group": {
+        "kind": "test",
+        "isDefault": true
+      },
+      "problemMatcher": ["$pester"]
     },
-    "tasks": [
-        {
-            "label": "Clean",
-            "type": "shell",
-            "command": "Invoke-PSake build.ps1 -taskList Clean"
-        },
-        {
-            "label": "Build",
-            "type": "shell",
-            "command": "Invoke-PSake build.ps1 -taskList Build",
-            "group": {
-                "kind": "build",
-                "isDefault": true
-            }
-        },
-        {
-            "label": "Test",
-            "type": "shell",
-            "command": "Invoke-Pester -PesterOption @{IncludeVSCodeMarker=$true}",
-            "group": {
-                "kind": "test",
-                "isDefault": true
-            },
-            "problemMatcher": [
-                "$pester"
-            ]
-        },
-        {
-            "label": "Publish",
-            "type": "shell",
-            "command": "Invoke-PSake build.ps1 -taskList Publish"
-        }
-    ]
+    {
+      "label": "Publish",
+      "type": "shell",
+      "command": "Invoke-PSake build.ps1 -taskList Publish"
+    }
+  ]
 }
diff --git a/examples/ChildDebugSessionAttach.ps1 b/examples/ChildDebugSessionAttach.ps1
new file mode 100644
index 0000000000..c06a57f2a7
--- /dev/null
+++ b/examples/ChildDebugSessionAttach.ps1
@@ -0,0 +1,22 @@
+# Example on how Start-DebugAttachSession can be used to attach to another
+# process. This launches a child process that runs ChildDebugSessionTarget.ps1
+# but it can be adapted to attach to any other PowerShell process that is
+# either already running or started like this example. To test this example,
+# add a breakpoint to ChildDebugSessionTarget.ps1, select the
+# 'PowerShell Launch Current File' configuration and press F5.
+
+$pipeName = "TestPipe-$(New-Guid)"
+$scriptPath = Join-Path -Path $PSScriptRoot -ChildPath 'ChildDebugSessionTarget.ps1'
+
+$procParams = @{
+    FilePath = 'pwsh'
+    ArgumentList = ('-CustomPipeName {0} -File "{1}" -WaitForAttach' -f $pipeName, $scriptPath)
+    PassThru = $true
+}
+$proc = Start-Process @procParams
+
+Start-DebugAttachSession -CustomPipeName $pipeName -RunspaceId 1
+
+# We need to ensure this debug session stays alive until the process exits. If
+# we exit early then the child debug session will also exit.
+$proc | Wait-Process
diff --git a/examples/ChildDebugSessionTarget.ps1 b/examples/ChildDebugSessionTarget.ps1
new file mode 100644
index 0000000000..ed4c9f2a6a
--- /dev/null
+++ b/examples/ChildDebugSessionTarget.ps1
@@ -0,0 +1,31 @@
+[CmdletBinding()]
+param (
+    [Parameter()]
+    [switch]
+    $WaitForAttach
+)
+
+if ($WaitForAttach) {
+    # For an attach request we need to wait for the debug pipe runspace to be
+    # opened before continuing. There is no builtin way to do this so we
+    # poll the runspace list until a new one is created.
+    $runspaces = Get-Runspace
+    while ($true) {
+        if (Get-Runspace | Where-Object { $_.Id -notin $runspaces.Id }) {
+            break
+        }
+        Start-Sleep -Seconds 1
+    }
+
+    # Windows PowerShell 5.1 will not sync breakpoints until the debugger has
+    # stopped at least once. We use Wait-Debugger to make this happen.
+    if ($PSVersionTable.PSVersion -lt '6.0') {
+        Wait-Debugger
+    }
+    else {
+        Start-Sleep -Seconds 1  # Give the debugger time to sync breakpoints
+    }
+}
+
+$processInfo = "This process is running with PID $PID and has runspace ID $([Runspace]::DefaultRunspace.Id)"
+Write-Host $processInfo  # Place breakpoint here
diff --git a/extension-dev.code-workspace b/extension-dev.code-workspace
deleted file mode 100644
index d4e7a6aa4a..0000000000
--- a/extension-dev.code-workspace
+++ /dev/null
@@ -1,231 +0,0 @@
-{
-  "folders": [
-    {
-      "name": "Client",
-      "path": "."
-    },
-    {
-      "name": "Server",
-      "path": "../PowerShellEditorServices"
-    }
-  ],
-  "extensions": {
-    "recommendations": [
-      "davidanson.vscode-markdownlint",
-      "dbaeumer.vscode-eslint",
-      "editorconfig.editorconfig",
-      "josefpihrt-vscode.roslynator",
-      "ms-azure-devops.azure-pipelines",
-      "ms-dotnettools.csharp",
-      "ms-vscode.powershell",
-      "hbenl.vscode-mocha-test-adapter",
-      "connor4312.esbuild-problem-matchers"
-    ]
-  },
-  "settings": {
-    "window.title": "PowerShell VS Code Extension Development",
-    "debug.onTaskErrors": "prompt",
-    "editor.tabSize": 4,
-    "editor.insertSpaces": true,
-    "files.trimTrailingWhitespace": true,
-    "files.insertFinalNewline": true,
-    "files.associations": {
-      "**/snippets/*.json": "jsonc", // Use JSONC instead of JSON because that's how VS Code interprets snippet files, and it enables better source documentation.
-      "**/.vsts-ci/**/*.yml": "azure-pipelines",
-    },
-    // Ignore the Markdown rule:
-    "markdownlint.config": {
-      "MD024": false // no-duplicate-header
-    },
-    "powershell.cwd": "Client",
-    "powershell.codeFormatting.autoCorrectAliases": true,
-    "powershell.codeFormatting.avoidSemicolonsAsLineTerminators": true,
-    "powershell.codeFormatting.newLineAfterCloseBrace": false,
-    "powershell.codeFormatting.trimWhitespaceAroundPipe": true,
-    "powershell.codeFormatting.useCorrectCasing": true,
-    "powershell.codeFormatting.whitespaceBeforeOpenBrace": false,
-    "powershell.codeFormatting.whitespaceBetweenParameters": true,
-    "powershell.codeFormatting.pipelineIndentationStyle": "IncreaseIndentationForFirstPipeline",
-    "typescript.tsdk": "Client/node_modules/typescript/lib", // Lock the TypeScript SDK path to the version we use
-    "typescript.format.semicolons": "insert", // Code actions like "organize imports" ignore ESLint, so we need this here
-    "eslint.format.enable": true, // Enable ESLint as defaut formatter so quick fixes can be applied directly
-    "[typescript]": {
-      "editor.defaultFormatter": "dbaeumer.vscode-eslint",
-      "editor.formatOnPaste": true,
-      "editor.formatOnSave": true,
-      "editor.formatOnSaveMode": "modificationsIfAvailable"
-    },
-    "mochaExplorer.configFile": ".mocharc.json",
-    "mochaExplorer.launcherScript": "test/runTests",
-    "mochaExplorer.autoload": false, // The test instance pops up every time discovery or run is done, this could be annoying on startup.
-    "mochaExplorer.debuggerPort": 59229, // Matches the launch config, we dont want to use the default port as we are launching a duplicate instance of vscode and it might conflict.
-    "mochaExplorer.ipcRole": "server",
-    "mochaExplorer.ipcTimeout": 30000, // 30 seconds
-    "testExplorer.useNativeTesting": true,
-    "mochaExplorer.env": {
-      "VSCODE_VERSION": "insiders",
-      "ELECTRON_RUN_AS_NODE": null
-    }
-  },
-  "tasks": {
-    "version": "2.0.0",
-    "windows": {
-      "options": {
-        "shell": {
-          "executable": "pwsh.exe",
-          "args": [
-            "-NoProfile",
-            "-ExecutionPolicy",
-            "Bypass",
-            "-Command"
-          ]
-        }
-      }
-    },
-    "linux": {
-      "options": {
-        "shell": {
-          "executable": "pwsh",
-          "args": [
-            "-NoProfile",
-            "-Command"
-          ]
-        }
-      }
-    },
-    "osx": {
-      "options": {
-        "shell": {
-          "executable": "/usr/local/bin/pwsh",
-          "args": [
-            "-NoProfile",
-            "-Command"
-          ]
-        }
-      }
-    },
-    "tasks": [
-      {
-        "label": "Build",
-        "type": "shell",
-        "options": {
-          "cwd": "${workspaceFolder:Client}"
-        },
-        "command": "Invoke-Build Build",
-        "problemMatcher": [
-          "$msCompile",
-          "$tsc"
-        ],
-        "group": {
-          "kind": "build",
-          "isDefault": true
-        }
-      },
-      {
-        "label": "Test Client",
-        "type": "shell",
-        "options": {
-          "cwd": "${workspaceFolder:Client}"
-        },
-        "command": "Invoke-Build Test",
-        "problemMatcher": [
-          "$msCompile",
-          "$tsc"
-        ],
-        "group": {
-          "kind": "test",
-          "isDefault": true
-        }
-      },
-      {
-        "label": "Test Server",
-        "type": "shell",
-        "options": {
-          "cwd": "${workspaceFolder:Server}"
-        },
-        "problemMatcher": [
-          "$msCompile"
-        ],
-        "command": "Invoke-Build TestPS74",
-        "group": {
-          "kind": "test",
-          "isDefault": true
-        }
-      },
-      {
-        "label": "Invoke-Build Client",
-        "type": "shell",
-        "options": {
-          "cwd": "${workspaceFolder:Client}"
-        },
-        "command": "Invoke-Build ${input:clientBuildCommand}",
-        "group": "build"
-      },
-      {
-        "label": "Invoke-Build Server",
-        "type": "shell",
-        "options": {
-          "cwd": "${workspaceFolder:Server}"
-        },
-        "command": "Invoke-Build ${input:serverBuildCommand}",
-        "group": "build"
-      }
-    ],
-    "inputs": [
-      {
-        "type": "pickString",
-        "id": "clientBuildCommand",
-        "description": "Which Invoke-Build Client Task?",
-        "options": [
-          "Restore",
-          "Clean",
-          "Build",
-          "Test",
-          "Package"
-        ],
-        "default": "Clean"
-      },
-      {
-        "type": "pickString",
-        "id": "serverBuildCommand",
-        "description": "Which Invoke-Build Server Task?",
-        "options": [
-          "SetupDotNet",
-          "BinClean",
-          "Clean",
-          "Build",
-          "Test",
-          "TestPS74",
-          "TestE2EPwsh",
-          "TestPS51",
-          "TestE2EPowerShell",
-        ],
-        "default": "Clean"
-      }
-    ]
-  },
-  "launch": {
-    "version": "0.2.0",
-    "configurations": [
-      {
-        // https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
-        "name": "Attach to Editor Services",
-        "type": "coreclr",
-        "request": "attach",
-        "processId": "${command:pickProcess}",
-        "justMyCode": false,
-        "suppressJITOptimizations": true,
-        "symbolOptions": {
-          "searchPaths": [],
-          "searchMicrosoftSymbolServer": true,
-          "searchNuGetOrgSymbolServer": true
-        },
-        "presentation": {
-          "hidden": false,
-          "group": "test",
-          "order": 3
-        }
-      }
-    ]
-  }
-}
diff --git a/package-lock.json b/package-lock.json
index f185d2941a..523f0587e1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,245 +1,218 @@
 {
   "name": "powershell",
-  "version": "2024.2.2",
+  "version": "2025.2.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "powershell",
-      "version": "2024.2.2",
+      "version": "2025.2.0",
       "license": "SEE LICENSE IN LICENSE.txt",
       "dependencies": {
-        "@types/vscode": "~1.94.0",
-        "@vscode/extension-telemetry": "^0.9.7",
-        "node-fetch": "^2.7.0",
-        "semver": "^7.6.3",
+        "@vscode/extension-telemetry": "^0.9.9",
+        "semver": "^7.7.2",
         "untildify": "^4.0.0",
         "uuid": "^9.0.1",
         "vscode-languageclient": "^9.0.1",
         "vscode-languageserver-protocol": "^3.17.5"
       },
       "devDependencies": {
-        "@vscode/vsce": "^3.1.1",
-        "esbuild": "^0.21.5"
+        "@vscode/vsce": "^3.6.0",
+        "esbuild": "^0.25.8"
       },
       "engines": {
-        "vscode": "^1.94.0"
+        "vscode": "^1.101.0"
       },
       "optionalDependencies": {
-        "@types/mocha": "^10.0.9",
+        "@eslint/js": "^9.26.0",
         "@types/mock-fs": "^4.13.4",
-        "@types/node": "^20.16.11",
-        "@types/node-fetch": "^2.6.11",
-        "@types/rewire": "^2.5.30",
-        "@types/semver": "^7.5.8",
-        "@types/sinon": "^17.0.3",
+        "@types/node": "^22.16.5",
+        "@types/semver": "^7.7.0",
+        "@types/sinon": "^17.0.4",
         "@types/ungap__structured-clone": "^1.2.0",
         "@types/uuid": "^9.0.8",
-        "@types/vscode": "~1.94.0",
-        "@typescript-eslint/eslint-plugin": "^8.8.1",
-        "@typescript-eslint/parser": "^8.8.1",
-        "@ungap/structured-clone": "^1.2.0",
+        "@types/vscode": "~1.101.0",
+        "@ungap/structured-clone": "^1.3.0",
         "@vscode/debugprotocol": "^1.68.0",
-        "@vscode/test-electron": "^2.4.1",
-        "eslint": "^8.57.0",
-        "eslint-plugin-header": "^3.1.1",
-        "glob": "^11.0.0",
-        "mocha": "^10.7.3",
-        "mocha-explorer-launcher-scripts": "^0.4.0",
-        "mocha-multi-reporters": "^1.5.1",
-        "mock-fs": "^5.3.0",
-        "rewire": "^7.0.0",
-        "sinon": "^18.0.1",
-        "source-map-support": "^0.5.21",
-        "typescript": "^5.6.3"
-      }
+        "@vscode/test-cli": "^0.0.10",
+        "@vscode/test-electron": "^2.5.2",
+        "esbuild-register": "^3.6.0",
+        "eslint": "^9.31.0",
+        "eslint-config-prettier": "^10.1.8",
+        "mock-fs": "^5.5.0",
+        "prettier": "^3.6.2",
+        "prettier-plugin-organize-imports": "^4.2.0",
+        "sinon": "^19.0.5",
+        "typescript": "^5.8.3",
+        "typescript-eslint": "^8.38.0"
+      }
+    },
+    "node_modules/@azu/format-text": {
+      "version": "1.0.2",
+      "integrity": "sha1-q9RtqyQi4xK9G/428NQnq2A5gl0=",
+      "dev": true,
+      "license": "BSD-3-Clause"
     },
-    "node_modules/@azure/abort-controller": {
-      "version": "1.1.0",
-      "integrity": "sha1-eI7nhFelWvihrTQqyxgjg9IRkkk=",
+    "node_modules/@azu/style-format": {
+      "version": "1.0.1",
+      "integrity": "sha1-s2Q68MX+6dU+aal8g1xAS9yA95I=",
       "dev": true,
+      "license": "WTFPL",
       "dependencies": {
-        "tslib": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=12.0.0"
+        "@azu/format-text": "^1.0.1"
       }
     },
-    "node_modules/@azure/core-auth": {
-      "version": "1.8.0",
-      "integrity": "sha1-KBtKbTMJw+exW82WfwHUx5rkodY=",
+    "node_modules/@azure/abort-controller": {
+      "version": "2.1.2",
+      "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@azure/abort-controller": "^2.0.0",
-        "@azure/core-util": "^1.1.0",
         "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": {
-      "version": "2.1.2",
-      "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=",
+    "node_modules/@azure/core-auth": {
+      "version": "1.10.0",
+      "integrity": "sha1-aNunA2CA4dnVaZxOSCFKt5b6c60=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
+        "@azure/abort-controller": "^2.0.0",
+        "@azure/core-util": "^1.11.0",
         "tslib": "^2.6.2"
       },
       "engines": {
-        "node": ">=18.0.0"
+        "node": ">=20.0.0"
       }
     },
     "node_modules/@azure/core-client": {
-      "version": "1.9.2",
-      "integrity": "sha1-b8ac7igWiDq2xc3WU+5PL/l3T3Q=",
+      "version": "1.10.0",
+      "integrity": "sha1-n07JyJpjUWknhArmIMYOgRoLVKM=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@azure/abort-controller": "^2.0.0",
         "@azure/core-auth": "^1.4.0",
-        "@azure/core-rest-pipeline": "^1.9.1",
+        "@azure/core-rest-pipeline": "^1.20.0",
         "@azure/core-tracing": "^1.0.0",
         "@azure/core-util": "^1.6.1",
         "@azure/logger": "^1.0.0",
         "tslib": "^2.6.2"
       },
       "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@azure/core-client/node_modules/@azure/abort-controller": {
-      "version": "2.1.2",
-      "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
+        "node": ">=20.0.0"
       }
     },
     "node_modules/@azure/core-rest-pipeline": {
-      "version": "1.17.0",
-      "integrity": "sha1-Vdr6EJNVPFSe1tjbymmqUFx7OqM=",
+      "version": "1.22.0",
+      "integrity": "sha1-duRKdQk6L0d/xUuE9GBJ3CzmWAA=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@azure/abort-controller": "^2.0.0",
         "@azure/core-auth": "^1.8.0",
         "@azure/core-tracing": "^1.0.1",
-        "@azure/core-util": "^1.9.0",
+        "@azure/core-util": "^1.11.0",
         "@azure/logger": "^1.0.0",
-        "http-proxy-agent": "^7.0.0",
-        "https-proxy-agent": "^7.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": {
-      "version": "2.1.2",
-      "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=",
-      "dev": true,
-      "dependencies": {
+        "@typespec/ts-http-runtime": "^0.3.0",
         "tslib": "^2.6.2"
       },
       "engines": {
-        "node": ">=18.0.0"
+        "node": ">=20.0.0"
       }
     },
     "node_modules/@azure/core-tracing": {
-      "version": "1.2.0",
-      "integrity": "sha1-e+XVPDUi1jnPGQQsvNsZ9xvDWrI=",
+      "version": "1.3.0",
+      "integrity": "sha1-NBFT9bKSdTnriYV3ZR7kjOmN2iU=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "tslib": "^2.6.2"
       },
       "engines": {
-        "node": ">=18.0.0"
+        "node": ">=20.0.0"
       }
     },
     "node_modules/@azure/core-util": {
-      "version": "1.10.0",
-      "integrity": "sha1-zzFjOC1ANDlyhIyRSGmGTfXUS9s=",
+      "version": "1.13.0",
+      "integrity": "sha1-/Cg0/FHh4rt0twwoS0D4JNhnQio=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@azure/abort-controller": "^2.0.0",
+        "@typespec/ts-http-runtime": "^0.3.0",
         "tslib": "^2.6.2"
       },
       "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@azure/core-util/node_modules/@azure/abort-controller": {
-      "version": "2.1.2",
-      "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
+        "node": ">=20.0.0"
       }
     },
     "node_modules/@azure/identity": {
-      "version": "4.4.1",
-      "integrity": "sha1-SQ+irSZ4Yimvo2QRiSu1Pfo0eNM=",
+      "version": "4.10.2",
+      "integrity": "sha1-ZgnOOYgk/wu1PxrRBDqfHMk+Vrg=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@azure/abort-controller": "^1.0.0",
-        "@azure/core-auth": "^1.5.0",
+        "@azure/abort-controller": "^2.0.0",
+        "@azure/core-auth": "^1.9.0",
         "@azure/core-client": "^1.9.2",
-        "@azure/core-rest-pipeline": "^1.1.0",
+        "@azure/core-rest-pipeline": "^1.17.0",
         "@azure/core-tracing": "^1.0.0",
-        "@azure/core-util": "^1.3.0",
+        "@azure/core-util": "^1.11.0",
         "@azure/logger": "^1.0.0",
-        "@azure/msal-browser": "^3.14.0",
-        "@azure/msal-node": "^2.9.2",
-        "events": "^3.0.0",
-        "jws": "^4.0.0",
-        "open": "^8.0.0",
-        "stoppable": "^1.1.0",
+        "@azure/msal-browser": "^4.2.0",
+        "@azure/msal-node": "^3.5.0",
+        "open": "^10.1.0",
         "tslib": "^2.2.0"
       },
       "engines": {
-        "node": ">=18.0.0"
+        "node": ">=20.0.0"
       }
     },
     "node_modules/@azure/logger": {
-      "version": "1.1.4",
-      "integrity": "sha1-Ijy/K0JN+mZHjOmk9XX1nG83l2g=",
+      "version": "1.3.0",
+      "integrity": "sha1-VQHPhdT1JjBgKozHXfdlaMlpqCc=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
+        "@typespec/ts-http-runtime": "^0.3.0",
         "tslib": "^2.6.2"
       },
       "engines": {
-        "node": ">=18.0.0"
+        "node": ">=20.0.0"
       }
     },
     "node_modules/@azure/msal-browser": {
-      "version": "3.26.1",
-      "integrity": "sha1-L0No15l2gtsw3KUuMvysNj+g760=",
+      "version": "4.16.0",
+      "integrity": "sha1-FbFWf2hz9ksNQ2ti8QaM4B/H8JA=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@azure/msal-common": "14.15.0"
+        "@azure/msal-common": "15.9.0"
       },
       "engines": {
         "node": ">=0.8.0"
       }
     },
     "node_modules/@azure/msal-common": {
-      "version": "14.15.0",
-      "integrity": "sha1-DiesC7iP4QD0+NFgW2TVwmhjalU=",
+      "version": "15.9.0",
+      "integrity": "sha1-SbYqeY3RtHtBDm5UD9NgCfHU0Y4=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
     },
     "node_modules/@azure/msal-node": {
-      "version": "2.15.0",
-      "integrity": "sha1-UL+OaSpmVgJ8Bzp12HeopHiq/f0=",
+      "version": "3.6.4",
+      "integrity": "sha1-k38ON+c9SN+2irjzpQOgzyGmUoU=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@azure/msal-common": "14.15.0",
+        "@azure/msal-common": "15.9.0",
         "jsonwebtoken": "^9.0.0",
         "uuid": "^8.3.0"
       },
@@ -251,411 +224,497 @@
       "version": "8.3.2",
       "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "uuid": "dist/bin/uuid"
       }
     },
+    "node_modules/@babel/code-frame": {
+      "version": "7.27.1",
+      "integrity": "sha1-IA9xXmbVKiOyIalDVTSpHME61b4=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.27.1",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.27.1",
+      "integrity": "sha1-pwVNzBRaln3U3I/uhFpXwTFsnfg=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@bcoe/v8-coverage": {
+      "version": "0.2.3",
+      "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk=",
+      "license": "MIT",
+      "optional": true
+    },
     "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.21.5",
-      "integrity": "sha1-xxhKMmUz/N8bjuBzPiHHE7l1V18=",
+      "version": "0.25.8",
+      "integrity": "sha1-oUFJA7s4AnOC+F8D3aYGUFZ1dyc=",
       "cpu": [
         "ppc64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "aix"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.21.5",
-      "integrity": "sha1-mwQ4T7dxkm36bXrQQyTssqubLig=",
+      "version": "0.25.8",
+      "integrity": "sha1-lqjyypHGzSnqkLGvedg3Yci6AFk=",
       "cpu": [
         "arm"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.21.5",
-      "integrity": "sha1-Cdm0NXeA2p6jp9+4M6Hx/0ObQFI=",
+      "version": "0.25.8",
+      "integrity": "sha1-yFmZQInpdnIkJpiEBh+J2ub7UcY=",
       "cpu": [
         "arm64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-KZGOwtt1TO3LbBsE3ozWVHr2Rh4=",
+      "version": "0.25.8",
+      "integrity": "sha1-o6YmxP7EoCSp+ox2ecOZlukpFvA=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.21.5",
-      "integrity": "sha1-5JW1OWYOUWkPOSivUKdvsKbM/yo=",
+      "version": "0.25.8",
+      "integrity": "sha1-peElLKKYPVZq8cDqOa3tZXNvxm0=",
       "cpu": [
         "arm64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-wTg4+lc3KDmr3dyR1xVCzuouHiI=",
+      "version": "0.25.8",
+      "integrity": "sha1-UnGw3yuxLOjfiGcEv90cfMAThdI=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.21.5",
-      "integrity": "sha1-ZGuYmqIL+J/Qcd1dv61po1QuVQ4=",
+      "version": "0.25.8",
+      "integrity": "sha1-0KDn/fGXM7i7FWa4HfGqC7fkato=",
       "cpu": [
         "arm64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-qmFc/ICvlU00WJBuOMoiwYz1wmE=",
+      "version": "0.25.8",
+      "integrity": "sha1-Leiy4ImdCPHLHvMSjhWWFufoU0M=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.21.5",
-      "integrity": "sha1-/G/RGorKVsH284lPK+oEefj2Jrk=",
+      "version": "0.25.8",
+      "integrity": "sha1-zNnikcJM2NkULYGdRj4ucgDSWxk=",
       "cpu": [
         "arm"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.21.5",
-      "integrity": "sha1-cKxvoU9ct+H3+Ie8/7aArQmSK1s=",
+      "version": "0.25.8",
+      "integrity": "sha1-pCCe+twMKXVxZFhISk6QwjfEiuk=",
       "cpu": [
         "arm64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.21.5",
-      "integrity": "sha1-MnH1Oz+T49CT1RjRZJ1taNNG7eI=",
+      "version": "0.25.8",
+      "integrity": "sha1-AGrRU20MKyj7OhzwtTvLhar5LE0=",
       "cpu": [
         "ia32"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.21.5",
-      "integrity": "sha1-7WLgQjjFcCauqDHFoTC3PA+fJt8=",
+      "version": "0.25.8",
+      "integrity": "sha1-Ens/v7LC4IsTl+mFky9xjwmo9cQ=",
       "cpu": [
         "loong64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.21.5",
-      "integrity": "sha1-55uOtIvzsQb63sGsgkD7l7TmTL4=",
+      "version": "0.25.8",
+      "integrity": "sha1-g30USVF3keP6fYJnWi0G2fVss0A=",
       "cpu": [
         "mips64el"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.21.5",
-      "integrity": "sha1-XyIDhgoUO5kZ04PvdXNSH7FUw+Q=",
+      "version": "0.25.8",
+      "integrity": "sha1-qi472Tq43whCEvGJXKSwPELZ4P4=",
       "cpu": [
         "ppc64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.21.5",
-      "integrity": "sha1-B7yv2ZMi1a9i9hjLnmqbf0u4Jdw=",
+      "version": "0.25.8",
+      "integrity": "sha1-o0BiDjEJP+9ydn3SirBCFLNEIIM=",
       "cpu": [
         "riscv64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.21.5",
-      "integrity": "sha1-t8z2hnUdaj5EuGJ6uryL4+9i2N4=",
+      "version": "0.25.8",
+      "integrity": "sha1-3f7SZsjBP177MQWgzUf23NDnnnE=",
       "cpu": [
         "s390x"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-bY8Mdo4HDmQwmvgAS7lOaKsrs7A=",
+      "version": "0.25.8",
+      "integrity": "sha1-mk94x1wFHowGAYPrs5omm6k2oqw=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.8",
+      "integrity": "sha1-kCyA4dZ4BHkmOHIwvAN+Y+AGl9A=",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-u+Qw9g03jsuI3sshnGAmZzh6YEc=",
+      "version": "0.25.8",
+      "integrity": "sha1-LZ60aSrdJoH/BaFM6Z3lT77XB5w=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "netbsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.8",
+      "integrity": "sha1-icO5mMbec52zirf7cainaz+oSkU=",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-mdHPKTcnlWDSEEgh9czOIgyyr3A=",
+      "version": "0.25.8",
+      "integrity": "sha1-LwFhXPRysOSMB3BFz9lrXBSTZcw=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "openbsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.25.8",
+      "integrity": "sha1-ogH3IM0sPr+aYDP8w/6waaVLUJo=",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-CHQVEsENUpVmurqDe0/gUsjzSHs=",
+      "version": "0.25.8",
+      "integrity": "sha1-BwRsl3mFozNGZ/GearOgGoCGKvs=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "sunos"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.21.5",
-      "integrity": "sha1-Z1tzhTmEESQHNQFhRKsumaYPx10=",
+      "version": "0.25.8",
+      "integrity": "sha1-SlRwyvDRYSfAXUgz1JNCE8aTktE=",
       "cpu": [
         "arm64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.21.5",
-      "integrity": "sha1-G/w86YqmypoJaeTSr3IUTFnBGTs=",
+      "version": "0.25.8",
+      "integrity": "sha1-PePoRwt7Mo2Z28Pp7B6s4gflu8Q=",
       "cpu": [
         "ia32"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.21.5",
-      "integrity": "sha1-rK01HVgtFXuxRVNdsqb/U91RS1w=",
+      "version": "0.25.8",
+      "integrity": "sha1-YQ1+pTnS/Nvjkje1zBdessRFH5w=",
       "cpu": [
         "x64"
       ],
-      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@eslint-community/eslint-utils": {
-      "version": "4.4.0",
-      "integrity": "sha1-ojUU6Pua8SadX3eIqlVnmNYca1k=",
+      "version": "4.7.0",
+      "integrity": "sha1-YHCEYwxsAzmSoILebm+8GotSF1o=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "eslint-visitor-keys": "^3.3.0"
+        "eslint-visitor-keys": "^3.4.3"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      },
       "peerDependencies": {
         "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
       }
     },
+    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "integrity": "sha1-DNcv6FUOPC6uFWqWpN3c0cisWAA=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
     "node_modules/@eslint-community/regexpp": {
-      "version": "4.11.1",
-      "integrity": "sha1-pUe638cZ6z5fS1VjJeVC++nXoY8=",
+      "version": "4.12.1",
+      "integrity": "sha1-z8bP/jnfOQo4Qc3iq8z5Lqp64OA=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
       }
     },
-    "node_modules/@eslint/eslintrc": {
-      "version": "2.1.4",
-      "integrity": "sha1-OIomnw8lwbatwxe1osVXFIlMcK0=",
+    "node_modules/@eslint/config-array": {
+      "version": "0.21.0",
+      "integrity": "sha1-q9vL0WsSTGOAgXZjkqTWtQn3JjY=",
+      "license": "Apache-2.0",
       "optional": true,
       "dependencies": {
-        "ajv": "^6.12.4",
-        "debug": "^4.3.2",
-        "espree": "^9.6.0",
-        "globals": "^13.19.0",
-        "ignore": "^5.2.0",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^4.1.0",
-        "minimatch": "^3.1.2",
-        "strip-json-comments": "^3.1.1"
+        "@eslint/object-schema": "^2.1.6",
+        "debug": "^4.3.1",
+        "minimatch": "^3.1.2"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+    "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "integrity": "sha1-q5tFRGblqMw6GHvqrVgEEqnFuEM=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+    "node_modules/@eslint/config-array/node_modules/minimatch": {
       "version": "3.1.2",
       "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "brace-expansion": "^1.1.7"
@@ -664,68 +723,233 @@
         "node": "*"
       }
     },
-    "node_modules/@eslint/js": {
-      "version": "8.57.0",
-      "integrity": "sha1-pUF66EJ4c/HdCLcLNXS0U+Z7X38=",
+    "node_modules/@eslint/config-helpers": {
+      "version": "0.3.0",
+      "integrity": "sha1-PgmpDfuH4ABcdpR5HljpcHcnEoY=",
+      "license": "Apache-2.0",
       "optional": true,
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
-    "node_modules/@humanwhocodes/config-array": {
-      "version": "0.11.14",
-      "integrity": "sha1-145IGgOfdWbsyWYLTqf+ax/sRCs=",
+    "node_modules/@eslint/core": {
+      "version": "0.15.1",
+      "integrity": "sha1-1TDUQgnL/i+C74bWugh2AZbdO2A=",
+      "license": "Apache-2.0",
       "optional": true,
       "dependencies": {
-        "@humanwhocodes/object-schema": "^2.0.2",
-        "debug": "^4.3.1",
-        "minimatch": "^3.0.5"
+        "@types/json-schema": "^7.0.15"
       },
       "engines": {
-        "node": ">=10.10.0"
-      }
-    },
-    "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
-      "optional": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
-    "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
-      "version": "3.1.2",
-      "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=",
+    "node_modules/@eslint/eslintrc": {
+      "version": "3.3.1",
+      "integrity": "sha1-5V9/HdQAYA3QZtu6NJxMC6yRaWQ=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "brace-expansion": "^1.1.7"
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
       },
       "engines": {
-        "node": "*"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/@humanwhocodes/module-importer": {
-      "version": "1.0.1",
-      "integrity": "sha1-r1smkaIrRL6EewyoFkHF+2rQFyw=",
+    "node_modules/@eslint/eslintrc/node_modules/ajv": {
+      "version": "6.12.6",
+      "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
+      "license": "MIT",
       "optional": true,
-      "engines": {
-        "node": ">=12.22"
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
       },
       "funding": {
         "type": "github",
-        "url": "https://github.com/sponsors/nzakas"
+        "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "node_modules/@humanwhocodes/object-schema": {
-      "version": "2.0.3",
-      "integrity": "sha1-Siho111taWPkI7z5C3/RvjQ0CdM=",
-      "optional": true
+    "node_modules/@eslint/eslintrc/node_modules/argparse": {
+      "version": "2.0.1",
+      "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=",
+      "license": "Python-2.0",
+      "optional": true
+    },
+    "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "integrity": "sha1-q5tFRGblqMw6GHvqrVgEEqnFuEM=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+      "version": "3.1.2",
+      "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=",
+      "license": "ISC",
+      "optional": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/@eslint/js": {
+      "version": "9.31.0",
+      "integrity": "sha1-rbHzmVPYxHXEOEtntnVBsNcgbtg=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
+      }
+    },
+    "node_modules/@eslint/object-schema": {
+      "version": "2.1.6",
+      "integrity": "sha1-WDaatbWzyhF4gMD2wLDzL2lQ8k8=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/plugin-kit": {
+      "version": "0.3.4",
+      "integrity": "sha1-xrnxZelL9Nn91JPxwCipSq9fwcw=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "dependencies": {
+        "@eslint/core": "^0.15.1",
+        "levn": "^0.4.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@humanfs/core": {
+      "version": "0.19.1",
+      "integrity": "sha1-F8Vcp9Qmcz/jxWGQa4Fzwza0Cnc=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanfs/node": {
+      "version": "0.16.6",
+      "integrity": "sha1-7ioQ6qvRExmHvwSI/ZuCAXTNdl4=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "dependencies": {
+        "@humanfs/core": "^0.19.1",
+        "@humanwhocodes/retry": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+      "version": "0.3.1",
+      "integrity": "sha1-xypcdqn7rzSI4jGxPcUsDae6tCo=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "integrity": "sha1-r1smkaIrRL6EewyoFkHF+2rQFyw=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/retry": {
+      "version": "0.4.3",
+      "integrity": "sha1-wrnS43TuYsWG062+qHGZsdenpro=",
+      "license": "Apache-2.0",
+      "optional": true,
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@isaacs/balanced-match": {
+      "version": "4.0.1",
+      "integrity": "sha1-MIHa28NGBmG3UedZHX+upd853Sk=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/@isaacs/brace-expansion": {
+      "version": "5.0.0",
+      "integrity": "sha1-Sz2rq32OdaQpQUqWvWe/TB0T4PM=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@isaacs/balanced-match": "^4.0.1"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      }
     },
     "node_modules/@isaacs/cliui": {
       "version": "8.0.2",
       "integrity": "sha1-s3Znt7wYHBaHgiWbq0JHT79StVA=",
       "devOptional": true,
+      "license": "ISC",
       "dependencies": {
         "string-width": "^5.1.2",
         "string-width-cjs": "npm:string-width@^4.2.0",
@@ -738,89 +962,126 @@
         "node": ">=12"
       }
     },
-    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=",
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=",
       "devOptional": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
+      "license": "MIT"
     },
-    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=",
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "ansi-regex": "^6.0.1"
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
       },
       "engines": {
         "node": ">=12"
       },
       "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@istanbuljs/schema": {
+      "version": "0.1.3",
+      "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "integrity": "sha1-eg7mAfYPmaIMfHxf8MgDiMEYm9Y=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.4",
+      "integrity": "sha1-c1gENDOy5dpWmqAsvEwSHaOvJ9c=",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.29",
+      "integrity": "sha1-pY0x6q2vksZpVoCy4dRkqbj79/w=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
     "node_modules/@microsoft/1ds-core-js": {
-      "version": "4.3.3",
-      "integrity": "sha1-+HAkGN3vebFBfwQNlGpJ4XOlBFQ=",
+      "version": "4.3.9",
+      "integrity": "sha1-kSqK1QiFFPBodHO6ePD2rPf2eZE=",
+      "license": "MIT",
       "dependencies": {
-        "@microsoft/applicationinsights-core-js": "3.3.3",
+        "@microsoft/applicationinsights-core-js": "3.3.9",
         "@microsoft/applicationinsights-shims": "3.0.1",
         "@microsoft/dynamicproto-js": "^2.0.3",
-        "@nevware21/ts-async": ">= 0.5.2 < 2.x",
-        "@nevware21/ts-utils": ">= 0.11.3 < 2.x"
+        "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+        "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
       }
     },
     "node_modules/@microsoft/1ds-post-js": {
-      "version": "4.3.3",
-      "integrity": "sha1-FR9adD1ZmOgCkZII7wqcX1Xv+HQ=",
+      "version": "4.3.9",
+      "integrity": "sha1-LSzc16kSzWw6x14Fd/6XasSK6Ys=",
+      "license": "MIT",
       "dependencies": {
-        "@microsoft/1ds-core-js": "4.3.3",
+        "@microsoft/1ds-core-js": "4.3.9",
         "@microsoft/applicationinsights-shims": "3.0.1",
         "@microsoft/dynamicproto-js": "^2.0.3",
-        "@nevware21/ts-async": ">= 0.5.2 < 2.x",
-        "@nevware21/ts-utils": ">= 0.11.3 < 2.x"
+        "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+        "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
       }
     },
     "node_modules/@microsoft/applicationinsights-channel-js": {
-      "version": "3.3.3",
-      "integrity": "sha1-bukPn7WxMzMgMxNTs/VBOFM0cY4=",
+      "version": "3.3.9",
+      "integrity": "sha1-QN0OaXRLduCae9ub2sHOMVCOha4=",
+      "license": "MIT",
       "dependencies": {
-        "@microsoft/applicationinsights-common": "3.3.3",
-        "@microsoft/applicationinsights-core-js": "3.3.3",
+        "@microsoft/applicationinsights-common": "3.3.9",
+        "@microsoft/applicationinsights-core-js": "3.3.9",
         "@microsoft/applicationinsights-shims": "3.0.1",
         "@microsoft/dynamicproto-js": "^2.0.3",
-        "@nevware21/ts-async": ">= 0.5.2 < 2.x",
-        "@nevware21/ts-utils": ">= 0.11.3 < 2.x"
+        "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+        "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
       },
       "peerDependencies": {
         "tslib": ">= 1.0.0"
       }
     },
     "node_modules/@microsoft/applicationinsights-common": {
-      "version": "3.3.3",
-      "integrity": "sha1-jEcJ7AqYANxwrZJYD9c7HCZOOVQ=",
+      "version": "3.3.9",
+      "integrity": "sha1-IZP6OgZT5ryUeTB7+W5dp32WEUI=",
+      "license": "MIT",
       "dependencies": {
-        "@microsoft/applicationinsights-core-js": "3.3.3",
+        "@microsoft/applicationinsights-core-js": "3.3.9",
         "@microsoft/applicationinsights-shims": "3.0.1",
         "@microsoft/dynamicproto-js": "^2.0.3",
-        "@nevware21/ts-utils": ">= 0.11.3 < 2.x"
+        "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
       },
       "peerDependencies": {
         "tslib": ">= 1.0.0"
       }
     },
     "node_modules/@microsoft/applicationinsights-core-js": {
-      "version": "3.3.3",
-      "integrity": "sha1-Z+C6y7gwv7dYzEo3BhqC31KkCRQ=",
+      "version": "3.3.9",
+      "integrity": "sha1-OpijcfM1njy22QKOHmlDUqYUNiI=",
+      "license": "MIT",
       "dependencies": {
         "@microsoft/applicationinsights-shims": "3.0.1",
         "@microsoft/dynamicproto-js": "^2.0.3",
-        "@nevware21/ts-async": ">= 0.5.2 < 2.x",
-        "@nevware21/ts-utils": ">= 0.11.3 < 2.x"
+        "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+        "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
       },
       "peerDependencies": {
         "tslib": ">= 1.0.0"
@@ -829,21 +1090,23 @@
     "node_modules/@microsoft/applicationinsights-shims": {
       "version": "3.0.1",
       "integrity": "sha1-OGW3Os6EBbnEYYzFxXHy/jh28G8=",
+      "license": "MIT",
       "dependencies": {
         "@nevware21/ts-utils": ">= 0.9.4 < 2.x"
       }
     },
     "node_modules/@microsoft/applicationinsights-web-basic": {
-      "version": "3.3.3",
-      "integrity": "sha1-twQmd5FzzT/OdF2k/AYrmdUAFMA=",
+      "version": "3.3.9",
+      "integrity": "sha1-fHT3Q8NvMpI8tgOb6oyn+jmIhHY=",
+      "license": "MIT",
       "dependencies": {
-        "@microsoft/applicationinsights-channel-js": "3.3.3",
-        "@microsoft/applicationinsights-common": "3.3.3",
-        "@microsoft/applicationinsights-core-js": "3.3.3",
+        "@microsoft/applicationinsights-channel-js": "3.3.9",
+        "@microsoft/applicationinsights-common": "3.3.9",
+        "@microsoft/applicationinsights-core-js": "3.3.9",
         "@microsoft/applicationinsights-shims": "3.0.1",
         "@microsoft/dynamicproto-js": "^2.0.3",
-        "@nevware21/ts-async": ">= 0.5.2 < 2.x",
-        "@nevware21/ts-utils": ">= 0.11.3 < 2.x"
+        "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+        "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
       },
       "peerDependencies": {
         "tslib": ">= 1.0.0"
@@ -852,25 +1115,29 @@
     "node_modules/@microsoft/dynamicproto-js": {
       "version": "2.0.3",
       "integrity": "sha1-ritAgGHj/wGpcHhCn8doMx4jklY=",
+      "license": "MIT",
       "dependencies": {
         "@nevware21/ts-utils": ">= 0.10.4 < 2.x"
       }
     },
     "node_modules/@nevware21/ts-async": {
-      "version": "0.5.2",
-      "integrity": "sha1-pBiD3GzMRma98VbpLzXzAD/T9vA=",
+      "version": "0.5.4",
+      "integrity": "sha1-UvhEndCzsWqjF6GLRmL2+xOhNfE=",
+      "license": "MIT",
       "dependencies": {
-        "@nevware21/ts-utils": ">= 0.11.3 < 2.x"
+        "@nevware21/ts-utils": ">= 0.11.6 < 2.x"
       }
     },
     "node_modules/@nevware21/ts-utils": {
-      "version": "0.11.4",
-      "integrity": "sha1-sLfqRs/xO51lrFMbWebc2N7AGGk="
+      "version": "0.12.5",
+      "integrity": "sha1-/jPBDRGui3JMyqox0tAQnRhgHaY=",
+      "license": "MIT"
     },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.stat": "2.0.5",
         "run-parallel": "^1.1.9"
@@ -882,7 +1149,8 @@
     "node_modules/@nodelib/fs.stat": {
       "version": "2.0.5",
       "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 8"
       }
@@ -890,7 +1158,8 @@
     "node_modules/@nodelib/fs.walk": {
       "version": "1.2.8",
       "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.scandir": "2.1.5",
         "fastq": "^1.6.0"
@@ -899,25 +1168,210 @@
         "node": ">= 8"
       }
     },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "integrity": "sha1-p36nQvqyV3UUVDTrHSMoz1ATrDM=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@secretlint/config-creator": {
+      "version": "10.2.1",
+      "integrity": "sha1-hnyIdB+MsimIcIkZ5IAzDl+makQ=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/types": "^10.2.1"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/config-loader": {
+      "version": "10.2.1",
+      "integrity": "sha1-is/xW09SqVaeQDzvmf7ijTMAQao=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/profiler": "^10.2.1",
+        "@secretlint/resolver": "^10.2.1",
+        "@secretlint/types": "^10.2.1",
+        "ajv": "^8.17.1",
+        "debug": "^4.4.1",
+        "rc-config-loader": "^4.1.3"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/core": {
+      "version": "10.2.1",
+      "integrity": "sha1-pycXT7/Xt/XY9jtGRwwUBbvoXKs=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/profiler": "^10.2.1",
+        "@secretlint/types": "^10.2.1",
+        "debug": "^4.4.1",
+        "structured-source": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/formatter": {
+      "version": "10.2.1",
+      "integrity": "sha1-oJ7QDbuRoXR23Dz4hTh3IrUiWIE=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/resolver": "^10.2.1",
+        "@secretlint/types": "^10.2.1",
+        "@textlint/linter-formatter": "^15.2.0",
+        "@textlint/module-interop": "^15.2.0",
+        "@textlint/types": "^15.2.0",
+        "chalk": "^5.4.1",
+        "debug": "^4.4.1",
+        "pluralize": "^8.0.0",
+        "strip-ansi": "^7.1.0",
+        "table": "^6.9.0",
+        "terminal-link": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/formatter/node_modules/chalk": {
+      "version": "5.4.1",
+      "integrity": "sha1-G0i/CWPsFY3OKqz2nAk64t0gktg=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/@secretlint/node": {
+      "version": "10.2.1",
+      "integrity": "sha1-T/CaJEUA7JxfnSpRK9BH67+py5c=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/config-loader": "^10.2.1",
+        "@secretlint/core": "^10.2.1",
+        "@secretlint/formatter": "^10.2.1",
+        "@secretlint/profiler": "^10.2.1",
+        "@secretlint/source-creator": "^10.2.1",
+        "@secretlint/types": "^10.2.1",
+        "debug": "^4.4.1",
+        "p-map": "^7.0.3"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/profiler": {
+      "version": "10.2.1",
+      "integrity": "sha1-61MsdUm2jGOd45l2DGVFKdgyflE=",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@secretlint/resolver": {
+      "version": "10.2.1",
+      "integrity": "sha1-UT4uSRbQn9lurY9wIICKU3N5TLg=",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@secretlint/secretlint-formatter-sarif": {
+      "version": "10.2.1",
+      "integrity": "sha1-Zed/UxORQEGzU60iFhM0GonVu4A=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "node-sarif-builder": "^3.2.0"
+      }
+    },
+    "node_modules/@secretlint/secretlint-rule-no-dotenv": {
+      "version": "10.2.1",
+      "integrity": "sha1-LCcr7s1sJittV0E8cv56rlfxs+s=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/types": "^10.2.1"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/secretlint-rule-preset-recommend": {
+      "version": "10.2.1",
+      "integrity": "sha1-wA+9IlcyjskJ2kNDGCbN+3KaIYU=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/source-creator": {
+      "version": "10.2.1",
+      "integrity": "sha1-GxwcZNtncDTinBo9t43M1g2onTI=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/types": "^10.2.1",
+        "istextorbinary": "^9.5.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@secretlint/types": {
+      "version": "10.2.1",
+      "integrity": "sha1-AY8lKjdUqf8jcbPhMiJtKBvoUVs=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@sindresorhus/merge-streams": {
+      "version": "2.3.0",
+      "integrity": "sha1-cZ33+0F2a8FDNp6qDdVtjch8mVg=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/@sinonjs/commons": {
       "version": "3.0.1",
       "integrity": "sha1-ECk1fkTKkBphVYX20nc428iQhM0=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "dependencies": {
         "type-detect": "4.0.8"
       }
     },
     "node_modules/@sinonjs/fake-timers": {
-      "version": "11.2.2",
-      "integrity": "sha1-UAY8w1dPSie9hFMYCgQXHIXMlpk=",
+      "version": "13.0.5",
+      "integrity": "sha1-NrnbwhrVVGSG6pFz1r6gY+sXF9U=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "dependencies": {
-        "@sinonjs/commons": "^3.0.0"
+        "@sinonjs/commons": "^3.0.1"
       }
     },
     "node_modules/@sinonjs/samsam": {
       "version": "8.0.2",
       "integrity": "sha1-5Dhr9mj/NslZSeVaONxfWJL8Jok=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "dependencies": {
         "@sinonjs/commons": "^3.0.1",
@@ -928,6 +1382,7 @@
     "node_modules/@sinonjs/samsam/node_modules/type-detect": {
       "version": "4.1.0",
       "integrity": "sha1-3rJFPo8I3K566YxiaxPd2wFVkGw=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=4"
@@ -936,51 +1391,149 @@
     "node_modules/@sinonjs/text-encoding": {
       "version": "0.7.3",
       "integrity": "sha1-KCBG8D6IbjUrLV9dpet1XgFFfz8=",
+      "license": "(Unlicense OR Apache-2.0)",
+      "optional": true
+    },
+    "node_modules/@textlint/ast-node-types": {
+      "version": "15.2.0",
+      "integrity": "sha1-IuSUaEDRkVL8c+bown180AXNUck=",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@textlint/linter-formatter": {
+      "version": "15.2.0",
+      "integrity": "sha1-1Eer6KlqTnMnMvYx/Cl7KQmfEe8=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@azu/format-text": "^1.0.2",
+        "@azu/style-format": "^1.0.1",
+        "@textlint/module-interop": "15.2.0",
+        "@textlint/resolver": "15.2.0",
+        "@textlint/types": "15.2.0",
+        "chalk": "^4.1.2",
+        "debug": "^4.4.1",
+        "js-yaml": "^3.14.1",
+        "lodash": "^4.17.21",
+        "pluralize": "^2.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "table": "^6.9.0",
+        "text-table": "^0.2.0"
+      }
+    },
+    "node_modules/@textlint/linter-formatter/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@textlint/linter-formatter/node_modules/pluralize": {
+      "version": "2.0.0",
+      "integrity": "sha1-crcmqm+sHt7uQiVsfY3CVrM1Z38=",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@textlint/linter-formatter/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@textlint/module-interop": {
+      "version": "15.2.0",
+      "integrity": "sha1-DWRIaS5nbCm5jM7A7cYBhTXdLdw=",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@textlint/resolver": {
+      "version": "15.2.0",
+      "integrity": "sha1-YeCdiui3Uhj7Tns5zPesHnIW4Kk=",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@textlint/types": {
+      "version": "15.2.0",
+      "integrity": "sha1-C9Wm++Tbwj1SbYtFJ80vUQVjMiE=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@textlint/ast-node-types": "15.2.0"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.8",
+      "integrity": "sha1-lYuRyZGxhnztMYvt6g4hXuBQcm4=",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/@types/istanbul-lib-coverage": {
+      "version": "2.0.6",
+      "integrity": "sha1-dznCMqH+6bTTzomF8xTAxtM1Sdc=",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.15",
+      "integrity": "sha1-WWoXRyM2lNUPatinhp/Lb1bPWEE=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@types/mocha": {
-      "version": "10.0.9",
-      "integrity": "sha1-EB6dqI0sAuWsiVKYLCOyJFJNZio=",
+      "version": "10.0.10",
+      "integrity": "sha1-kfYpBejSPL1mIlMS8jlFSiO+v6A=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@types/mock-fs": {
       "version": "4.13.4",
       "integrity": "sha1-5z7bS0iJ1E0j8eoC1u6+UKowsJo=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "@types/node": "*"
       }
     },
     "node_modules/@types/node": {
-      "version": "20.16.11",
-      "integrity": "sha1-m1RMPnFrFXesEucPkUUZPzJ1CzM=",
+      "version": "22.16.5",
+      "integrity": "sha1-zEasOZTNlXAA0MEQlaCx2uLqI2g=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "undici-types": "~6.19.2"
+        "undici-types": "~6.21.0"
       }
     },
-    "node_modules/@types/node-fetch": {
-      "version": "2.6.11",
-      "integrity": "sha1-mzm3hmXa4OgqCPAvSWfWLGb5XSQ=",
-      "optional": true,
-      "dependencies": {
-        "@types/node": "*",
-        "form-data": "^4.0.0"
-      }
+    "node_modules/@types/normalize-package-data": {
+      "version": "2.4.4",
+      "integrity": "sha1-VuLMJsOXwDj6sOOpF6EtXFkJ6QE=",
+      "dev": true,
+      "license": "MIT"
     },
-    "node_modules/@types/rewire": {
-      "version": "2.5.30",
-      "integrity": "sha1-da8QbSlOyIriEij+/jqlee/sJ24=",
-      "optional": true
+    "node_modules/@types/sarif": {
+      "version": "2.1.7",
+      "integrity": "sha1-2rTRa6dWjphGxFSodk8zxdmOVSQ=",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/semver": {
-      "version": "7.5.8",
-      "integrity": "sha1-gmioxXo+Sr0lwWXs02I323lIpV4=",
+      "version": "7.7.0",
+      "integrity": "sha1-ZMRBva4DOzeLbu99DD13wym5N44=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@types/sinon": {
-      "version": "17.0.3",
-      "integrity": "sha1-mqfmLwoyO56tF37SOjbqdXFBpfo=",
+      "version": "17.0.4",
+      "integrity": "sha1-/Zo+jgfuoaP0pvgqlyyJnld482k=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "@types/sinonjs__fake-timers": "*"
@@ -989,37 +1542,42 @@
     "node_modules/@types/sinonjs__fake-timers": {
       "version": "8.1.5",
       "integrity": "sha1-X9NZL/EMHpaV03cCDAMxFswoifI=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@types/ungap__structured-clone": {
       "version": "1.2.0",
       "integrity": "sha1-Ern9SrPmqCKS1gBISSsF63W0pI8=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@types/uuid": {
       "version": "9.0.8",
       "integrity": "sha1-dUW6T8PAA9bHVvZR878WPY8PKbo=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@types/vscode": {
-      "version": "1.94.0",
-      "integrity": "sha1-zNIRG27KumrU2hnC1SSCj6c64lA=",
+      "version": "1.101.0",
+      "integrity": "sha1-BiLKJuoVqvvlcNxNJZF8dcr+V4o=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.8.1",
-      "integrity": "sha1-k2S3VtTXi8vfb9PpNF5pJMaK03E=",
+      "version": "8.38.0",
+      "integrity": "sha1-blIg0W8mkattmDwXN91bNuF2Qbc=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.8.1",
-        "@typescript-eslint/type-utils": "8.8.1",
-        "@typescript-eslint/utils": "8.8.1",
-        "@typescript-eslint/visitor-keys": "8.8.1",
+        "@typescript-eslint/scope-manager": "8.38.0",
+        "@typescript-eslint/type-utils": "8.38.0",
+        "@typescript-eslint/utils": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0",
         "graphemer": "^1.4.0",
-        "ignore": "^5.3.1",
+        "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
-        "ts-api-utils": "^1.3.0"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1029,24 +1587,30 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
-        "eslint": "^8.57.0 || ^9.0.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
+        "@typescript-eslint/parser": "^8.38.0",
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <5.9.0"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+      "version": "7.0.5",
+      "integrity": "sha1-TLX2zX1MerA2VzjHrqiIuqbX79k=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">= 4"
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.8.1",
-      "integrity": "sha1-WVK6KoO9UgJLhy8/3I7S02Ngc7g=",
+      "version": "8.38.0",
+      "integrity": "sha1-ZyOl6ogeF3eVaxBFy6ML5eqDgpM=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.8.1",
-        "@typescript-eslint/types": "8.8.1",
-        "@typescript-eslint/typescript-estree": "8.8.1",
-        "@typescript-eslint/visitor-keys": "8.8.1",
+        "@typescript-eslint/scope-manager": "8.38.0",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1057,21 +1621,39 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0"
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <5.9.0"
+      }
+    },
+    "node_modules/@typescript-eslint/project-service": {
+      "version": "8.38.0",
+      "integrity": "sha1-SQB3H5QxYwJ/19ICCgYokgVrXi8=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@typescript-eslint/tsconfig-utils": "^8.38.0",
+        "@typescript-eslint/types": "^8.38.0",
+        "debug": "^4.3.4"
       },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.8.1",
-      "integrity": "sha1-tL6hwHharr/jxKsFntrqHEl35/8=",
+      "version": "8.38.0",
+      "integrity": "sha1-Wg78tcnPbkEhtY+Hly9WfGlSkiY=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@typescript-eslint/types": "8.8.1",
-        "@typescript-eslint/visitor-keys": "8.8.1"
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1081,15 +1663,33 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
+    "node_modules/@typescript-eslint/tsconfig-utils": {
+      "version": "8.38.0",
+      "integrity": "sha1-beTOIkp3lgGo32Z9tWUnJVxCxNA=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <5.9.0"
+      }
+    },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.8.1",
-      "integrity": "sha1-MfWexG6ToCtAn7TUBqNopZ+tMG4=",
+      "version": "8.38.0",
+      "integrity": "sha1-pWzYR2X6bsE1/iUrXbYeMEQDqFs=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.8.1",
-        "@typescript-eslint/utils": "8.8.1",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0",
+        "@typescript-eslint/utils": "8.38.0",
         "debug": "^4.3.4",
-        "ts-api-utils": "^1.3.0"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1098,15 +1698,15 @@
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.8.1",
-      "integrity": "sha1-6+heD6So4yokpWra3wYBA77xO9E=",
+      "version": "8.38.0",
+      "integrity": "sha1-KXNRyZSXa5PIKsDw4gbIFDqoJSk=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1117,18 +1717,21 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.8.1",
-      "integrity": "sha1-NGSfTijTLuSRUhk7x97cDnjl0ew=",
+      "version": "8.38.0",
+      "integrity": "sha1-giYhmetneLuiijGeJa0FsRWJV98=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@typescript-eslint/types": "8.8.1",
-        "@typescript-eslint/visitor-keys": "8.8.1",
+        "@typescript-eslint/project-service": "8.38.0",
+        "@typescript-eslint/tsconfig-utils": "8.38.0",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
         "minimatch": "^9.0.4",
         "semver": "^7.6.0",
-        "ts-api-utils": "^1.3.0"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1137,21 +1740,20 @@
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.8.1",
-      "integrity": "sha1-nilID7+iZMJpRiU9qnIYH58FPJ0=",
+      "version": "8.38.0",
+      "integrity": "sha1-XxAVmJnTDrkrpw5kLKb3VL3b8Vo=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.8.1",
-        "@typescript-eslint/types": "8.8.1",
-        "@typescript-eslint/typescript-estree": "8.8.1"
+        "@eslint-community/eslint-utils": "^4.7.0",
+        "@typescript-eslint/scope-manager": "8.38.0",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1161,16 +1763,18 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0"
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.8.1",
-      "integrity": "sha1-D7EoDzgRSfw0Xf3in3VC/05Yf8U=",
+      "version": "8.38.0",
+      "integrity": "sha1-qXZaUnsILLj8YP2KFuR8etW2DqU=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@typescript-eslint/types": "8.8.1",
-        "eslint-visitor-keys": "^3.4.3"
+        "@typescript-eslint/types": "8.38.0",
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1180,37 +1784,78 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
+    "node_modules/@typespec/ts-http-runtime": {
+      "version": "0.3.0",
+      "integrity": "sha1-9Qb/IXDllKJX+OeKoZYIjzpGoi0=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "http-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
     "node_modules/@ungap/structured-clone": {
-      "version": "1.2.0",
-      "integrity": "sha1-dWZBrbWHhRtcyz4JXa8nrlgchAY=",
+      "version": "1.3.0",
+      "integrity": "sha1-0Gu7OE689sUF/eHD0O1N3/4Kr/g=",
+      "license": "ISC",
       "optional": true
     },
     "node_modules/@vscode/debugprotocol": {
       "version": "1.68.0",
       "integrity": "sha1-5Vi6av/hvnr/TsgkWZ8xa2HZpp0=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/@vscode/extension-telemetry": {
-      "version": "0.9.7",
-      "integrity": "sha1-OG4IwfmDUL1aNozPJ5pQGgzW3Wc=",
+      "version": "0.9.9",
+      "integrity": "sha1-WIROcqx4YOsEl4mFRcLE9YCWRl4=",
+      "license": "MIT",
       "dependencies": {
-        "@microsoft/1ds-core-js": "^4.3.0",
-        "@microsoft/1ds-post-js": "^4.3.0",
-        "@microsoft/applicationinsights-web-basic": "^3.3.0"
+        "@microsoft/1ds-core-js": "^4.3.4",
+        "@microsoft/1ds-post-js": "^4.3.4",
+        "@microsoft/applicationinsights-web-basic": "^3.3.4"
       },
       "engines": {
         "vscode": "^1.75.0"
       }
     },
+    "node_modules/@vscode/test-cli": {
+      "version": "0.0.10",
+      "integrity": "sha1-NfDoHC4P+NrOsiPpnRtlMGwVgiw=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/mocha": "^10.0.2",
+        "c8": "^9.1.0",
+        "chokidar": "^3.5.3",
+        "enhanced-resolve": "^5.15.0",
+        "glob": "^10.3.10",
+        "minimatch": "^9.0.3",
+        "mocha": "^10.2.0",
+        "supports-color": "^9.4.0",
+        "yargs": "^17.7.2"
+      },
+      "bin": {
+        "vscode-test": "out/bin.mjs"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@vscode/test-electron": {
-      "version": "2.4.1",
-      "integrity": "sha1-XCdgZAv2ku+9qhi6/NNftRloiUE=",
+      "version": "2.5.2",
+      "integrity": "sha1-99QHjoIwzpyUMi8qKcwWwXlUCF0=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "http-proxy-agent": "^7.0.2",
         "https-proxy-agent": "^7.0.5",
         "jszip": "^3.10.1",
-        "ora": "^7.0.1",
+        "ora": "^8.1.0",
         "semver": "^7.6.2"
       },
       "engines": {
@@ -1218,17 +1863,22 @@
       }
     },
     "node_modules/@vscode/vsce": {
-      "version": "3.1.1",
-      "integrity": "sha1-sYtEeW2eW3pIo6Hon5Pe+cOzOLk=",
+      "version": "3.6.0",
+      "integrity": "sha1-cQLLhG24PtcOxxGZhq99fGnPNTg=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@azure/identity": "^4.1.0",
+        "@secretlint/node": "^10.1.1",
+        "@secretlint/secretlint-formatter-sarif": "^10.1.1",
+        "@secretlint/secretlint-rule-no-dotenv": "^10.1.1",
+        "@secretlint/secretlint-rule-preset-recommend": "^10.1.1",
         "@vscode/vsce-sign": "^2.0.0",
         "azure-devops-node-api": "^12.5.0",
-        "chalk": "^2.4.2",
+        "chalk": "^4.1.2",
         "cheerio": "^1.0.0-rc.9",
         "cockatiel": "^3.1.2",
-        "commander": "^6.2.1",
+        "commander": "^12.1.0",
         "form-data": "^4.0.0",
         "glob": "^11.0.0",
         "hosted-git-info": "^4.0.2",
@@ -1239,6 +1889,7 @@
         "minimatch": "^3.0.3",
         "parse-semver": "^1.1.1",
         "read": "^1.0.7",
+        "secretlint": "^10.1.1",
         "semver": "^7.5.2",
         "tmp": "^0.2.3",
         "typed-rest-client": "^1.8.4",
@@ -1258,143 +1909,217 @@
       }
     },
     "node_modules/@vscode/vsce-sign": {
-      "version": "2.0.4",
-      "integrity": "sha1-tL8VXRbypLrcBp34UNyG91YSSEI=",
+      "version": "2.0.6",
+      "integrity": "sha1-orEeKdq1Y3nFE+DMUmFe2tHTTNM=",
       "dev": true,
       "hasInstallScript": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optionalDependencies": {
-        "@vscode/vsce-sign-alpine-arm64": "2.0.2",
-        "@vscode/vsce-sign-alpine-x64": "2.0.2",
-        "@vscode/vsce-sign-darwin-arm64": "2.0.2",
-        "@vscode/vsce-sign-darwin-x64": "2.0.2",
-        "@vscode/vsce-sign-linux-arm": "2.0.2",
-        "@vscode/vsce-sign-linux-arm64": "2.0.2",
-        "@vscode/vsce-sign-linux-x64": "2.0.2",
-        "@vscode/vsce-sign-win32-arm64": "2.0.2",
-        "@vscode/vsce-sign-win32-x64": "2.0.2"
+        "@vscode/vsce-sign-alpine-arm64": "2.0.5",
+        "@vscode/vsce-sign-alpine-x64": "2.0.5",
+        "@vscode/vsce-sign-darwin-arm64": "2.0.5",
+        "@vscode/vsce-sign-darwin-x64": "2.0.5",
+        "@vscode/vsce-sign-linux-arm": "2.0.5",
+        "@vscode/vsce-sign-linux-arm64": "2.0.5",
+        "@vscode/vsce-sign-linux-x64": "2.0.5",
+        "@vscode/vsce-sign-win32-arm64": "2.0.5",
+        "@vscode/vsce-sign-win32-x64": "2.0.5"
       }
     },
     "node_modules/@vscode/vsce-sign-alpine-arm64": {
-      "version": "2.0.2",
-      "integrity": "sha1-SszEheVapv8EsZW0f3IurVfapY4=",
+      "version": "2.0.5",
+      "integrity": "sha1-40y/kfToamz1KrwubnUISuGPbEo=",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "alpine"
       ]
     },
     "node_modules/@vscode/vsce-sign-alpine-x64": {
-      "version": "2.0.2",
-      "integrity": "sha1-Skt7UFtMwPWFljlIl8SaC84OVAw=",
+      "version": "2.0.5",
+      "integrity": "sha1-dEPA6DnnTwP84MwxRTMPDSqAzIc=",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "alpine"
       ]
     },
     "node_modules/@vscode/vsce-sign-darwin-arm64": {
-      "version": "2.0.2",
-      "integrity": "sha1-EKpp/rf4Gj3GjCQgOMoD6v8ZwS4=",
+      "version": "2.0.5",
+      "integrity": "sha1-LqusfYNxKSqNIqFbP/V/GYjCnWs=",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/@vscode/vsce-sign-darwin-x64": {
-      "version": "2.0.2",
-      "integrity": "sha1-MxVSjz6hAHpkizMgv/NqM6ngeqU=",
+      "version": "2.0.5",
+      "integrity": "sha1-lvsDKcijZxhMID1iV0+akhkwItg=",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/@vscode/vsce-sign-linux-arm": {
-      "version": "2.0.2",
-      "integrity": "sha1-QUL9qD5xMLMa7diqgeTapjNDI8I=",
+      "version": "2.0.5",
+      "integrity": "sha1-vwc0DbH+Ncs6iiIrLaSqJTEO4lE=",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@vscode/vsce-sign-linux-arm64": {
-      "version": "2.0.2",
-      "integrity": "sha1-zlxc/JnjRUtPt3BAWBK0a9bcqHA=",
+      "version": "2.0.5",
+      "integrity": "sha1-wEUCMqukP76t/1MJg4pWVdxwOcg=",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@vscode/vsce-sign-linux-x64": {
-      "version": "2.0.2",
-      "integrity": "sha1-WauT8yLvs89JFm1OLoEnicMRdCg=",
+      "version": "2.0.5",
+      "integrity": "sha1-I4KZJPQIZ+kNXju4Yejo+gResO4=",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@vscode/vsce-sign-win32-arm64": {
-      "version": "2.0.2",
-      "integrity": "sha1-0JVwShSwQEwLb2lumInppRsxqGw=",
+      "version": "2.0.5",
+      "integrity": "sha1-GO8nH199mzHAMSdYLBscUfJuI7Q=",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "win32"
       ]
     },
     "node_modules/@vscode/vsce-sign-win32-x64": {
-      "version": "2.0.2",
-      "integrity": "sha1-KU6nK0T+3WlNSfXO9MVb84dtwlc=",
+      "version": "2.0.5",
+      "integrity": "sha1-g7iTk+RFHPp+OiGCrqQlD15xrKg=",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "SEE LICENSE IN LICENSE.txt",
       "optional": true,
       "os": [
         "win32"
       ]
     },
-    "node_modules/@vscode/vsce/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+    "node_modules/@vscode/vsce/node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "integrity": "sha1-q5tFRGblqMw6GHvqrVgEEqnFuEM=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/@vscode/vsce/node_modules/glob": {
+      "version": "11.0.3",
+      "integrity": "sha1-nYCH5tct2zxHB7HSd4+A6j6u/NY=",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "foreground-child": "^3.3.1",
+        "jackspeak": "^4.1.1",
+        "minimatch": "^10.0.3",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^2.0.0"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": {
+      "version": "10.0.3",
+      "integrity": "sha1-z3oDFKFsTZq3OncwoOjjw1AtR6o=",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "@isaacs/brace-expansion": "^5.0.0"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@vscode/vsce/node_modules/jackspeak": {
+      "version": "4.1.1",
+      "integrity": "sha1-lodgMPRQUCBH/H6Mf8+M6BJOQ64=",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@vscode/vsce/node_modules/lru-cache": {
+      "version": "11.1.0",
+      "integrity": "sha1-r6+wYGBxCBMtvBz4rmYa+2lIYRc=",
       "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+      "license": "ISC",
+      "engines": {
+        "node": "20 || >=22"
       }
     },
     "node_modules/@vscode/vsce/node_modules/minimatch": {
       "version": "3.1.2",
       "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -1402,9 +2127,26 @@
         "node": "*"
       }
     },
+    "node_modules/@vscode/vsce/node_modules/path-scurry": {
+      "version": "2.0.0",
+      "integrity": "sha1-nwUiifI62L+Tl6KgQl57hhXFhYA=",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "lru-cache": "^11.0.0",
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/acorn": {
-      "version": "8.12.1",
-      "integrity": "sha1-cWFr3MviXielRDngBG6JynbfIkg=",
+      "version": "8.15.0",
+      "integrity": "sha1-o2CJi8QV7arEbIJB9jg5dbkwuBY=",
+      "license": "MIT",
       "optional": true,
       "bin": {
         "acorn": "bin/acorn"
@@ -1416,31 +2158,31 @@
     "node_modules/acorn-jsx": {
       "version": "5.3.2",
       "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=",
+      "license": "MIT",
       "optional": true,
       "peerDependencies": {
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
     "node_modules/agent-base": {
-      "version": "7.1.1",
-      "integrity": "sha1-vb3tffsJa3UaKgh+7rlmRyWy4xc=",
+      "version": "7.1.4",
+      "integrity": "sha1-48121MVI7oldPD/Y3B9sW5Ay56g=",
       "devOptional": true,
-      "dependencies": {
-        "debug": "^4.3.4"
-      },
+      "license": "MIT",
       "engines": {
         "node": ">= 14"
       }
     },
     "node_modules/ajv": {
-      "version": "6.12.6",
-      "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
-      "optional": true,
+      "version": "8.17.1",
+      "integrity": "sha1-N9mlx3ava8ktf0+VEOukwKYNEaY=",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
+        "fast-deep-equal": "^3.1.3",
+        "fast-uri": "^3.0.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2"
       },
       "funding": {
         "type": "github",
@@ -1450,33 +2192,58 @@
     "node_modules/ansi-colors": {
       "version": "4.1.3",
       "integrity": "sha1-N2ETQOsiQ+cMxgTK011jJw1IeBs=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=6"
       }
     },
+    "node_modules/ansi-escapes": {
+      "version": "7.0.0",
+      "integrity": "sha1-APwZ9JG7sY4dSBuXhoIE+SEJv+c=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "environment": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+      "version": "6.1.0",
+      "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=",
       "devOptional": true,
+      "license": "MIT",
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
       }
     },
     "node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
-      "dev": true,
+      "version": "4.3.0",
+      "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "color-convert": "^1.9.0"
+        "color-convert": "^2.0.1"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
     "node_modules/anymatch": {
       "version": "3.1.3",
       "integrity": "sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "normalize-path": "^3.0.0",
@@ -1487,19 +2254,34 @@
       }
     },
     "node_modules/argparse": {
-      "version": "2.0.1",
-      "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=",
-      "devOptional": true
+      "version": "1.0.10",
+      "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/astral-regex": {
+      "version": "2.0.0",
+      "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
     },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "devOptional": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/azure-devops-node-api": {
       "version": "12.5.0",
       "integrity": "sha1-OLnv18WsdDVP5Ojb5CaX2wuOhaU=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "tunnel": "0.0.6",
         "typed-rest-client": "^1.8.4"
@@ -1507,11 +2289,13 @@
     },
     "node_modules/balanced-match": {
       "version": "1.0.2",
-      "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4="
+      "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=",
+      "license": "MIT"
     },
     "node_modules/base64-js": {
       "version": "1.5.1",
       "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -1526,11 +2310,13 @@
           "url": "https://feross.org/support"
         }
       ],
+      "license": "MIT",
       "optional": true
     },
     "node_modules/binary-extensions": {
       "version": "2.3.0",
       "integrity": "sha1-9uFKl4WNMnJSIAJC1Mz+UixEVSI=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=8"
@@ -1539,12 +2325,29 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/binaryextensions": {
+      "version": "6.11.0",
+      "integrity": "sha1-w2s+a1xZ5iFgVwmwmc2o3agkzHI=",
+      "dev": true,
+      "license": "Artistic-2.0",
+      "dependencies": {
+        "editions": "^6.21.0"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "funding": {
+        "url": "https://bevry.me/fund"
+      }
+    },
     "node_modules/bl": {
-      "version": "5.1.0",
-      "integrity": "sha1-GDcV9njHGI7O+f5HXZAglABiQnM=",
+      "version": "4.1.0",
+      "integrity": "sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo=",
+      "dev": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "buffer": "^6.0.3",
+        "buffer": "^5.5.0",
         "inherits": "^2.0.4",
         "readable-stream": "^3.4.0"
       }
@@ -1552,6 +2355,8 @@
     "node_modules/bl/node_modules/readable-stream": {
       "version": "3.6.2",
       "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=",
+      "dev": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "inherits": "^2.0.3",
@@ -1565,11 +2370,19 @@
     "node_modules/boolbase": {
       "version": "1.0.0",
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/boundary": {
+      "version": "2.0.0",
+      "integrity": "sha1-FpyLHw1Ezywlk4lnoyjzfgpOXvw=",
+      "dev": true,
+      "license": "BSD-2-Clause"
     },
     "node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "integrity": "sha1-HtxFng8MVISG7Pn8mfIiE2S5oK4=",
+      "version": "2.0.2",
+      "integrity": "sha1-VPxTI3phPYVMe9N0Y6rRffhyFOc=",
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0"
       }
@@ -1577,7 +2390,8 @@
     "node_modules/braces": {
       "version": "3.0.3",
       "integrity": "sha1-SQMy9AkZRSJy1VqEgK3AxEE1h4k=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "fill-range": "^7.1.1"
       },
@@ -1588,11 +2402,13 @@
     "node_modules/browser-stdout": {
       "version": "1.3.1",
       "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=",
+      "license": "ISC",
       "optional": true
     },
     "node_modules/buffer": {
-      "version": "6.0.3",
-      "integrity": "sha1-Ks5XhFnMj74qcKqo9S7mO2p0xsY=",
+      "version": "5.7.1",
+      "integrity": "sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA=",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -1607,16 +2423,18 @@
           "url": "https://feross.org/support"
         }
       ],
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "base64-js": "^1.3.1",
-        "ieee754": "^1.2.1"
+        "ieee754": "^1.1.13"
       }
     },
     "node_modules/buffer-crc32": {
       "version": "0.2.13",
       "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "*"
       }
@@ -1624,23 +2442,70 @@
     "node_modules/buffer-equal-constant-time": {
       "version": "1.0.1",
       "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=",
-      "dev": true
+      "dev": true,
+      "license": "BSD-3-Clause"
     },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=",
-      "optional": true
+    "node_modules/bundle-name": {
+      "version": "4.1.0",
+      "integrity": "sha1-87lrNBYNZDGhnXaIE1r3z7h5eIk=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "run-applescript": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
-    "node_modules/call-bind": {
-      "version": "1.0.7",
-      "integrity": "sha1-BgFlmcQMVkmMGHadJzC+JCtvo7k=",
+    "node_modules/c8": {
+      "version": "9.1.0",
+      "integrity": "sha1-Dle6Ornllgqx1lC0qG9x5Ty2gRI=",
+      "license": "ISC",
+      "optional": true,
+      "dependencies": {
+        "@bcoe/v8-coverage": "^0.2.3",
+        "@istanbuljs/schema": "^0.1.3",
+        "find-up": "^5.0.0",
+        "foreground-child": "^3.1.1",
+        "istanbul-lib-coverage": "^3.2.0",
+        "istanbul-lib-report": "^3.0.1",
+        "istanbul-reports": "^3.1.6",
+        "test-exclude": "^6.0.0",
+        "v8-to-istanbul": "^9.0.0",
+        "yargs": "^17.7.2",
+        "yargs-parser": "^21.1.1"
+      },
+      "bin": {
+        "c8": "bin/c8.js"
+      },
+      "engines": {
+        "node": ">=14.14.0"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.4",
-        "set-function-length": "^1.2.1"
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -1652,6 +2517,7 @@
     "node_modules/callsites": {
       "version": "3.1.0",
       "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=6"
@@ -1660,6 +2526,7 @@
     "node_modules/camelcase": {
       "version": "6.3.0",
       "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=10"
@@ -1669,37 +2536,53 @@
       }
     },
     "node_modules/chalk": {
-      "version": "2.4.2",
-      "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
-      "dev": true,
+      "version": "4.1.2",
+      "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chalk/node_modules/supports-color": {
+      "version": "7.2.0",
+      "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "has-flag": "^4.0.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
     "node_modules/cheerio": {
-      "version": "1.0.0",
-      "integrity": "sha1-Ht5IlagvJuivcQCflhqbjLYNaoE=",
+      "version": "1.1.2",
+      "integrity": "sha1-Jq936JM2yBxj6oMZf4aLTL01E2k=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cheerio-select": "^2.1.0",
         "dom-serializer": "^2.0.0",
         "domhandler": "^5.0.3",
-        "domutils": "^3.1.0",
-        "encoding-sniffer": "^0.2.0",
-        "htmlparser2": "^9.1.0",
-        "parse5": "^7.1.2",
-        "parse5-htmlparser2-tree-adapter": "^7.0.0",
+        "domutils": "^3.2.2",
+        "encoding-sniffer": "^0.2.1",
+        "htmlparser2": "^10.0.0",
+        "parse5": "^7.3.0",
+        "parse5-htmlparser2-tree-adapter": "^7.1.0",
         "parse5-parser-stream": "^7.1.2",
-        "undici": "^6.19.5",
+        "undici": "^7.12.0",
         "whatwg-mimetype": "^4.0.0"
       },
       "engines": {
-        "node": ">=18.17"
+        "node": ">=20.18.1"
       },
       "funding": {
         "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
@@ -1709,6 +2592,7 @@
       "version": "2.1.0",
       "integrity": "sha1-TYZzKGuBJsoqjkJ0DV48SISuIbQ=",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0",
         "css-select": "^5.1.0",
@@ -1724,6 +2608,7 @@
     "node_modules/chokidar": {
       "version": "3.6.0",
       "integrity": "sha1-GXxsxmnvKo3F57TZfuTgksPrDVs=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "anymatch": "~3.1.2",
@@ -1744,32 +2629,23 @@
         "fsevents": "~2.3.2"
       }
     },
-    "node_modules/chokidar/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
-      "optional": true,
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/chownr": {
       "version": "1.1.4",
       "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=",
       "dev": true,
+      "license": "ISC",
       "optional": true
     },
     "node_modules/cli-cursor": {
-      "version": "4.0.0",
-      "integrity": "sha1-POz+NzS/T+Aqg2HL3A9v4oxqV+o=",
+      "version": "5.0.0",
+      "integrity": "sha1-JKSDHs9aawHd6zL7caSyCIsNzjg=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "restore-cursor": "^4.0.0"
+        "restore-cursor": "^5.0.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -1778,6 +2654,7 @@
     "node_modules/cli-spinners": {
       "version": "2.9.2",
       "integrity": "sha1-F3Oo9LnE1qwxVj31Oz/B15Ri/kE=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=6"
@@ -1787,58 +2664,35 @@
       }
     },
     "node_modules/cliui": {
-      "version": "7.0.4",
-      "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=",
+      "version": "8.0.1",
+      "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
+        "strip-ansi": "^6.0.1",
         "wrap-ansi": "^7.0.0"
-      }
-    },
-    "node_modules/cliui/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
-      "optional": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
       },
       "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+        "node": ">=12"
       }
     },
-    "node_modules/cliui/node_modules/color-convert": {
-      "version": "2.0.1",
-      "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+    "node_modules/cliui/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+      "license": "MIT",
       "optional": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/cliui/node_modules/color-name": {
-      "version": "1.1.4",
-      "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
-      "optional": true
-    },
-    "node_modules/cliui/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
-      "optional": true
-    },
-    "node_modules/cliui/node_modules/string-width": {
-      "version": "4.2.3",
-      "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=",
+    "node_modules/cliui/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
+        "ansi-regex": "^5.0.1"
       },
       "engines": {
         "node": ">=8"
@@ -1847,6 +2701,7 @@
     "node_modules/cliui/node_modules/wrap-ansi": {
       "version": "7.0.0",
       "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
@@ -1864,27 +2719,34 @@
       "version": "3.2.1",
       "integrity": "sha1-V1+Te8QECiCuJzUqbQfJxadBmB8=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=16"
       }
     },
     "node_modules/color-convert": {
-      "version": "1.9.3",
-      "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
-      "dev": true,
+      "version": "2.0.1",
+      "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "color-name": "1.1.3"
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
       }
     },
     "node_modules/color-name": {
-      "version": "1.1.3",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
+      "version": "1.1.4",
+      "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+      "devOptional": true,
+      "license": "MIT"
     },
     "node_modules/combined-stream": {
       "version": "1.0.8",
       "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=",
-      "devOptional": true,
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
         "delayed-stream": "~1.0.0"
       },
@@ -1893,27 +2755,37 @@
       }
     },
     "node_modules/commander": {
-      "version": "6.2.1",
-      "integrity": "sha1-B5LraC37wyWZm7K4T93duhEKxzw=",
+      "version": "12.1.0",
+      "integrity": "sha1-AUI7NvUBJZ/arE0OTWDJbJkVhdM=",
       "dev": true,
+      "license": "MIT",
       "engines": {
-        "node": ">= 6"
+        "node": ">=18"
       }
     },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "devOptional": true
+      "devOptional": true,
+      "license": "MIT"
+    },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co=",
+      "license": "MIT",
+      "optional": true
     },
     "node_modules/core-util-is": {
       "version": "1.0.3",
       "integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
+      "version": "7.0.6",
+      "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -1924,9 +2796,10 @@
       }
     },
     "node_modules/css-select": {
-      "version": "5.1.0",
-      "integrity": "sha1-uOvWVUw2N8zHZoiAStP2pv2uqKY=",
+      "version": "5.2.2",
+      "integrity": "sha1-Abbo0WNje7LdbJgspO1lhjaCeG4=",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0",
         "css-what": "^6.1.0",
@@ -1939,9 +2812,10 @@
       }
     },
     "node_modules/css-what": {
-      "version": "6.1.0",
-      "integrity": "sha1-+17/z3bx3eosgb36pN5E55uscPQ=",
+      "version": "6.2.2",
+      "integrity": "sha1-zcyPm2l3cZ/fvR3nrsJKv3Vrneo=",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">= 6"
       },
@@ -1950,9 +2824,10 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.3.7",
-      "integrity": "sha1-h5RbQVGgEddtlaGY1xEchlw2ClI=",
+      "version": "4.4.1",
+      "integrity": "sha1-5ai8bLxMbNPmQwiwaTo9T6VQGJs=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "^2.1.3"
       },
@@ -1968,6 +2843,7 @@
     "node_modules/decamelize": {
       "version": "4.0.0",
       "integrity": "sha1-qkcte/Zg6xXzSU79UxyrfypwmDc=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=10"
@@ -1980,6 +2856,7 @@
       "version": "6.0.0",
       "integrity": "sha1-yjh2Et234QS9FthaqwDV7PCcZvw=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "mimic-response": "^3.1.0"
@@ -1995,6 +2872,7 @@
       "version": "0.6.0",
       "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=4.0.0"
@@ -2003,44 +2881,63 @@
     "node_modules/deep-is": {
       "version": "0.1.4",
       "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=",
+      "license": "MIT",
       "optional": true
     },
-    "node_modules/define-data-property": {
-      "version": "1.1.4",
-      "integrity": "sha1-iU3BQbt9MGCuQ2b2oBB+aPvkjF4=",
+    "node_modules/default-browser": {
+      "version": "5.2.1",
+      "integrity": "sha1-e3umEgT/PkJbVWhprm0+nZ8XEs8=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.0.1"
+        "bundle-name": "^4.1.0",
+        "default-browser-id": "^5.0.0"
       },
       "engines": {
-        "node": ">= 0.4"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/default-browser-id": {
+      "version": "5.0.0",
+      "integrity": "sha1-odmL+WDBUILYo/pp6DFQzMzDryY=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/define-lazy-prop": {
-      "version": "2.0.0",
-      "integrity": "sha1-P3rkIRKbyqrJvHSQXJigAJ7J7n8=",
+      "version": "3.0.0",
+      "integrity": "sha1-27Ga37dG1/xtc0oGty9KANAhJV8=",
       "dev": true,
+      "license": "MIT",
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "devOptional": true,
+      "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.4.0"
       }
     },
     "node_modules/detect-libc": {
-      "version": "2.0.3",
-      "integrity": "sha1-8M1QO0D5k5uJRpfRmtUIleMM9wA=",
+      "version": "2.0.4",
+      "integrity": "sha1-8EcVuLqBXlO02BCWVbZQimhlp+g=",
       "dev": true,
+      "license": "Apache-2.0",
       "optional": true,
       "engines": {
         "node": ">=8"
@@ -2049,26 +2946,17 @@
     "node_modules/diff": {
       "version": "5.2.0",
       "integrity": "sha1-Jt7QR80RebeLlTfV73JVA84a5TE=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "engines": {
         "node": ">=0.3.1"
       }
     },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
-      "optional": true,
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
     "node_modules/dom-serializer": {
       "version": "2.0.0",
       "integrity": "sha1-5BuALh7t+fbK4YPOXmIteJ19jlM=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "domelementtype": "^2.3.0",
         "domhandler": "^5.0.2",
@@ -2087,12 +2975,14 @@
           "type": "github",
           "url": "https://github.com/sponsors/fb55"
         }
-      ]
+      ],
+      "license": "BSD-2-Clause"
     },
     "node_modules/domhandler": {
       "version": "5.0.3",
       "integrity": "sha1-zDhff3UfHR/GUMITdIBCVFOMfTE=",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "domelementtype": "^2.3.0"
       },
@@ -2104,9 +2994,10 @@
       }
     },
     "node_modules/domutils": {
-      "version": "3.1.0",
-      "integrity": "sha1-xH9VEnjT3EsLGrjLtC11Gm8Ngk4=",
+      "version": "3.2.2",
+      "integrity": "sha1-7b/itmiwwdl8JLrw8QYrEyIhvHg=",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "dom-serializer": "^2.0.0",
         "domelementtype": "^2.3.0",
@@ -2116,28 +3007,61 @@
         "url": "https://github.com/fb55/domutils?sponsor=1"
       }
     },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/eastasianwidth": {
       "version": "0.2.0",
       "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=",
-      "devOptional": true
+      "devOptional": true,
+      "license": "MIT"
     },
     "node_modules/ecdsa-sig-formatter": {
       "version": "1.0.11",
       "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "safe-buffer": "^5.0.1"
       }
     },
+    "node_modules/editions": {
+      "version": "6.21.0",
+      "integrity": "sha1-jaLYVhEQbgiRpyYZt77o4MgwCJs=",
+      "dev": true,
+      "license": "Artistic-2.0",
+      "dependencies": {
+        "version-range": "^4.13.0"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "funding": {
+        "url": "https://bevry.me/fund"
+      }
+    },
     "node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=",
-      "devOptional": true
+      "version": "8.0.0",
+      "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
+      "devOptional": true,
+      "license": "MIT"
     },
     "node_modules/encoding-sniffer": {
-      "version": "0.2.0",
-      "integrity": "sha1-eZVp1m1EO6voKvGMn0A0mDZe8dU=",
+      "version": "0.2.1",
+      "integrity": "sha1-OW7JesIs5aA3ukSvGZKsnUanuBk=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "iconv-lite": "^0.6.3",
         "whatwg-encoding": "^3.1.1"
@@ -2147,18 +3071,33 @@
       }
     },
     "node_modules/end-of-stream": {
-      "version": "1.4.4",
-      "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=",
+      "version": "1.4.5",
+      "integrity": "sha1-c0TXEd6kDgt0q8LtSXeHQ8ztsIw=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "once": "^1.4.0"
       }
     },
+    "node_modules/enhanced-resolve": {
+      "version": "5.18.2",
+      "integrity": "sha1-eQPFsy/9SyFD7rS5JHK9aO/9VGQ=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/entities": {
       "version": "4.5.0",
       "integrity": "sha1-XSaOpecRPsdMTQM7eepaNaSI+0g=",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=0.12"
       },
@@ -2166,13 +3105,23 @@
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
-    "node_modules/es-define-property": {
-      "version": "1.0.0",
-      "integrity": "sha1-x/rvvf+LJpbPX0aSHt+3fMS6OEU=",
+    "node_modules/environment": {
+      "version": "1.1.0",
+      "integrity": "sha1-jobGaxgPNjx6sxF4fgJZZl9FqfE=",
       "dev": true,
-      "dependencies": {
-        "get-intrinsic": "^1.2.4"
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=",
+      "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
@@ -2181,227 +3130,263 @@
       "version": "1.3.0",
       "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
     },
-    "node_modules/esbuild": {
-      "version": "0.21.5",
-      "integrity": "sha1-nKMBsSCSKVm3ZjYNisgw2g0CmX0=",
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "integrity": "sha1-HE8sSDcydZfOadLKGQp/3RcjOME=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "integrity": "sha1-8x274MGDsAptJutjJcgQwP0YvU0=",
       "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.25.8",
+      "integrity": "sha1-SC1CGYtCfJwvOoG2PXZjrssd2gc=",
+      "devOptional": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "bin": {
         "esbuild": "bin/esbuild"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.21.5",
-        "@esbuild/android-arm": "0.21.5",
-        "@esbuild/android-arm64": "0.21.5",
-        "@esbuild/android-x64": "0.21.5",
-        "@esbuild/darwin-arm64": "0.21.5",
-        "@esbuild/darwin-x64": "0.21.5",
-        "@esbuild/freebsd-arm64": "0.21.5",
-        "@esbuild/freebsd-x64": "0.21.5",
-        "@esbuild/linux-arm": "0.21.5",
-        "@esbuild/linux-arm64": "0.21.5",
-        "@esbuild/linux-ia32": "0.21.5",
-        "@esbuild/linux-loong64": "0.21.5",
-        "@esbuild/linux-mips64el": "0.21.5",
-        "@esbuild/linux-ppc64": "0.21.5",
-        "@esbuild/linux-riscv64": "0.21.5",
-        "@esbuild/linux-s390x": "0.21.5",
-        "@esbuild/linux-x64": "0.21.5",
-        "@esbuild/netbsd-x64": "0.21.5",
-        "@esbuild/openbsd-x64": "0.21.5",
-        "@esbuild/sunos-x64": "0.21.5",
-        "@esbuild/win32-arm64": "0.21.5",
-        "@esbuild/win32-ia32": "0.21.5",
-        "@esbuild/win32-x64": "0.21.5"
+        "@esbuild/aix-ppc64": "0.25.8",
+        "@esbuild/android-arm": "0.25.8",
+        "@esbuild/android-arm64": "0.25.8",
+        "@esbuild/android-x64": "0.25.8",
+        "@esbuild/darwin-arm64": "0.25.8",
+        "@esbuild/darwin-x64": "0.25.8",
+        "@esbuild/freebsd-arm64": "0.25.8",
+        "@esbuild/freebsd-x64": "0.25.8",
+        "@esbuild/linux-arm": "0.25.8",
+        "@esbuild/linux-arm64": "0.25.8",
+        "@esbuild/linux-ia32": "0.25.8",
+        "@esbuild/linux-loong64": "0.25.8",
+        "@esbuild/linux-mips64el": "0.25.8",
+        "@esbuild/linux-ppc64": "0.25.8",
+        "@esbuild/linux-riscv64": "0.25.8",
+        "@esbuild/linux-s390x": "0.25.8",
+        "@esbuild/linux-x64": "0.25.8",
+        "@esbuild/netbsd-arm64": "0.25.8",
+        "@esbuild/netbsd-x64": "0.25.8",
+        "@esbuild/openbsd-arm64": "0.25.8",
+        "@esbuild/openbsd-x64": "0.25.8",
+        "@esbuild/openharmony-arm64": "0.25.8",
+        "@esbuild/sunos-x64": "0.25.8",
+        "@esbuild/win32-arm64": "0.25.8",
+        "@esbuild/win32-ia32": "0.25.8",
+        "@esbuild/win32-x64": "0.25.8"
+      }
+    },
+    "node_modules/esbuild-register": {
+      "version": "3.6.0",
+      "integrity": "sha1-zycM+md7rrvAAQrAJLgjy/cjo20=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "peerDependencies": {
+        "esbuild": ">=0.12 <1"
       }
     },
     "node_modules/escalade": {
       "version": "3.2.0",
       "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true,
+      "version": "4.0.0",
+      "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=",
+      "license": "MIT",
+      "optional": true,
       "engines": {
-        "node": ">=0.8.0"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/eslint": {
-      "version": "8.57.0",
-      "integrity": "sha1-x4am/Q4LaJQar2JFlvuYcIkZVmg=",
+      "version": "9.31.0",
+      "integrity": "sha1-mkiObadbvgV4XNYuQ8XqmTVtIbo=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.6.1",
-        "@eslint/eslintrc": "^2.1.4",
-        "@eslint/js": "8.57.0",
-        "@humanwhocodes/config-array": "^0.11.14",
+        "@eslint-community/regexpp": "^4.12.1",
+        "@eslint/config-array": "^0.21.0",
+        "@eslint/config-helpers": "^0.3.0",
+        "@eslint/core": "^0.15.0",
+        "@eslint/eslintrc": "^3.3.1",
+        "@eslint/js": "9.31.0",
+        "@eslint/plugin-kit": "^0.3.1",
+        "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@nodelib/fs.walk": "^1.2.8",
-        "@ungap/structured-clone": "^1.2.0",
+        "@humanwhocodes/retry": "^0.4.2",
+        "@types/estree": "^1.0.6",
+        "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
         "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
+        "cross-spawn": "^7.0.6",
         "debug": "^4.3.2",
-        "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.2.2",
-        "eslint-visitor-keys": "^3.4.3",
-        "espree": "^9.6.1",
-        "esquery": "^1.4.2",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
+        "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
+        "file-entry-cache": "^8.0.0",
         "find-up": "^5.0.0",
         "glob-parent": "^6.0.2",
-        "globals": "^13.19.0",
-        "graphemer": "^1.4.0",
         "ignore": "^5.2.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
-        "is-path-inside": "^3.0.3",
-        "js-yaml": "^4.1.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
         "lodash.merge": "^4.6.2",
         "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
-        "optionator": "^0.9.3",
-        "strip-ansi": "^6.0.1",
-        "text-table": "^0.2.0"
+        "optionator": "^0.9.3"
       },
       "bin": {
         "eslint": "bin/eslint.js"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
-        "url": "https://opencollective.com/eslint"
+        "url": "https://eslint.org/donate"
+      },
+      "peerDependencies": {
+        "jiti": "*"
+      },
+      "peerDependenciesMeta": {
+        "jiti": {
+          "optional": true
+        }
       }
     },
-    "node_modules/eslint-plugin-header": {
-      "version": "3.1.1",
-      "integrity": "sha1-bOUSQy1XZ1Jl+sRykrUNHv8RrNY=",
+    "node_modules/eslint-config-prettier": {
+      "version": "10.1.8",
+      "integrity": "sha1-FXNM5K+MJ3jMMvCwGzewtc0ey5c=",
+      "license": "MIT",
       "optional": true,
+      "bin": {
+        "eslint-config-prettier": "bin/cli.js"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint-config-prettier"
+      },
       "peerDependencies": {
-        "eslint": ">=7.7.0"
+        "eslint": ">=7.0.0"
       }
     },
     "node_modules/eslint-scope": {
-      "version": "7.2.2",
-      "integrity": "sha1-3rT5JWM5DzIAaJSvYqItuhxGQj8=",
+      "version": "8.4.0",
+      "integrity": "sha1-iOZGogf61hQ2/6OetQUUcgBlXII=",
+      "license": "BSD-2-Clause",
       "optional": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^5.2.0"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "3.4.3",
-      "integrity": "sha1-DNcv6FUOPC6uFWqWpN3c0cisWAA=",
+      "version": "4.2.1",
+      "integrity": "sha1-TP6mD+fdCtjoFuHtAmwdUlG1EsE=",
+      "license": "Apache-2.0",
       "optional": true,
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/eslint/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+    "node_modules/eslint/node_modules/ajv": {
+      "version": "6.12.6",
+      "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
       }
     },
     "node_modules/eslint/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+      "version": "1.1.12",
+      "integrity": "sha1-q5tFRGblqMw6GHvqrVgEEqnFuEM=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
-    "node_modules/eslint/node_modules/chalk": {
-      "version": "4.1.2",
-      "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
-      "optional": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/eslint/node_modules/color-convert": {
-      "version": "2.0.1",
-      "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+    "node_modules/eslint/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
-        "color-name": "~1.1.4"
+        "is-glob": "^4.0.3"
       },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=10.13.0"
       }
     },
-    "node_modules/eslint/node_modules/color-name": {
-      "version": "1.1.4",
-      "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+    "node_modules/eslint/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
+      "license": "MIT",
       "optional": true
     },
-    "node_modules/eslint/node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=",
-      "optional": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint/node_modules/has-flag": {
-      "version": "4.0.0",
-      "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/eslint/node_modules/minimatch": {
       "version": "3.1.2",
       "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "brace-expansion": "^1.1.7"
@@ -2410,36 +3395,40 @@
         "node": "*"
       }
     },
-    "node_modules/eslint/node_modules/supports-color": {
-      "version": "7.2.0",
-      "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
-      "optional": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/espree": {
-      "version": "9.6.1",
-      "integrity": "sha1-oqF7jkNGkKVDLy+AGM5x0zGkjG8=",
+      "version": "10.4.0",
+      "integrity": "sha1-1U9JSdRikAWh+haNk3w/8ffiqDc=",
+      "license": "BSD-2-Clause",
       "optional": true,
       "dependencies": {
-        "acorn": "^8.9.0",
+        "acorn": "^8.15.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.1"
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/esquery": {
       "version": "1.6.0",
       "integrity": "sha1-kUGSNPgE2FKoLc7sPhbNwiz52uc=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "dependencies": {
         "estraverse": "^5.1.0"
@@ -2451,6 +3440,7 @@
     "node_modules/esrecurse": {
       "version": "4.3.0",
       "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=",
+      "license": "BSD-2-Clause",
       "optional": true,
       "dependencies": {
         "estraverse": "^5.2.0"
@@ -2462,6 +3452,7 @@
     "node_modules/estraverse": {
       "version": "5.3.0",
       "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=",
+      "license": "BSD-2-Clause",
       "optional": true,
       "engines": {
         "node": ">=4.0"
@@ -2470,23 +3461,17 @@
     "node_modules/esutils": {
       "version": "2.0.3",
       "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=",
+      "license": "BSD-2-Clause",
       "optional": true,
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
     "node_modules/expand-template": {
       "version": "2.0.3",
       "integrity": "sha1-bhSz/O4POmNA7LV9LokYaSBSpHw=",
       "dev": true,
+      "license": "(MIT OR WTFPL)",
       "optional": true,
       "engines": {
         "node": ">=6"
@@ -2495,48 +3480,58 @@
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=",
-      "optional": true
+      "devOptional": true,
+      "license": "MIT"
     },
     "node_modules/fast-glob": {
-      "version": "3.3.2",
-      "integrity": "sha1-qQRQHlfP3S/83tRemaVP71XkYSk=",
-      "optional": true,
+      "version": "3.3.3",
+      "integrity": "sha1-0G1YXOjbqQoWsFBcVDw8z7OuuBg=",
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.stat": "^2.0.2",
         "@nodelib/fs.walk": "^1.2.3",
         "glob-parent": "^5.1.2",
         "merge2": "^1.3.0",
-        "micromatch": "^4.0.4"
+        "micromatch": "^4.0.8"
       },
       "engines": {
         "node": ">=8.6.0"
       }
     },
-    "node_modules/fast-glob/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
-      "optional": true,
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "license": "MIT",
       "optional": true
     },
+    "node_modules/fast-uri": {
+      "version": "3.0.6",
+      "integrity": "sha1-iPEwt3z66iN41Wv5cN6iElemh0g=",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fastify"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fastify"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
     "node_modules/fastq": {
-      "version": "1.17.1",
-      "integrity": "sha1-KlI/B6TnsegaQrkbi/IlQQd1O0c=",
-      "optional": true,
+      "version": "1.19.1",
+      "integrity": "sha1-1Q6rqAPIhGqIPBZJKCHrzSzaVfU=",
+      "devOptional": true,
+      "license": "ISC",
       "dependencies": {
         "reusify": "^1.0.4"
       }
@@ -2545,25 +3540,28 @@
       "version": "1.1.0",
       "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "pend": "~1.2.0"
       }
     },
     "node_modules/file-entry-cache": {
-      "version": "6.0.1",
-      "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=",
+      "version": "8.0.0",
+      "integrity": "sha1-d4e93PETG/+5JjbGlFe7wO3W2B8=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "flat-cache": "^3.0.4"
+        "flat-cache": "^4.0.0"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": ">=16.0.0"
       }
     },
     "node_modules/fill-range": {
       "version": "7.1.1",
       "integrity": "sha1-RCZdPKwH4+p9wkdRY4BkN1SgUpI=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -2574,6 +3572,7 @@
     "node_modules/find-up": {
       "version": "5.0.0",
       "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "locate-path": "^6.0.0",
@@ -2589,35 +3588,38 @@
     "node_modules/flat": {
       "version": "5.0.2",
       "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "bin": {
         "flat": "cli.js"
       }
     },
     "node_modules/flat-cache": {
-      "version": "3.2.0",
-      "integrity": "sha1-LAwtUEDJmxYydxqdEFclwBFTY+4=",
+      "version": "4.0.1",
+      "integrity": "sha1-Ds45/LFO4BL0sEEL0z3ZwfAREnw=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "flatted": "^3.2.9",
-        "keyv": "^4.5.3",
-        "rimraf": "^3.0.2"
+        "keyv": "^4.5.4"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": ">=16"
       }
     },
     "node_modules/flatted": {
-      "version": "3.3.1",
-      "integrity": "sha1-IdtHBymmc01JlwAvQ5yzCJh/Vno=",
+      "version": "3.3.3",
+      "integrity": "sha1-Z8j62VRUp8er6/dLt47nSkQCM1g=",
+      "license": "ISC",
       "optional": true
     },
     "node_modules/foreground-child": {
-      "version": "3.3.0",
-      "integrity": "sha1-CshkTAbkMUOfhWHbjs8pp7VRnHc=",
+      "version": "3.3.1",
+      "integrity": "sha1-Mujp7Rtoo0l777msK2rfkqY4V28=",
       "devOptional": true,
+      "license": "ISC",
       "dependencies": {
-        "cross-spawn": "^7.0.0",
+        "cross-spawn": "^7.0.6",
         "signal-exit": "^4.0.1"
       },
       "engines": {
@@ -2628,12 +3630,15 @@
       }
     },
     "node_modules/form-data": {
-      "version": "4.0.1",
-      "integrity": "sha1-uhB22qqlv9fpnBpssCqgpc/5DUg=",
-      "devOptional": true,
+      "version": "4.0.4",
+      "integrity": "sha1-eEzczgZpqdaOlNEaxO6pgIjt0sQ=",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
+        "hasown": "^2.0.2",
         "mime-types": "^2.1.12"
       },
       "engines": {
@@ -2644,17 +3649,34 @@
       "version": "1.0.0",
       "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=",
       "dev": true,
+      "license": "MIT",
       "optional": true
     },
+    "node_modules/fs-extra": {
+      "version": "11.3.0",
+      "integrity": "sha1-DaztE2u69lpVWjJnGa+TGtx6MU0=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.14"
+      }
+    },
     "node_modules/fs.realpath": {
       "version": "1.0.0",
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "license": "ISC",
       "optional": true
     },
     "node_modules/fsevents": {
       "version": "2.3.3",
       "integrity": "sha1-ysZAd4XQNnWipeGlMFxpezR9kNY=",
       "hasInstallScript": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -2667,6 +3689,7 @@
       "version": "1.1.2",
       "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -2674,21 +3697,40 @@
     "node_modules/get-caller-file": {
       "version": "2.0.5",
       "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=",
+      "license": "ISC",
       "optional": true,
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
       }
     },
+    "node_modules/get-east-asian-width": {
+      "version": "1.3.0",
+      "integrity": "sha1-IbQHHuWO0E7g22UzcbVbQpmHU4k=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/get-intrinsic": {
-      "version": "1.2.4",
-      "integrity": "sha1-44X1pLUifUScPqu60FSU7wq76t0=",
+      "version": "1.3.0",
+      "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
         "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
         "function-bind": "^1.1.2",
-        "has-proto": "^1.0.1",
-        "has-symbols": "^1.0.3",
-        "hasown": "^2.0.0"
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -2697,112 +3739,137 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/github-from-package": {
       "version": "0.0.0",
       "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
       "dev": true,
+      "license": "MIT",
       "optional": true
     },
     "node_modules/glob": {
-      "version": "11.0.0",
-      "integrity": "sha1-YDHfDXtl6qHMubKbXO0WzqZY534=",
-      "devOptional": true,
+      "version": "10.4.5",
+      "integrity": "sha1-9NnwuQ/9urCcnXf18ptCYlF7CVY=",
+      "license": "ISC",
+      "optional": true,
       "dependencies": {
         "foreground-child": "^3.1.0",
-        "jackspeak": "^4.0.1",
-        "minimatch": "^10.0.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
         "minipass": "^7.1.2",
         "package-json-from-dist": "^1.0.0",
-        "path-scurry": "^2.0.0"
+        "path-scurry": "^1.11.1"
       },
       "bin": {
         "glob": "dist/esm/bin.mjs"
       },
-      "engines": {
-        "node": "20 || >=22"
-      },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/glob-parent": {
-      "version": "6.0.2",
-      "integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=",
-      "optional": true,
+      "version": "5.1.2",
+      "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
+      "devOptional": true,
+      "license": "ISC",
       "dependencies": {
-        "is-glob": "^4.0.3"
+        "is-glob": "^4.0.1"
       },
       "engines": {
-        "node": ">=10.13.0"
+        "node": ">= 6"
       }
     },
-    "node_modules/glob/node_modules/minimatch": {
-      "version": "10.0.1",
-      "integrity": "sha1-zgUhhWtFPIbiXyxMDQPm/33cRAs=",
-      "devOptional": true,
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
+    "node_modules/globals": {
+      "version": "14.0.0",
+      "integrity": "sha1-iY10E8Kbq89rr+Vvyt3thYrack4=",
+      "license": "MIT",
+      "optional": true,
       "engines": {
-        "node": "20 || >=22"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/sponsors/isaacs"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/globals": {
-      "version": "13.24.0",
-      "integrity": "sha1-hDKhnXjODB6DOUnDats0VAC7EXE=",
-      "optional": true,
+    "node_modules/globby": {
+      "version": "14.1.0",
+      "integrity": "sha1-E4t453z1qNeU4yexXc6Avx+wpz4=",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "type-fest": "^0.20.2"
+        "@sindresorhus/merge-streams": "^2.1.0",
+        "fast-glob": "^3.3.3",
+        "ignore": "^7.0.3",
+        "path-type": "^6.0.0",
+        "slash": "^5.1.0",
+        "unicorn-magic": "^0.3.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/globby/node_modules/ignore": {
+      "version": "7.0.5",
+      "integrity": "sha1-TLX2zX1MerA2VzjHrqiIuqbX79k=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
     "node_modules/gopd": {
-      "version": "1.0.1",
-      "integrity": "sha1-Kf923mnax0ibfAkYpXiOVkd8Myw=",
+      "version": "1.2.0",
+      "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=",
       "dev": true,
-      "dependencies": {
-        "get-intrinsic": "^1.1.3"
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "integrity": "sha1-QYPk6L8Iu24Fu7L30uDI9xLKQOM=",
+      "devOptional": true,
+      "license": "ISC"
+    },
     "node_modules/graphemer": {
       "version": "1.4.0",
       "integrity": "sha1-+y8dVeDjoYSa7/yQxPoN1ToOZsY=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/has-flag": {
-      "version": "3.0.0",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
+      "version": "4.0.0",
+      "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+      "devOptional": true,
+      "license": "MIT",
       "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/has-property-descriptors": {
-      "version": "1.0.2",
-      "integrity": "sha1-lj7X0HHce/XwhMW/vg0bYiJYaFQ=",
-      "dev": true,
-      "dependencies": {
-        "es-define-property": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "node": ">=8"
       }
     },
-    "node_modules/has-proto": {
-      "version": "1.0.3",
-      "integrity": "sha1-sx3f6bDm6ZFFNqarKGQm0CFPd/0=",
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -2810,10 +3877,14 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/has-symbols": {
-      "version": "1.0.3",
-      "integrity": "sha1-u3ssQ0klHc6HsSX3vfh0qnyLOfg=",
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "integrity": "sha1-LNxC1AvvLltO6rfAGnPFTOerWrw=",
       "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
       "engines": {
         "node": ">= 0.4"
       },
@@ -2825,6 +3896,7 @@
       "version": "2.0.2",
       "integrity": "sha1-AD6vkb563DcuhOxZ3DclLO24AAM=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -2835,6 +3907,7 @@
     "node_modules/he": {
       "version": "1.2.0",
       "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=",
+      "license": "MIT",
       "optional": true,
       "bin": {
         "he": "bin/he"
@@ -2844,6 +3917,7 @@
       "version": "4.1.0",
       "integrity": "sha1-gnuChn6f8cjQxNnVOIA5fSyG0iQ=",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -2851,9 +3925,15 @@
         "node": ">=10"
       }
     },
+    "node_modules/html-escaper": {
+      "version": "2.0.2",
+      "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=",
+      "license": "MIT",
+      "optional": true
+    },
     "node_modules/htmlparser2": {
-      "version": "9.1.0",
-      "integrity": "sha1-zbSY2KdaUfc5th0/cYE2w2m8jCM=",
+      "version": "10.0.0",
+      "integrity": "sha1-d60kkDe2a/jMmcbihu9zuDrrYh0=",
       "dev": true,
       "funding": [
         "https://github.com/fb55/htmlparser2?sponsor=1",
@@ -2862,17 +3942,31 @@
           "url": "https://github.com/sponsors/fb55"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "domelementtype": "^2.3.0",
         "domhandler": "^5.0.3",
-        "domutils": "^3.1.0",
-        "entities": "^4.5.0"
+        "domutils": "^3.2.1",
+        "entities": "^6.0.0"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/entities": {
+      "version": "6.0.1",
+      "integrity": "sha1-wow0pDN5yn9h0HQTCy9fcCCjBpQ=",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
     "node_modules/http-proxy-agent": {
       "version": "7.0.2",
       "integrity": "sha1-mosfJGhmwChQlIZYX2K48sGMJw4=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "agent-base": "^7.1.0",
         "debug": "^4.3.4"
@@ -2882,11 +3976,12 @@
       }
     },
     "node_modules/https-proxy-agent": {
-      "version": "7.0.5",
-      "integrity": "sha1-notQE4cymeEfq2/VSEBdotbGArI=",
+      "version": "7.0.6",
+      "integrity": "sha1-2o3+rH2hMLBcK6S1nJts1mYRprk=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "agent-base": "^7.0.2",
+        "agent-base": "^7.1.2",
         "debug": "4"
       },
       "engines": {
@@ -2897,6 +3992,7 @@
       "version": "0.6.3",
       "integrity": "sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
       },
@@ -2907,6 +4003,7 @@
     "node_modules/ieee754": {
       "version": "1.2.1",
       "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -2921,11 +4018,13 @@
           "url": "https://feross.org/support"
         }
       ],
+      "license": "BSD-3-Clause",
       "optional": true
     },
     "node_modules/ignore": {
       "version": "5.3.2",
       "integrity": "sha1-PNQOcp82Q/2HywTlC/DrcivFlvU=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">= 4"
@@ -2934,11 +4033,13 @@
     "node_modules/immediate": {
       "version": "3.0.6",
       "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=",
+      "version": "3.3.1",
+      "integrity": "sha1-nOy1ZQPAraHydB271lRuSxO1fM8=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "parent-module": "^1.0.0",
@@ -2954,14 +4055,28 @@
     "node_modules/imurmurhash": {
       "version": "0.1.4",
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.8.19"
       }
     },
+    "node_modules/index-to-position": {
+      "version": "1.1.0",
+      "integrity": "sha1-LlC9VMgEC91tmz2V7CqP7fhrTUQ=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/inflight": {
       "version": "1.0.6",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "once": "^1.3.0",
@@ -2971,17 +4086,20 @@
     "node_modules/inherits": {
       "version": "2.0.4",
       "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=",
+      "license": "ISC",
       "optional": true
     },
     "node_modules/ini": {
       "version": "1.3.8",
       "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=",
       "dev": true,
+      "license": "ISC",
       "optional": true
     },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
       "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "binary-extensions": "^2.0.0"
@@ -2991,14 +4109,15 @@
       }
     },
     "node_modules/is-docker": {
-      "version": "2.2.1",
-      "integrity": "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao=",
+      "version": "3.0.0",
+      "integrity": "sha1-kAk6oxBid9inelkQ265xdH4VogA=",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "is-docker": "cli.js"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -3007,7 +4126,8 @@
     "node_modules/is-extglob": {
       "version": "2.1.1",
       "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3016,6 +4136,7 @@
       "version": "3.0.0",
       "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
       "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3023,7 +4144,8 @@
     "node_modules/is-glob": {
       "version": "4.0.3",
       "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.1"
       },
@@ -3031,9 +4153,28 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/is-inside-container": {
+      "version": "1.0.0",
+      "integrity": "sha1-6B+6aZZi6zHb2vJnZqYdSBRxfqQ=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^3.0.0"
+      },
+      "bin": {
+        "is-inside-container": "cli.js"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-interactive": {
       "version": "2.0.0",
       "integrity": "sha1-QMV2FFk4JtoRAK3mBZd41ZfxbpA=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=12"
@@ -3045,22 +4186,16 @@
     "node_modules/is-number": {
       "version": "7.0.0",
       "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
     },
-    "node_modules/is-path-inside": {
-      "version": "3.0.3",
-      "integrity": "sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM=",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/is-plain-obj": {
       "version": "2.1.0",
       "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=8"
@@ -3069,6 +4204,7 @@
     "node_modules/is-unicode-supported": {
       "version": "0.1.0",
       "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=10"
@@ -3078,46 +4214,126 @@
       }
     },
     "node_modules/is-wsl": {
-      "version": "2.2.0",
-      "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=",
+      "version": "3.1.0",
+      "integrity": "sha1-4cZX45wQCQr8vt7GFyD2uSTDy9I=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "is-docker": "^2.0.0"
+        "is-inside-container": "^1.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/isarray": {
       "version": "1.0.0",
       "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/isexe": {
       "version": "2.0.0",
       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "devOptional": true
-    },
-    "node_modules/jackspeak": {
-      "version": "4.0.2",
-      "integrity": "sha1-EflGijcwxv9vVoI6gg1+O+m+8BU=",
       "devOptional": true,
+      "license": "ISC"
+    },
+    "node_modules/istanbul-lib-coverage": {
+      "version": "3.2.2",
+      "integrity": "sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y=",
+      "license": "BSD-3-Clause",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-lib-report": {
+      "version": "3.0.1",
+      "integrity": "sha1-kIMFusmlvRdaxqdEier9D8JEWn0=",
+      "license": "BSD-3-Clause",
+      "optional": true,
       "dependencies": {
-        "@isaacs/cliui": "^8.0.2"
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^4.0.0",
+        "supports-color": "^7.1.0"
       },
       "engines": {
-        "node": "20 || >=22"
+        "node": ">=10"
+      }
+    },
+    "node_modules/istanbul-lib-report/node_modules/supports-color": {
+      "version": "7.2.0",
+      "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-reports": {
+      "version": "3.1.7",
+      "integrity": "sha1-2u0SueHcpRjhXAVuHlN+dBKA+gs=",
+      "license": "BSD-3-Clause",
+      "optional": true,
+      "dependencies": {
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istextorbinary": {
+      "version": "9.5.0",
+      "integrity": "sha1-5uE/6/HBaFEAriZICaT49G4B39M=",
+      "dev": true,
+      "license": "Artistic-2.0",
+      "dependencies": {
+        "binaryextensions": "^6.11.0",
+        "editions": "^6.21.0",
+        "textextensions": "^6.11.0"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "funding": {
+        "url": "https://bevry.me/fund"
+      }
+    },
+    "node_modules/jackspeak": {
+      "version": "3.4.3",
+      "integrity": "sha1-iDOp2Jq0rN5hiJQr0cU7Y5DtWoo=",
+      "license": "BlueOak-1.0.0",
+      "optional": true,
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
       }
     },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/js-yaml": {
-      "version": "4.1.0",
-      "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=",
-      "optional": true,
+      "version": "3.14.1",
+      "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "argparse": "^2.0.1"
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
       },
       "bin": {
         "js-yaml": "bin/js-yaml.js"
@@ -3126,27 +4342,56 @@
     "node_modules/json-buffer": {
       "version": "3.0.1",
       "integrity": "sha1-kziAKjDTtmBfvgYT4JQAjKjAWhM=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
-      "optional": true
+      "version": "1.0.0",
+      "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
       "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "license": "MIT",
       "optional": true
     },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "integrity": "sha1-eM1vGhm9wStz21rQxh79ZsHikoM=",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/jsonc-parser": {
       "version": "3.3.1",
       "integrity": "sha1-8qUktPf9EePXkeVZl3rWC5i3mLQ=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "integrity": "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
     },
     "node_modules/jsonwebtoken": {
       "version": "9.0.2",
       "integrity": "sha1-Zf+R9KvvF4RpfUCVK7GZjFBMqvM=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "jws": "^3.2.2",
         "lodash.includes": "^4.3.0",
@@ -3154,38 +4399,20 @@
         "lodash.isinteger": "^4.0.4",
         "lodash.isnumber": "^3.0.3",
         "lodash.isplainobject": "^4.0.6",
-        "lodash.isstring": "^4.0.1",
-        "lodash.once": "^4.0.0",
-        "ms": "^2.1.1",
-        "semver": "^7.5.4"
-      },
-      "engines": {
-        "node": ">=12",
-        "npm": ">=6"
-      }
-    },
-    "node_modules/jsonwebtoken/node_modules/jwa": {
-      "version": "1.4.1",
-      "integrity": "sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=",
-      "dev": true,
-      "dependencies": {
-        "buffer-equal-constant-time": "1.0.1",
-        "ecdsa-sig-formatter": "1.0.11",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "node_modules/jsonwebtoken/node_modules/jws": {
-      "version": "3.2.2",
-      "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=",
-      "dev": true,
-      "dependencies": {
-        "jwa": "^1.4.1",
-        "safe-buffer": "^5.0.1"
+        "lodash.isstring": "^4.0.1",
+        "lodash.once": "^4.0.0",
+        "ms": "^2.1.1",
+        "semver": "^7.5.4"
+      },
+      "engines": {
+        "node": ">=12",
+        "npm": ">=6"
       }
     },
     "node_modules/jszip": {
       "version": "3.10.1",
       "integrity": "sha1-NK7nDrGOofrsL1iSCKFX0f6wkcI=",
+      "license": "(MIT OR GPL-3.0-or-later)",
       "optional": true,
       "dependencies": {
         "lie": "~3.3.0",
@@ -3197,24 +4424,27 @@
     "node_modules/just-extend": {
       "version": "6.2.0",
       "integrity": "sha1-uBar+z1n7oYEgudAFWRnJVgWOUc=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/jwa": {
-      "version": "2.0.0",
-      "integrity": "sha1-p+nD8p2ulAJ+vK9Jl1yTRVk0EPw=",
+      "version": "1.4.2",
+      "integrity": "sha1-FgEaxttI3nsQJ3fleJeQFSDux7k=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "buffer-equal-constant-time": "1.0.1",
+        "buffer-equal-constant-time": "^1.0.1",
         "ecdsa-sig-formatter": "1.0.11",
         "safe-buffer": "^5.0.1"
       }
     },
     "node_modules/jws": {
-      "version": "4.0.0",
-      "integrity": "sha1-LU6M9qMY/6oSYV6d7H6G5slzEPQ=",
+      "version": "3.2.2",
+      "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "jwa": "^2.0.0",
+        "jwa": "^1.4.1",
         "safe-buffer": "^5.0.1"
       }
     },
@@ -3223,6 +4453,7 @@
       "integrity": "sha1-TGIlcI9RtQy/d8Wq6BchlkwpGMs=",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "node-addon-api": "^4.3.0",
@@ -3232,6 +4463,7 @@
     "node_modules/keyv": {
       "version": "4.5.4",
       "integrity": "sha1-qHmpnilFL5QkOfKkBeOvizHU3pM=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "json-buffer": "3.0.1"
@@ -3241,6 +4473,7 @@
       "version": "3.1.0",
       "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -3248,6 +4481,7 @@
     "node_modules/levn": {
       "version": "0.4.1",
       "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "prelude-ls": "^1.2.1",
@@ -3260,6 +4494,7 @@
     "node_modules/lie": {
       "version": "3.3.0",
       "integrity": "sha1-3Pgt7lRfRgdNryAMfBxaCOD0D2o=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "immediate": "~3.0.5"
@@ -3269,6 +4504,7 @@
       "version": "5.0.0",
       "integrity": "sha1-nvI4v6bccL2Of5VytS02mvVptCE=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "uc.micro": "^2.0.0"
       }
@@ -3276,6 +4512,7 @@
     "node_modules/locate-path": {
       "version": "6.0.0",
       "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "p-locate": "^5.0.0"
@@ -3290,56 +4527,73 @@
     "node_modules/lodash": {
       "version": "4.17.21",
       "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=",
-      "optional": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.get": {
       "version": "4.4.2",
       "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/lodash.includes": {
       "version": "4.3.0",
       "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.isboolean": {
       "version": "3.0.3",
       "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.isinteger": {
       "version": "4.0.4",
       "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.isnumber": {
       "version": "3.0.3",
       "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.isplainobject": {
       "version": "4.0.6",
       "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.isstring": {
       "version": "4.0.1",
       "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
       "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/lodash.once": {
       "version": "4.1.1",
       "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lodash.truncate": {
+      "version": "4.4.2",
+      "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/log-symbols": {
       "version": "4.1.0",
       "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "chalk": "^4.1.0",
@@ -3352,85 +4606,38 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/log-symbols/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
-      "optional": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/log-symbols/node_modules/chalk": {
-      "version": "4.1.2",
-      "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
-      "optional": true,
+    "node_modules/lru-cache": {
+      "version": "6.0.0",
+      "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
+      "dev": true,
+      "license": "ISC",
       "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
+        "yallist": "^4.0.0"
       },
       "engines": {
         "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/log-symbols/node_modules/color-convert": {
-      "version": "2.0.1",
-      "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
-      "optional": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
       }
     },
-    "node_modules/log-symbols/node_modules/color-name": {
-      "version": "1.1.4",
-      "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
-      "optional": true
-    },
-    "node_modules/log-symbols/node_modules/has-flag": {
+    "node_modules/make-dir": {
       "version": "4.0.0",
-      "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/log-symbols/node_modules/supports-color": {
-      "version": "7.2.0",
-      "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+      "integrity": "sha1-w8IwencSd82WODBfkVwprnQbYU4=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
+        "semver": "^7.5.3"
       },
       "engines": {
         "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/markdown-it": {
       "version": "14.1.0",
       "integrity": "sha1-PDxZkog8Yz20cUzLTXtZNdmLfUU=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "argparse": "^2.0.1",
         "entities": "^4.4.0",
@@ -3443,15 +4650,32 @@
         "markdown-it": "bin/markdown-it.mjs"
       }
     },
+    "node_modules/markdown-it/node_modules/argparse": {
+      "version": "2.0.1",
+      "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/mdurl": {
       "version": "2.0.0",
       "integrity": "sha1-gGduwEMwJd0+F+6YPQ/o3loiN+A=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/merge2": {
       "version": "1.4.1",
       "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 8"
       }
@@ -3459,7 +4683,8 @@
     "node_modules/micromatch": {
       "version": "4.0.8",
       "integrity": "sha1-1m+hjzpHB2eJMgubGvMr2G2fogI=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "braces": "^3.0.3",
         "picomatch": "^2.3.1"
@@ -3472,6 +4697,7 @@
       "version": "1.6.0",
       "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "mime": "cli.js"
       },
@@ -3482,7 +4708,8 @@
     "node_modules/mime-db": {
       "version": "1.52.0",
       "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=",
-      "devOptional": true,
+      "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3490,7 +4717,8 @@
     "node_modules/mime-types": {
       "version": "2.1.35",
       "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=",
-      "devOptional": true,
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -3498,18 +4726,23 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=",
+    "node_modules/mimic-function": {
+      "version": "5.0.1",
+      "integrity": "sha1-rL4rM0n5m53qyn+3Dki4PpTmcHY=",
+      "license": "MIT",
       "optional": true,
       "engines": {
-        "node": ">=6"
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/mimic-response": {
       "version": "3.1.0",
       "integrity": "sha1-LR1Zr5wbEpgVrMwsRqAipc4fo8k=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=10"
@@ -3521,6 +4754,7 @@
     "node_modules/minimatch": {
       "version": "9.0.5",
       "integrity": "sha1-10+d1rV9g9jpjPuCEzsDl4vJKeU=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "brace-expansion": "^2.0.1"
@@ -3536,6 +4770,7 @@
       "version": "1.2.8",
       "integrity": "sha1-waRk52kzAuCCoHXO4MBXdBrEdyw=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -3545,6 +4780,7 @@
       "version": "7.1.2",
       "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
       "devOptional": true,
+      "license": "ISC",
       "engines": {
         "node": ">=16 || 14 >=14.17"
       }
@@ -3553,11 +4789,13 @@
       "version": "0.5.3",
       "integrity": "sha1-+hDJEVzG2IZb4iG6R+6b7XhgERM=",
       "dev": true,
+      "license": "MIT",
       "optional": true
     },
     "node_modules/mocha": {
-      "version": "10.7.3",
-      "integrity": "sha1-rjIAPKu9UrWa7OF4RgVqaOtLB1I=",
+      "version": "10.8.2",
+      "integrity": "sha1-jYNC0BbtQRsSpCnrcxuCX5Ya+5Y=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "ansi-colors": "^4.1.3",
@@ -3589,43 +4827,36 @@
         "node": ">= 14.0.0"
       }
     },
-    "node_modules/mocha-explorer-launcher-scripts": {
-      "version": "0.4.0",
-      "integrity": "sha1-kVauKTxShWU3XHnD+5O2tbEIgSY=",
-      "optional": true,
-      "dependencies": {
-        "vscode-test-adapter-remoting-util": "^0.13.0"
-      }
-    },
-    "node_modules/mocha-multi-reporters": {
-      "version": "1.5.1",
-      "integrity": "sha1-xzSGvtVRnh1Zyc45rHqXkmAOVnY=",
+    "node_modules/mocha/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+      "license": "MIT",
       "optional": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "lodash": "^4.17.15"
-      },
       "engines": {
-        "node": ">=6.0.0"
-      },
-      "peerDependencies": {
-        "mocha": ">=3.1.2"
+        "node": ">=8"
       }
     },
-    "node_modules/mocha/node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=",
+    "node_modules/mocha/node_modules/argparse": {
+      "version": "2.0.1",
+      "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=",
+      "license": "Python-2.0",
+      "optional": true
+    },
+    "node_modules/mocha/node_modules/cliui": {
+      "version": "7.0.4",
+      "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=",
+      "license": "ISC",
       "optional": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
       }
     },
     "node_modules/mocha/node_modules/glob": {
       "version": "8.1.0",
       "integrity": "sha1-04j2Vlk+9wjuPjRkD9+5mp/Rwz4=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -3641,17 +4872,22 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/mocha/node_modules/has-flag": {
-      "version": "4.0.0",
-      "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+    "node_modules/mocha/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=",
+      "license": "MIT",
       "optional": true,
-      "engines": {
-        "node": ">=8"
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
       }
     },
     "node_modules/mocha/node_modules/minimatch": {
       "version": "5.1.6",
       "integrity": "sha1-HPy4z1Ui6mmVLNKvla4JR38SKpY=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "brace-expansion": "^2.0.1"
@@ -3660,9 +4896,22 @@
         "node": ">=10"
       }
     },
+    "node_modules/mocha/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/mocha/node_modules/supports-color": {
       "version": "8.1.1",
       "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "has-flag": "^4.0.0"
@@ -3674,9 +4923,54 @@
         "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
+    "node_modules/mocha/node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/mocha/node_modules/yargs": {
+      "version": "16.2.0",
+      "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/mocha/node_modules/yargs-parser": {
+      "version": "20.2.9",
+      "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=",
+      "license": "ISC",
+      "optional": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/mock-fs": {
-      "version": "5.3.0",
-      "integrity": "sha1-ffyVzlUor/jhD6EXFhuR2BKeDp4=",
+      "version": "5.5.0",
+      "integrity": "sha1-lKRtKZqqWI5zWiAcvoI8h26R84U=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=12.0.0"
@@ -3685,27 +4979,32 @@
     "node_modules/ms": {
       "version": "2.1.3",
       "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=",
-      "devOptional": true
+      "devOptional": true,
+      "license": "MIT"
     },
     "node_modules/mute-stream": {
       "version": "0.0.8",
       "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/napi-build-utils": {
-      "version": "1.0.2",
-      "integrity": "sha1-sf3cCyxG44Cgt6dvmE3UfEGhOAY=",
+      "version": "2.0.0",
+      "integrity": "sha1-E8IsAYf8/MzhRhhEE2NypH3cAn4=",
       "dev": true,
+      "license": "MIT",
       "optional": true
     },
     "node_modules/natural-compare": {
       "version": "1.4.0",
       "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/nise": {
       "version": "6.1.1",
       "integrity": "sha1-eOqTzEm+Ei5Ey3yP31l7Dod4tko=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "dependencies": {
         "@sinonjs/commons": "^3.0.1",
@@ -3715,18 +5014,11 @@
         "path-to-regexp": "^8.1.0"
       }
     },
-    "node_modules/nise/node_modules/@sinonjs/fake-timers": {
-      "version": "13.0.2",
-      "integrity": "sha1-P/6Iq7BiBnpYD9+6cGrQBDWg8qY=",
-      "optional": true,
-      "dependencies": {
-        "@sinonjs/commons": "^3.0.1"
-      }
-    },
     "node_modules/node-abi": {
-      "version": "3.68.0",
-      "integrity": "sha1-jzf7Auz09D6+aUCQ3LUuDEzEuiU=",
+      "version": "3.75.0",
+      "integrity": "sha1-L5KakakKDQKzJcQ3MTFIAjV+12Q=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "semver": "^7.3.5"
@@ -3739,29 +5031,58 @@
       "version": "4.3.0",
       "integrity": "sha1-UqGgtHUZPgko6Y4EJqDRJUeCt38=",
       "dev": true,
+      "license": "MIT",
       "optional": true
     },
-    "node_modules/node-fetch": {
-      "version": "2.7.0",
-      "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0=",
+    "node_modules/node-sarif-builder": {
+      "version": "3.2.0",
+      "integrity": "sha1-ugCJldixZVcMPzgwDlYpmpNTHbE=",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "whatwg-url": "^5.0.0"
+        "@types/sarif": "^2.1.7",
+        "fs-extra": "^11.1.1"
       },
       "engines": {
-        "node": "4.x || >=6.0.0"
+        "node": ">=18"
+      }
+    },
+    "node_modules/normalize-package-data": {
+      "version": "6.0.2",
+      "integrity": "sha1-p7wiFn/iQCVBK8/wqWUet2iwNQY=",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "hosted-git-info": "^7.0.0",
+        "semver": "^7.3.5",
+        "validate-npm-package-license": "^3.0.4"
       },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
+      "engines": {
+        "node": "^16.14.0 || >=18.0.0"
+      }
+    },
+    "node_modules/normalize-package-data/node_modules/hosted-git-info": {
+      "version": "7.0.2",
+      "integrity": "sha1-m3UaysCXdXZn8wEUYH73tmH/Txc=",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "lru-cache": "^10.0.1"
       },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
+      "engines": {
+        "node": "^16.14.0 || >=18.0.0"
       }
     },
+    "node_modules/normalize-package-data/node_modules/lru-cache": {
+      "version": "10.4.3",
+      "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=",
+      "dev": true,
+      "license": "ISC"
+    },
     "node_modules/normalize-path": {
       "version": "3.0.0",
       "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.10.0"
@@ -3771,6 +5092,7 @@
       "version": "2.1.1",
       "integrity": "sha1-yeq0KO/842zWuSySS9sADvHx7R0=",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0"
       },
@@ -3779,9 +5101,10 @@
       }
     },
     "node_modules/object-inspect": {
-      "version": "1.13.2",
-      "integrity": "sha1-3qAIhGf7mR5nr0BYFHokgkowQ/8=",
+      "version": "1.13.4",
+      "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -3792,36 +5115,40 @@
     "node_modules/once": {
       "version": "1.4.0",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
         "wrappy": "1"
       }
     },
     "node_modules/onetime": {
-      "version": "5.1.2",
-      "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=",
+      "version": "7.0.0",
+      "integrity": "sha1-nxbJLYye9RIOOs2d2ZV8zuzBq2A=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "mimic-fn": "^2.1.0"
+        "mimic-function": "^5.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/open": {
-      "version": "8.4.2",
-      "integrity": "sha1-W1/+Ko95Pc0qrXPlUMuHtZywhPk=",
+      "version": "10.2.0",
+      "integrity": "sha1-udhVvgB2IOgLb7BfrJgUH+Yttzw=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "define-lazy-prop": "^2.0.0",
-        "is-docker": "^2.1.1",
-        "is-wsl": "^2.2.0"
+        "default-browser": "^5.2.1",
+        "define-lazy-prop": "^3.0.0",
+        "is-inside-container": "^1.0.0",
+        "wsl-utils": "^0.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -3830,6 +5157,7 @@
     "node_modules/optionator": {
       "version": "0.9.4",
       "integrity": "sha1-fqHBpdkddk+yghOciP4R4YKjpzQ=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "deep-is": "^0.1.3",
@@ -3844,41 +5172,32 @@
       }
     },
     "node_modules/ora": {
-      "version": "7.0.1",
-      "integrity": "sha1-zdUw7Nhl/jnkUaDnaXhlZpyxGTA=",
+      "version": "8.2.0",
+      "integrity": "sha1-j7u3FRr+M7VA3RU/Fx/6i9OOmGE=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "chalk": "^5.3.0",
-        "cli-cursor": "^4.0.0",
-        "cli-spinners": "^2.9.0",
-        "is-interactive": "^2.0.0",
-        "is-unicode-supported": "^1.3.0",
-        "log-symbols": "^5.1.0",
-        "stdin-discarder": "^0.1.0",
-        "string-width": "^6.1.0",
-        "strip-ansi": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ora/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=",
-      "optional": true,
+        "cli-cursor": "^5.0.0",
+        "cli-spinners": "^2.9.2",
+        "is-interactive": "^2.0.0",
+        "is-unicode-supported": "^2.0.0",
+        "log-symbols": "^6.0.0",
+        "stdin-discarder": "^0.2.2",
+        "string-width": "^7.2.0",
+        "strip-ansi": "^7.1.0"
+      },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/ora/node_modules/chalk": {
-      "version": "5.3.0",
-      "integrity": "sha1-Z8IKfr73Dn85cKAfkPohDLaGA4U=",
+      "version": "5.4.1",
+      "integrity": "sha1-G0i/CWPsFY3OKqz2nAk64t0gktg=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": "^12.17.0 || ^14.13 || >=16.0.0"
@@ -3890,67 +5209,70 @@
     "node_modules/ora/node_modules/emoji-regex": {
       "version": "10.4.0",
       "integrity": "sha1-A1U6/qgLOXV0nPyzb3dsomjkE9Q=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/ora/node_modules/is-unicode-supported": {
-      "version": "1.3.0",
-      "integrity": "sha1-2CSYS2FsKSouGYIH1KYJmDhC9xQ=",
+      "version": "2.1.0",
+      "integrity": "sha1-CfCrDebTdE1I0mXruY9l0R8qmzo=",
+      "license": "MIT",
       "optional": true,
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/ora/node_modules/log-symbols": {
-      "version": "5.1.0",
-      "integrity": "sha1-og47ml9T+sauuOK7IsB88sjxbZM=",
+      "version": "6.0.0",
+      "integrity": "sha1-u5Xl8FMiZRysMMD+tkBPnyqKlDk=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "chalk": "^5.0.0",
-        "is-unicode-supported": "^1.1.0"
+        "chalk": "^5.3.0",
+        "is-unicode-supported": "^1.3.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/ora/node_modules/string-width": {
-      "version": "6.1.0",
-      "integrity": "sha1-lkiNbtI/mtXYLRNSKvnkxMP9dRg=",
+    "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": {
+      "version": "1.3.0",
+      "integrity": "sha1-2CSYS2FsKSouGYIH1KYJmDhC9xQ=",
+      "license": "MIT",
       "optional": true,
-      "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^10.2.1",
-        "strip-ansi": "^7.0.1"
-      },
       "engines": {
-        "node": ">=16"
+        "node": ">=12"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/ora/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=",
+    "node_modules/ora/node_modules/string-width": {
+      "version": "7.2.0",
+      "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "ansi-regex": "^6.0.1"
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/p-limit": {
       "version": "3.1.0",
       "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "yocto-queue": "^0.1.0"
@@ -3965,6 +5287,7 @@
     "node_modules/p-locate": {
       "version": "5.0.0",
       "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "p-limit": "^3.0.2"
@@ -3976,19 +5299,34 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/p-map": {
+      "version": "7.0.3",
+      "integrity": "sha1-esIQotNvgewotzYTSBD3ukQYzbY=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/package-json-from-dist": {
       "version": "1.0.1",
       "integrity": "sha1-TxRxoBCCeob5TP2bByfjbSZ95QU=",
-      "devOptional": true
+      "devOptional": true,
+      "license": "BlueOak-1.0.0"
     },
     "node_modules/pako": {
       "version": "1.0.11",
       "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=",
+      "license": "(MIT AND Zlib)",
       "optional": true
     },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "callsites": "^3.0.0"
@@ -3997,10 +5335,28 @@
         "node": ">=6"
       }
     },
+    "node_modules/parse-json": {
+      "version": "8.3.0",
+      "integrity": "sha1-iKGVohVwJROaIxek8vklK2EwTtU=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "index-to-position": "^1.1.0",
+        "type-fest": "^4.39.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/parse-semver": {
       "version": "1.1.1",
       "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "semver": "^5.1.0"
       }
@@ -4009,27 +5365,30 @@
       "version": "5.7.2",
       "integrity": "sha1-SNVdtzfDKHzUg14X+hP+rOHEHvg=",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
     },
     "node_modules/parse5": {
-      "version": "7.1.2",
-      "integrity": "sha1-Bza+u/13eTgjJAojt/xeAQt/jjI=",
+      "version": "7.3.0",
+      "integrity": "sha1-1+Ik+nI5nHoXUJn0X8KtAksF7AU=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "entities": "^4.4.0"
+        "entities": "^6.0.0"
       },
       "funding": {
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
     "node_modules/parse5-htmlparser2-tree-adapter": {
-      "version": "7.0.0",
-      "integrity": "sha1-I8LMIzvPCbt766i4pp1GsIxiwvE=",
+      "version": "7.1.0",
+      "integrity": "sha1-tagGVI7Yk6Q+JMy0L7t4BpMR6Bs=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "domhandler": "^5.0.2",
+        "domhandler": "^5.0.3",
         "parse5": "^7.0.0"
       },
       "funding": {
@@ -4040,6 +5399,7 @@
       "version": "7.1.2",
       "integrity": "sha1-18IOrcN5aNJy4sAmYP/5LdJ+YOE=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "parse5": "^7.0.0"
       },
@@ -4047,9 +5407,22 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
+    "node_modules/parse5/node_modules/entities": {
+      "version": "6.0.1",
+      "integrity": "sha1-wow0pDN5yn9h0HQTCy9fcCCjBpQ=",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
     "node_modules/path-exists": {
       "version": "4.0.0",
       "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=8"
@@ -4058,6 +5431,7 @@
     "node_modules/path-is-absolute": {
       "version": "1.0.1",
       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.10.0"
@@ -4067,50 +5441,71 @@
       "version": "3.1.1",
       "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=",
       "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/path-scurry": {
-      "version": "2.0.0",
-      "integrity": "sha1-nwUiifI62L+Tl6KgQl57hhXFhYA=",
-      "devOptional": true,
+      "version": "1.11.1",
+      "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=",
+      "license": "BlueOak-1.0.0",
+      "optional": true,
       "dependencies": {
-        "lru-cache": "^11.0.0",
-        "minipass": "^7.1.2"
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
       },
       "engines": {
-        "node": "20 || >=22"
+        "node": ">=16 || 14 >=14.18"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/path-scurry/node_modules/lru-cache": {
-      "version": "11.0.1",
-      "integrity": "sha1-OnMvv+24LFunvKZWStP0Kvy24Uc=",
-      "devOptional": true,
-      "engines": {
-        "node": "20 || >=22"
-      }
+      "version": "10.4.3",
+      "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=",
+      "license": "ISC",
+      "optional": true
     },
     "node_modules/path-to-regexp": {
       "version": "8.2.0",
       "integrity": "sha1-c5kMwp5Xo/8qDZFAlRVt9dt56LQ=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=16"
       }
     },
+    "node_modules/path-type": {
+      "version": "6.0.0",
+      "integrity": "sha1-Lxu2eRqRzpkZTK7eXWxZIO2B61E=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/pend": {
       "version": "1.2.0",
       "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "integrity": "sha1-PTIa8+q5ObCDyPkpodEs2oHCa2s=",
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
       "integrity": "sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8.6"
       },
@@ -4118,10 +5513,20 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
+    "node_modules/pluralize": {
+      "version": "8.0.0",
+      "integrity": "sha1-Gm+hajjRKhkB4DIPoBcFHFOc47E=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/prebuild-install": {
-      "version": "7.1.2",
-      "integrity": "sha1-pf2ZhvWmJR+8R+Hlxl3nHmjAoFY=",
+      "version": "7.1.3",
+      "integrity": "sha1-1jCrrSsUdEPyCiEpF76uaLgJLuw=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "detect-libc": "^2.0.0",
@@ -4129,7 +5534,7 @@
         "github-from-package": "0.0.0",
         "minimist": "^1.2.3",
         "mkdirp-classic": "^0.5.3",
-        "napi-build-utils": "^1.0.1",
+        "napi-build-utils": "^2.0.0",
         "node-abi": "^3.3.0",
         "pump": "^3.0.0",
         "rc": "^1.2.7",
@@ -4147,20 +5552,54 @@
     "node_modules/prelude-ls": {
       "version": "1.2.1",
       "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/prettier": {
+      "version": "3.6.2",
+      "integrity": "sha1-zNoCoQA+u7K/2m+DoHSXj2CLk5M=",
+      "license": "MIT",
+      "optional": true,
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
+    "node_modules/prettier-plugin-organize-imports": {
+      "version": "4.2.0",
+      "integrity": "sha1-kqxI4j5kl7rk12HUPRet7RgFpG0=",
+      "license": "MIT",
+      "optional": true,
+      "peerDependencies": {
+        "prettier": ">=2.0",
+        "typescript": ">=2.9",
+        "vue-tsc": "^2.1.0 || 3"
+      },
+      "peerDependenciesMeta": {
+        "vue-tsc": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
       "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/pump": {
-      "version": "3.0.2",
-      "integrity": "sha1-g28+3WvC7lmSVskk/+DYhXPdy/g=",
+      "version": "3.0.3",
+      "integrity": "sha1-FR2XnxopZo3AAl7FiaRVtTKCJo0=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "end-of-stream": "^1.1.0",
@@ -4170,6 +5609,7 @@
     "node_modules/punycode": {
       "version": "2.3.1",
       "integrity": "sha1-AnQi4vrsCyXhVJw+G9gwm5EztuU=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=6"
@@ -4179,16 +5619,18 @@
       "version": "2.3.1",
       "integrity": "sha1-a1PlatdViCNOefSv+pCXLH3Yzbc=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/qs": {
-      "version": "6.13.0",
-      "integrity": "sha1-bKO9WEOffiRWVXmJl3h7DYilGQY=",
+      "version": "6.14.0",
+      "integrity": "sha1-xj+kBoDSxclBQSoOiZyJr2DAqTA=",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
-        "side-channel": "^1.0.6"
+        "side-channel": "^1.1.0"
       },
       "engines": {
         "node": ">=0.6"
@@ -4200,6 +5642,7 @@
     "node_modules/queue-microtask": {
       "version": "1.2.3",
       "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=",
+      "devOptional": true,
       "funding": [
         {
           "type": "github",
@@ -4214,11 +5657,12 @@
           "url": "https://feross.org/support"
         }
       ],
-      "optional": true
+      "license": "MIT"
     },
     "node_modules/randombytes": {
       "version": "2.1.0",
       "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "safe-buffer": "^5.1.0"
@@ -4228,6 +5672,7 @@
       "version": "1.2.8",
       "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=",
       "dev": true,
+      "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
       "optional": true,
       "dependencies": {
         "deep-extend": "^0.6.0",
@@ -4239,10 +5684,41 @@
         "rc": "cli.js"
       }
     },
+    "node_modules/rc-config-loader": {
+      "version": "4.1.3",
+      "integrity": "sha1-E1KYa4otjZbW/QVKW7GaYMV2h2o=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.3.4",
+        "js-yaml": "^4.1.0",
+        "json5": "^2.2.2",
+        "require-from-string": "^2.0.2"
+      }
+    },
+    "node_modules/rc-config-loader/node_modules/argparse": {
+      "version": "2.0.1",
+      "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "node_modules/rc-config-loader/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
     "node_modules/rc/node_modules/strip-json-comments": {
       "version": "2.0.1",
       "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.10.0"
@@ -4252,6 +5728,7 @@
       "version": "1.0.7",
       "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "mute-stream": "~0.0.4"
       },
@@ -4259,9 +5736,41 @@
         "node": ">=0.8"
       }
     },
+    "node_modules/read-pkg": {
+      "version": "9.0.1",
+      "integrity": "sha1-sbgfsVEE9duxIba73um7yXOfVps=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/normalize-package-data": "^2.4.3",
+        "normalize-package-data": "^6.0.0",
+        "parse-json": "^8.0.0",
+        "type-fest": "^4.6.0",
+        "unicorn-magic": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/read-pkg/node_modules/unicorn-magic": {
+      "version": "0.1.0",
+      "integrity": "sha1-G7mlHII6r51zqL/NPRoj3elLDOQ=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/readable-stream": {
       "version": "2.3.8",
       "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "core-util-is": "~1.0.0",
@@ -4276,11 +5785,13 @@
     "node_modules/readable-stream/node_modules/safe-buffer": {
       "version": "5.1.2",
       "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/readdirp": {
       "version": "3.6.0",
       "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "picomatch": "^2.2.1"
@@ -4292,112 +5803,72 @@
     "node_modules/require-directory": {
       "version": "2.1.1",
       "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.10.0"
       }
     },
+    "node_modules/require-from-string": {
+      "version": "2.0.2",
+      "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/resolve-from": {
       "version": "4.0.0",
       "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/restore-cursor": {
-      "version": "4.0.0",
-      "integrity": "sha1-UZVgpDGJdQlt725gnUQQDtqkzLk=",
+      "version": "5.1.0",
+      "integrity": "sha1-B2bZVpnvrLFBUJk/VbrwlT6h6+c=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
+        "onetime": "^7.0.0",
+        "signal-exit": "^4.1.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/restore-cursor/node_modules/signal-exit": {
-      "version": "3.0.7",
-      "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk=",
-      "optional": true
-    },
     "node_modules/reusify": {
-      "version": "1.0.4",
-      "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=",
-      "optional": true,
+      "version": "1.1.0",
+      "integrity": "sha1-D+E7lSLhRz9RtVjueW4I8R+bSJ8=",
+      "devOptional": true,
+      "license": "MIT",
       "engines": {
         "iojs": ">=1.0.0",
         "node": ">=0.10.0"
       }
     },
-    "node_modules/rewire": {
+    "node_modules/run-applescript": {
       "version": "7.0.0",
-      "integrity": "sha1-QdtUgjcMiHWP/Jpxn3ySp2H6j78=",
-      "optional": true,
-      "dependencies": {
-        "eslint": "^8.47.0"
-      }
-    },
-    "node_modules/rimraf": {
-      "version": "3.0.2",
-      "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=",
-      "optional": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/rimraf/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
-      "optional": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/rimraf/node_modules/glob": {
-      "version": "7.2.3",
-      "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=",
-      "optional": true,
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.1.1",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
+      "integrity": "sha1-5aVTwr/9Yg4WnSdsHNjxtkd4++s=",
+      "dev": true,
+      "license": "MIT",
       "engines": {
-        "node": "*"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/rimraf/node_modules/minimatch": {
-      "version": "3.1.2",
-      "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=",
-      "optional": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=",
+      "devOptional": true,
       "funding": [
         {
           "type": "github",
@@ -4412,7 +5883,7 @@
           "url": "https://feross.org/support"
         }
       ],
-      "optional": true,
+      "license": "MIT",
       "dependencies": {
         "queue-microtask": "^1.2.2"
       }
@@ -4434,21 +5905,46 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ]
+      ],
+      "license": "MIT"
     },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
       "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/sax": {
       "version": "1.4.1",
       "integrity": "sha1-RMyJiDd/EmME07P8EBDHM7kp7w8=",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/secretlint": {
+      "version": "10.2.1",
+      "integrity": "sha1-Ah6iW7d/I++6Is53jRoAGxXed7E=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@secretlint/config-creator": "^10.2.1",
+        "@secretlint/formatter": "^10.2.1",
+        "@secretlint/node": "^10.2.1",
+        "@secretlint/profiler": "^10.2.1",
+        "debug": "^4.4.1",
+        "globby": "^14.1.0",
+        "read-pkg": "^9.0.1"
+      },
+      "bin": {
+        "secretlint": "bin/secretlint.js"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
     },
     "node_modules/semver": {
-      "version": "7.6.3",
-      "integrity": "sha1-mA97VVC8F1+03AlAMIVif56zMUM=",
+      "version": "7.7.2",
+      "integrity": "sha1-Z9mf3NNc7CHm+Lh6f9UVoz+YK1g=",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -4459,36 +5955,23 @@
     "node_modules/serialize-javascript": {
       "version": "6.0.2",
       "integrity": "sha1-3voeBVyDv21Z6oBdjahiJU62psI=",
-      "optional": true,
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/set-function-length": {
-      "version": "1.2.2",
-      "integrity": "sha1-qscjFBmOrtl1z3eyw7a4gGleVEk=",
-      "dev": true,
-      "dependencies": {
-        "define-data-property": "^1.1.4",
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.4",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
+      "license": "BSD-3-Clause",
+      "optional": true,
+      "dependencies": {
+        "randombytes": "^2.1.0"
       }
     },
     "node_modules/setimmediate": {
       "version": "1.0.5",
       "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^3.0.0"
       },
@@ -4500,19 +5983,75 @@
       "version": "3.0.0",
       "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=",
       "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/side-channel": {
-      "version": "1.0.6",
-      "integrity": "sha1-q9Jft80kuvRUZkBrEJa3gxySFfI=",
+      "version": "1.1.0",
+      "integrity": "sha1-w/z/nE2pMnhIczNeyXZfqU/2a8k=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.0",
+      "integrity": "sha1-EMtZhCYxFdO3oOM2WR4pCoMK+K0=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4",
-        "object-inspect": "^1.13.1"
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -4525,6 +6064,7 @@
       "version": "4.1.0",
       "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=",
       "devOptional": true,
+      "license": "ISC",
       "engines": {
         "node": ">=14"
       },
@@ -4550,6 +6090,7 @@
           "url": "https://feross.org/support"
         }
       ],
+      "license": "MIT",
       "optional": true
     },
     "node_modules/simple-get": {
@@ -4570,6 +6111,7 @@
           "url": "https://feross.org/support"
         }
       ],
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "decompress-response": "^6.0.0",
@@ -4578,33 +6120,36 @@
       }
     },
     "node_modules/sinon": {
-      "version": "18.0.1",
-      "integrity": "sha1-RkM0zf6izdxe2ppOp+Lj8MepHF4=",
+      "version": "19.0.5",
+      "integrity": "sha1-ZP0vhHhqBD9yEkbECza+9MS3azw=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "dependencies": {
         "@sinonjs/commons": "^3.0.1",
-        "@sinonjs/fake-timers": "11.2.2",
-        "@sinonjs/samsam": "^8.0.0",
-        "diff": "^5.2.0",
-        "nise": "^6.0.0",
-        "supports-color": "^7"
+        "@sinonjs/fake-timers": "^13.0.5",
+        "@sinonjs/samsam": "^8.0.1",
+        "diff": "^7.0.0",
+        "nise": "^6.1.1",
+        "supports-color": "^7.2.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/sinon"
       }
     },
-    "node_modules/sinon/node_modules/has-flag": {
-      "version": "4.0.0",
-      "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+    "node_modules/sinon/node_modules/diff": {
+      "version": "7.0.0",
+      "integrity": "sha1-P7NNOHzXbYA/buvqZ7kh2rAYKpo=",
+      "license": "BSD-3-Clause",
       "optional": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=0.3.1"
       }
     },
     "node_modules/sinon/node_modules/supports-color": {
       "version": "7.2.0",
       "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "has-flag": "^4.0.0"
@@ -4613,60 +6158,89 @@
         "node": ">=8"
       }
     },
-    "node_modules/source-map": {
-      "version": "0.6.1",
-      "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-      "optional": true,
+    "node_modules/slash": {
+      "version": "5.1.0",
+      "integrity": "sha1-vjrd3N8JrDjuvo3Nx7GlenWwlc4=",
+      "dev": true,
+      "license": "MIT",
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/source-map-support": {
-      "version": "0.5.21",
-      "integrity": "sha1-BP58f54e0tZiIzwoyys1ufY/bk8=",
-      "optional": true,
+    "node_modules/slice-ansi": {
+      "version": "4.0.0",
+      "integrity": "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
       }
     },
-    "node_modules/split": {
-      "version": "1.0.1",
-      "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=",
-      "optional": true,
+    "node_modules/spdx-correct": {
+      "version": "3.2.0",
+      "integrity": "sha1-T1qwZo8AWeNPnADc4zF4ShLeTpw=",
+      "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
-        "through": "2"
-      },
-      "engines": {
-        "node": "*"
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "node_modules/spdx-exceptions": {
+      "version": "2.5.0",
+      "integrity": "sha1-XWB9J/yAb2bXtkp2ZlD6iQ8E7WY=",
+      "dev": true,
+      "license": "CC-BY-3.0"
+    },
+    "node_modules/spdx-expression-parse": {
+      "version": "3.0.1",
+      "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
       }
     },
+    "node_modules/spdx-license-ids": {
+      "version": "3.0.21",
+      "integrity": "sha1-bW6YDJ3ytvyQU0OjstcCpiOVNsM=",
+      "dev": true,
+      "license": "CC0-1.0"
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true,
+      "license": "BSD-3-Clause"
+    },
     "node_modules/stdin-discarder": {
-      "version": "0.1.0",
-      "integrity": "sha1-IrPkADk6jijr9T+ZWPOIBiLv3iE=",
+      "version": "0.2.2",
+      "integrity": "sha1-OQA39ExK4aGuU1xf443Dq6jZl74=",
+      "license": "MIT",
       "optional": true,
-      "dependencies": {
-        "bl": "^5.0.0"
-      },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/stoppable": {
-      "version": "1.1.0",
-      "integrity": "sha1-MtpWjoPqSIsI5NfqLDvMnXUBXVs=",
-      "dev": true,
-      "engines": {
-        "node": ">=4",
-        "npm": ">=6"
-      }
-    },
     "node_modules/string_decoder": {
       "version": "1.1.1",
       "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "safe-buffer": "~5.1.0"
@@ -4675,22 +6249,21 @@
     "node_modules/string_decoder/node_modules/safe-buffer": {
       "version": "5.1.2",
       "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/string-width": {
-      "version": "5.1.2",
-      "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q=",
+      "version": "4.2.3",
+      "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
       },
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=8"
       }
     },
     "node_modules/string-width-cjs": {
@@ -4698,6 +6271,7 @@
       "version": "4.2.3",
       "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -4707,26 +6281,53 @@
         "node": ">=8"
       }
     },
-    "node_modules/string-width-cjs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
-      "devOptional": true
+    "node_modules/string-width-cjs/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+      "devOptional": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
     },
     "node_modules/string-width/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=",
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
       "devOptional": true,
+      "license": "MIT",
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+        "node": ">=8"
       }
     },
     "node_modules/string-width/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
       "version": "7.1.0",
       "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^6.0.1"
       },
@@ -4737,10 +6338,12 @@
         "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "node_modules/strip-ansi": {
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
       "version": "6.0.1",
       "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -4748,14 +6351,11 @@
         "node": ">=8"
       }
     },
-    "node_modules/strip-ansi-cjs": {
-      "name": "strip-ansi",
-      "version": "6.0.1",
-      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+    "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
       "devOptional": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -4763,6 +6363,7 @@
     "node_modules/strip-json-comments": {
       "version": "3.1.1",
       "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=8"
@@ -4771,108 +6372,244 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/structured-source": {
+      "version": "4.0.0",
+      "integrity": "sha1-DJ5Z7kPe3Y/GCmNzH2DjWBAqSUg=",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boundary": "^2.0.0"
+      }
+    },
     "node_modules/supports-color": {
-      "version": "5.5.0",
-      "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+      "version": "9.4.0",
+      "integrity": "sha1-F7/PaGKI9THbPeoyFVEGIcy1WVQ=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/supports-hyperlinks": {
+      "version": "3.2.0",
+      "integrity": "sha1-uOSFsXloHepJah56vfiYW9MUVGE=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "has-flag": "^3.0.0"
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1"
+      }
+    },
+    "node_modules/supports-hyperlinks/node_modules/supports-color": {
+      "version": "7.2.0",
+      "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/table": {
+      "version": "6.9.0",
+      "integrity": "sha1-UAQK+mJkFBx1ZrO4HU2CxHqGaPU=",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "ajv": "^8.0.1",
+        "lodash.truncate": "^4.4.2",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/table/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/table/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "2.2.2",
+      "integrity": "sha1-q0mENA0wy5mJpJADLwhtu4tW2HI=",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
       }
     },
     "node_modules/tar-fs": {
-      "version": "2.1.1",
-      "integrity": "sha1-SJoVq4Xx8L76uzcLfeT561y+h4Q=",
+      "version": "2.1.3",
+      "integrity": "sha1-+zuIQ6JrbxOgjmBveSKHXrH7v5I=",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
+      }
+    },
+    "node_modules/tar-stream": {
+      "version": "2.2.0",
+      "integrity": "sha1-rK2EwoQTawYNw/qmRHSqmuvXcoc=",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/tar-stream/node_modules/readable-stream": {
+      "version": "3.6.2",
+      "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/terminal-link": {
+      "version": "4.0.0",
+      "integrity": "sha1-Xz5QMpQg+tl9B9Yk998YUdgpY/E=",
       "dev": true,
-      "optional": true,
+      "license": "MIT",
       "dependencies": {
-        "chownr": "^1.1.1",
-        "mkdirp-classic": "^0.5.2",
-        "pump": "^3.0.0",
-        "tar-stream": "^2.1.4"
+        "ansi-escapes": "^7.0.0",
+        "supports-hyperlinks": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/tar-stream": {
-      "version": "2.2.0",
-      "integrity": "sha1-rK2EwoQTawYNw/qmRHSqmuvXcoc=",
-      "dev": true,
+    "node_modules/test-exclude": {
+      "version": "6.0.0",
+      "integrity": "sha1-BKhphmHYBepvopO2y55jrARO8V4=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
-        "bl": "^4.0.3",
-        "end-of-stream": "^1.4.1",
-        "fs-constants": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^3.1.1"
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=8"
       }
     },
-    "node_modules/tar-stream/node_modules/bl": {
-      "version": "4.1.0",
-      "integrity": "sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo=",
-      "dev": true,
+    "node_modules/test-exclude/node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "integrity": "sha1-q5tFRGblqMw6GHvqrVgEEqnFuEM=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "buffer": "^5.5.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.4.0"
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/tar-stream/node_modules/buffer": {
-      "version": "5.7.1",
-      "integrity": "sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA=",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
+    "node_modules/test-exclude/node_modules/glob": {
+      "version": "7.2.3",
+      "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/tar-stream/node_modules/readable-stream": {
-      "version": "3.6.2",
-      "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=",
-      "dev": true,
+    "node_modules/test-exclude/node_modules/minimatch": {
+      "version": "3.1.2",
+      "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=",
+      "license": "ISC",
       "optional": true,
       "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
+        "brace-expansion": "^1.1.7"
       },
       "engines": {
-        "node": ">= 6"
+        "node": "*"
       }
     },
     "node_modules/text-table": {
       "version": "0.2.0",
       "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "optional": true
+      "dev": true,
+      "license": "MIT"
     },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "optional": true
+    "node_modules/textextensions": {
+      "version": "6.11.0",
+      "integrity": "sha1-hkU10J9JAmFQyW8LDXnx+ghp2xU=",
+      "dev": true,
+      "license": "Artistic-2.0",
+      "dependencies": {
+        "editions": "^6.21.0"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "funding": {
+        "url": "https://bevry.me/fund"
+      }
     },
     "node_modules/tmp": {
       "version": "0.2.3",
       "integrity": "sha1-63g8wivB6L69BnFHbUbqTrMqea4=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=14.14"
       }
@@ -4880,7 +6617,8 @@
     "node_modules/to-regex-range": {
       "version": "5.0.1",
       "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
-      "optional": true,
+      "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -4888,29 +6626,28 @@
         "node": ">=8.0"
       }
     },
-    "node_modules/tr46": {
-      "version": "0.0.3",
-      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
-    },
     "node_modules/ts-api-utils": {
-      "version": "1.3.0",
-      "integrity": "sha1-S0kOJxKfHo5oa0XMSrY3FNxg7qE=",
+      "version": "2.1.0",
+      "integrity": "sha1-WV9wlORu7TZME/0j51+VE9Kbr5E=",
+      "license": "MIT",
       "optional": true,
       "engines": {
-        "node": ">=16"
+        "node": ">=18.12"
       },
       "peerDependencies": {
-        "typescript": ">=4.2.0"
+        "typescript": ">=4.8.4"
       }
     },
     "node_modules/tslib": {
-      "version": "2.7.0",
-      "integrity": "sha1-2bQMXECrWehzjyl98wh78aJpDAE="
+      "version": "2.8.1",
+      "integrity": "sha1-YS7+TtI11Wfoq6Xypfq3AoCt6D8=",
+      "license": "0BSD"
     },
     "node_modules/tunnel": {
       "version": "0.0.6",
       "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
       }
@@ -4919,6 +6656,7 @@
       "version": "0.6.0",
       "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
       "dev": true,
+      "license": "Apache-2.0",
       "optional": true,
       "dependencies": {
         "safe-buffer": "^5.0.1"
@@ -4930,6 +6668,7 @@
     "node_modules/type-check": {
       "version": "0.4.0",
       "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "prelude-ls": "^1.2.1"
@@ -4941,17 +6680,19 @@
     "node_modules/type-detect": {
       "version": "4.0.8",
       "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/type-fest": {
-      "version": "0.20.2",
-      "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=",
-      "optional": true,
+      "version": "4.41.0",
+      "integrity": "sha1-auHI5XMSc8K/H1itOcuuLJGkbFg=",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
       "engines": {
-        "node": ">=10"
+        "node": ">=16"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -4961,6 +6702,7 @@
       "version": "1.8.11",
       "integrity": "sha1-aQbwLjyR6NhRV58lWr8P1ggAoE0=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "qs": "^6.9.1",
         "tunnel": "0.0.6",
@@ -4968,8 +6710,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.6.3",
-      "integrity": "sha1-XzRJ4xydlP67F94DzAgd1W2B21s=",
+      "version": "5.8.3",
+      "integrity": "sha1-kvij5ePPSXNW9BeMNM1lp/XoRA4=",
+      "license": "Apache-2.0",
       "optional": true,
       "bin": {
         "tsc": "bin/tsc",
@@ -4979,32 +6722,81 @@
         "node": ">=14.17"
       }
     },
+    "node_modules/typescript-eslint": {
+      "version": "8.38.0",
+      "integrity": "sha1-5zr3YYE58HsW4vrnFe7aq7Qe6LA=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@typescript-eslint/eslint-plugin": "8.38.0",
+        "@typescript-eslint/parser": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0",
+        "@typescript-eslint/utils": "8.38.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <5.9.0"
+      }
+    },
     "node_modules/uc.micro": {
       "version": "2.1.0",
       "integrity": "sha1-+NP30OxMPeo1p+PI76TLi0XJ5+4=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/underscore": {
       "version": "1.13.7",
       "integrity": "sha1-lw4zljr5p92iKPF+voOZ5fvmOhA=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/undici": {
-      "version": "6.20.0",
-      "integrity": "sha1-O5TZZ2k3WepiWjt4sglyE/MEBaE=",
+      "version": "7.12.0",
+      "integrity": "sha1-6TJE+kk4PooOGkKVBI/UVFQcfMs=",
       "dev": true,
+      "license": "MIT",
       "engines": {
-        "node": ">=18.17"
+        "node": ">=20.18.1"
       }
     },
     "node_modules/undici-types": {
-      "version": "6.19.8",
-      "integrity": "sha1-NREcnRQ3q4OnzcCrri8m2I7aCgI=",
+      "version": "6.21.0",
+      "integrity": "sha1-aR0ArzkJvpOn+qE75hs6W1DvEss=",
+      "license": "MIT",
       "optional": true
     },
+    "node_modules/unicorn-magic": {
+      "version": "0.3.0",
+      "integrity": "sha1-Tv1FyFpp4N1XbSVTL7+iKqXIoQQ=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "integrity": "sha1-Fo78IYCWTmOG0GHglN9hr+I5sY0=",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
     "node_modules/untildify": {
       "version": "4.0.0",
       "integrity": "sha1-K8lHuVNlJIfkYAlJ+wkeOujNkZs=",
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -5012,6 +6804,7 @@
     "node_modules/uri-js": {
       "version": "4.4.1",
       "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=",
+      "license": "BSD-2-Clause",
       "optional": true,
       "dependencies": {
         "punycode": "^2.1.0"
@@ -5020,11 +6813,13 @@
     "node_modules/url-join": {
       "version": "4.0.1",
       "integrity": "sha1-tkLiGiZGgI/6F4xMX9o5hE4Szec=",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "license": "MIT",
       "optional": true
     },
     "node_modules/uuid": {
@@ -5034,13 +6829,51 @@
         "https://github.com/sponsors/broofa",
         "https://github.com/sponsors/ctavan"
       ],
+      "license": "MIT",
       "bin": {
         "uuid": "dist/bin/uuid"
       }
     },
+    "node_modules/v8-to-istanbul": {
+      "version": "9.3.0",
+      "integrity": "sha1-uVcqv6Yr1VbBbXX968GkEdX/MXU=",
+      "license": "ISC",
+      "optional": true,
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.12",
+        "@types/istanbul-lib-coverage": "^2.0.1",
+        "convert-source-map": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.12.0"
+      }
+    },
+    "node_modules/validate-npm-package-license": {
+      "version": "3.0.4",
+      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "node_modules/version-range": {
+      "version": "4.14.0",
+      "integrity": "sha1-kcEuRmV1apEB0a9D+u2jmavg7ew=",
+      "dev": true,
+      "license": "Artistic-2.0",
+      "engines": {
+        "node": ">=4"
+      },
+      "funding": {
+        "url": "https://bevry.me/fund"
+      }
+    },
     "node_modules/vscode-jsonrpc": {
       "version": "8.2.0",
       "integrity": "sha1-9D36NftR52PRfNlNzKDJRY81q/k=",
+      "license": "MIT",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -5048,6 +6881,7 @@
     "node_modules/vscode-languageclient": {
       "version": "9.0.1",
       "integrity": "sha1-zf4gJncmyNTbg53B6dGBbhKW6FQ=",
+      "license": "MIT",
       "dependencies": {
         "minimatch": "^5.1.0",
         "semver": "^7.3.7",
@@ -5060,6 +6894,7 @@
     "node_modules/vscode-languageclient/node_modules/minimatch": {
       "version": "5.1.6",
       "integrity": "sha1-HPy4z1Ui6mmVLNKvla4JR38SKpY=",
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -5070,6 +6905,7 @@
     "node_modules/vscode-languageserver-protocol": {
       "version": "3.17.5",
       "integrity": "sha1-hkqLjzkINVcvThO9n4MT0OOsS+o=",
+      "license": "MIT",
       "dependencies": {
         "vscode-jsonrpc": "8.2.0",
         "vscode-languageserver-types": "3.17.5"
@@ -5077,34 +6913,14 @@
     },
     "node_modules/vscode-languageserver-types": {
       "version": "3.17.5",
-      "integrity": "sha1-MnNnbwzy6rQLP0TQhay7fwijnYo="
-    },
-    "node_modules/vscode-test-adapter-api": {
-      "version": "1.9.0",
-      "integrity": "sha1-D9Ff7Z8mFZZwmWyz349WGJAKAHk=",
-      "optional": true,
-      "engines": {
-        "vscode": "^1.23.0"
-      }
-    },
-    "node_modules/vscode-test-adapter-remoting-util": {
-      "version": "0.13.0",
-      "integrity": "sha1-5BNv1y0pK1dul6ZvRLdPkB9PJj8=",
-      "optional": true,
-      "dependencies": {
-        "split": "^1.0.1",
-        "tslib": "^2.0.0",
-        "vscode-test-adapter-api": "^1.9.0"
-      }
-    },
-    "node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+      "integrity": "sha1-MnNnbwzy6rQLP0TQhay7fwijnYo=",
+      "license": "MIT"
     },
     "node_modules/whatwg-encoding": {
       "version": "3.1.1",
       "integrity": "sha1-0PTvdpkF1CbhaI8+NDgambYLduU=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "iconv-lite": "0.6.3"
       },
@@ -5116,22 +6932,16 @@
       "version": "4.0.0",
       "integrity": "sha1-vBv5SphdxQOI1UqSWKxAXDyi/Ao=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=18"
       }
     },
-    "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
     "node_modules/which": {
       "version": "2.0.2",
       "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
       "devOptional": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -5145,6 +6955,7 @@
     "node_modules/word-wrap": {
       "version": "1.2.5",
       "integrity": "sha1-0sRcbdT7zmIaZvE2y+Mor9BBCzQ=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.10.0"
@@ -5153,12 +6964,14 @@
     "node_modules/workerpool": {
       "version": "6.5.1",
       "integrity": "sha1-Bg9zs50Mr5fG22TaAEzQG0wJlUQ=",
+      "license": "Apache-2.0",
       "optional": true
     },
     "node_modules/wrap-ansi": {
       "version": "8.1.0",
       "integrity": "sha1-VtwiNo7lcPrOG0mBmXXZuaXq0hQ=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^6.1.0",
         "string-width": "^5.0.1",
@@ -5176,6 +6989,7 @@
       "version": "7.0.0",
       "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -5188,69 +7002,32 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+    "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
       "devOptional": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
+      "license": "MIT",
       "engines": {
         "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
-      "version": "2.0.1",
-      "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
-      "devOptional": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
       }
     },
-    "node_modules/wrap-ansi-cjs/node_modules/color-name": {
-      "version": "1.1.4",
-      "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
-      "devOptional": true
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
-      "devOptional": true
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
-      "version": "4.2.3",
-      "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=",
+    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
+        "ansi-regex": "^5.0.1"
       },
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=",
-      "devOptional": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
     "node_modules/wrap-ansi/node_modules/ansi-styles": {
       "version": "6.2.1",
       "integrity": "sha1-DmIyDPmcIa//OzASGSVGqsv7BcU=",
       "devOptional": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -5258,29 +7035,55 @@
         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=",
+    "node_modules/wrap-ansi/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=",
+      "devOptional": true,
+      "license": "MIT"
+    },
+    "node_modules/wrap-ansi/node_modules/string-width": {
+      "version": "5.1.2",
+      "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q=",
       "devOptional": true,
+      "license": "MIT",
       "dependencies": {
-        "ansi-regex": "^6.0.1"
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
       },
       "engines": {
         "node": ">=12"
       },
       "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/wrappy": {
       "version": "1.0.2",
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "license": "ISC",
       "optional": true
     },
+    "node_modules/wsl-utils": {
+      "version": "0.1.0",
+      "integrity": "sha1-h4PU32cdTVA2W+LuTHGRegVXuqs=",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-wsl": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/xml2js": {
       "version": "0.5.0",
       "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "sax": ">=0.6.0",
         "xmlbuilder": "~11.0.0"
@@ -5293,6 +7096,7 @@
       "version": "11.0.1",
       "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4.0"
       }
@@ -5300,6 +7104,7 @@
     "node_modules/y18n": {
       "version": "5.0.8",
       "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=",
+      "license": "ISC",
       "optional": true,
       "engines": {
         "node": ">=10"
@@ -5308,36 +7113,40 @@
     "node_modules/yallist": {
       "version": "4.0.0",
       "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/yargs": {
-      "version": "16.2.0",
-      "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=",
+      "version": "17.7.2",
+      "integrity": "sha1-mR3zmspnWhkrgW4eA2P5110qomk=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
-        "cliui": "^7.0.2",
+        "cliui": "^8.0.1",
         "escalade": "^3.1.1",
         "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
+        "string-width": "^4.2.3",
         "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
+        "yargs-parser": "^21.1.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=12"
       }
     },
     "node_modules/yargs-parser": {
-      "version": "20.2.9",
-      "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=",
+      "version": "21.1.1",
+      "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=",
+      "license": "ISC",
       "optional": true,
       "engines": {
-        "node": ">=10"
+        "node": ">=12"
       }
     },
     "node_modules/yargs-unparser": {
       "version": "2.0.0",
       "integrity": "sha1-8TH5ImkRrl2a04xDL+gJNmwjJes=",
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "camelcase": "^6.0.0",
@@ -5349,28 +7158,11 @@
         "node": ">=10"
       }
     },
-    "node_modules/yargs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
-      "optional": true
-    },
-    "node_modules/yargs/node_modules/string-width": {
-      "version": "4.2.3",
-      "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=",
-      "optional": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/yauzl": {
       "version": "2.10.0",
       "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "buffer-crc32": "~0.2.3",
         "fd-slicer": "~1.1.0"
@@ -5380,6 +7172,7 @@
       "version": "2.5.1",
       "integrity": "sha1-o9ZdPdZZpbCTeFDoYJ8i//orXDU=",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "buffer-crc32": "~0.2.3"
       }
@@ -5387,6 +7180,7 @@
     "node_modules/yocto-queue": {
       "version": "0.1.0",
       "integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=10"
diff --git a/package.json b/package.json
index a18d5c2ffc..f86e867977 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
 {
   "name": "powershell",
   "displayName": "PowerShell",
-  "version": "2024.2.2",
+  "version": "2025.2.0",
   "preview": false,
   "publisher": "ms-vscode",
   "description": "Develop PowerShell modules, commands and scripts in Visual Studio Code!",
   "engines": {
-    "vscode": "^1.94.0"
+    "vscode": "^1.101.0"
   },
   "author": "Microsoft Corporation",
   "license": "SEE LICENSE IN LICENSE.txt",
@@ -60,45 +60,39 @@
     "onCommand:PowerShell.SpecifyScriptArgs"
   ],
   "dependencies": {
-    "@vscode/extension-telemetry": "^0.9.7",
-    "node-fetch": "^2.7.0",
-    "semver": "^7.6.3",
+    "@vscode/extension-telemetry": "^0.9.9",
+    "semver": "^7.7.2",
     "untildify": "^4.0.0",
     "uuid": "^9.0.1",
     "vscode-languageclient": "^9.0.1",
     "vscode-languageserver-protocol": "^3.17.5"
   },
   "devDependencies": {
-    "@vscode/vsce": "^3.1.1",
-    "esbuild": "^0.21.5"
+    "@vscode/vsce": "^3.6.0",
+    "esbuild": "^0.25.8"
   },
   "optionalDependencies": {
-    "@types/mocha": "^10.0.9",
+    "@eslint/js": "^9.26.0",
     "@types/mock-fs": "^4.13.4",
-    "@types/node": "^20.16.11",
-    "@types/node-fetch": "^2.6.11",
-    "@types/rewire": "^2.5.30",
-    "@types/semver": "^7.5.8",
-    "@types/sinon": "^17.0.3",
+    "@types/node": "^22.16.5",
+    "@types/semver": "^7.7.0",
+    "@types/sinon": "^17.0.4",
     "@types/ungap__structured-clone": "^1.2.0",
     "@types/uuid": "^9.0.8",
-    "@types/vscode": "~1.94.0",
-    "@typescript-eslint/eslint-plugin": "^8.8.1",
-    "@typescript-eslint/parser": "^8.8.1",
-    "@ungap/structured-clone": "^1.2.0",
+    "@types/vscode": "~1.101.0",
+    "@ungap/structured-clone": "^1.3.0",
     "@vscode/debugprotocol": "^1.68.0",
-    "@vscode/test-electron": "^2.4.1",
-    "eslint": "^8.57.0",
-    "eslint-plugin-header": "^3.1.1",
-    "glob": "^11.0.0",
-    "mocha": "^10.7.3",
-    "mocha-explorer-launcher-scripts": "^0.4.0",
-    "mocha-multi-reporters": "^1.5.1",
-    "mock-fs": "^5.3.0",
-    "rewire": "^7.0.0",
-    "sinon": "^18.0.1",
-    "source-map-support": "^0.5.21",
-    "typescript": "^5.6.3"
+    "@vscode/test-cli": "^0.0.10",
+    "@vscode/test-electron": "^2.5.2",
+    "esbuild-register": "^3.6.0",
+    "eslint": "^9.31.0",
+    "eslint-config-prettier": "^10.1.8",
+    "mock-fs": "^5.5.0",
+    "prettier": "^3.6.2",
+    "prettier-plugin-organize-imports": "^4.2.0",
+    "sinon": "^19.0.5",
+    "typescript": "^5.8.3",
+    "typescript-eslint": "^8.38.0"
   },
   "extensionDependencies": [
     "vscode.powershell"
@@ -108,11 +102,17 @@
     "compile": "esbuild ./src/extension.ts --outdir=dist --sourcemap --bundle --external:vscode --platform=node",
     "watch": "npm run compile -- --watch",
     "lint": "eslint src test --ext .ts",
+    "format": "prettier --check '**/*.{ts,json,yml,mjs,code-workspace}'",
     "package": "vsce package --out out/ --no-gitHubIssueLinking",
     "publish": "vsce publish",
-    "compile-test": "npm run compile && tsc --incremental",
-    "watch-tests": "npm run compile-test -- --watch",
-    "test": "npm run compile-test && node ./test/runTests.js"
+    "pretest": "npm run compile",
+    "test": "vscode-test"
+  },
+  "prettier": {
+    "endOfLine": "auto",
+    "plugins": [
+      "prettier-plugin-organize-imports"
+    ]
   },
   "contributes": {
     "breakpoints": [
@@ -300,6 +300,16 @@
         "title": "Move panel to bottom",
         "category": "PowerShell",
         "icon": "$(layout-panel-right)"
+      },
+      {
+        "title": "[PowerShell Debug Input Task] Wait for and return PSES startup PID",
+        "command": "PowerShell.WaitForPsesActivationAndReturnProcessId",
+        "enablement": "false"
+      },
+      {
+        "title": "[PowerShell Debug Input Task] Get the VS Code Session ID for writing the PID file",
+        "command": "GetVsCodeSessionId",
+        "enablement": "false"
       }
     ],
     "menus": {
@@ -507,7 +517,7 @@
             }
           },
           {
-            "label": "Run Pester Tests (Binary Module)",
+            "label": "PowerShell: Run Pester Tests (Binary Module)",
             "description": "Debug a .NET binary or hybrid module by running Pester tests. Breakpoints you set in your .NET (C#/F#/VB/etc.) code will be hit upon command execution. You may want to add a compile or watch action as a pre-launch task to this configuration.",
             "body": {
               "name": "PowerShell: Binary Module Pester Tests",
@@ -517,6 +527,16 @@
               "createTemporaryIntegratedConsole": true,
               "attachDotnetDebugger": true
             }
+          },
+          {
+            "label": "PowerShell: Windows PowerShell",
+            "description": "(Windows Only) Launch a temporary Windows PowerShell console for debugging. This is useful for debugging legacy scripts that require Windows PowerShell.",
+            "body": {
+              "name": "PowerShell: Windows PowerShell",
+              "type": "PowerShell",
+              "request": "launch",
+              "sessionName": "Windows PowerShell (x64)"
+            }
           }
         ],
         "configurationAttributes": {
@@ -544,6 +564,14 @@
                 "description": "Determines whether a temporary PowerShell Extension Terminal is created for each debugging session, useful for debugging PowerShell classes and binary modules.  Overrides the user setting 'powershell.debugging.createTemporaryIntegratedConsole'.",
                 "default": false
               },
+              "sessionName": {
+                "type": [
+                  "string",
+                  "null"
+                ],
+                "description": "If specified, uses the PowerShell session name to launch the debug configuration. Will always launch in a temporary console if specified.",
+                "default": null
+              },
               "attachDotnetDebugger": {
                 "type": "boolean",
                 "description": "If specified, a C# debug session will be started and attached to the new temporary extension terminal. This does nothing unless 'powershell.debugging.createTemporaryIntegratedConsole' is also specified.",
@@ -582,6 +610,11 @@
                 "type": "string",
                 "description": "The custom pipe name of the PowerShell host process to attach to.",
                 "default": null
+              },
+              "createTemporaryIntegratedConsole": {
+                "type": "boolean",
+                "description": "Determines whether a temporary PowerShell Extension Terminal is created for each debugging session, useful for debugging PowerShell classes and binary modules.  Overrides the user setting 'powershell.debugging.createTemporaryIntegratedConsole'.",
+                "default": false
               }
             }
           }
@@ -589,437 +622,464 @@
         "initialConfigurations": []
       }
     ],
-    "configuration": {
-      "title": "PowerShell",
-      "properties": {
-        "powershell.sideBar.CommandExplorerVisibility": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Specifies the visibility of the Command Explorer in the side bar."
-        },
-        "powershell.sideBar.CommandExplorerExcludeFilter": {
-          "type": "array",
-          "items": {
-            "type": "string"
+    "configuration": [
+      {
+        "title": "Interface",
+        "properties": {
+          "powershell.buttons.showRunButtons": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Show the `Run` and `Run Selection` buttons in the editor's title bar."
           },
-          "default": [],
-          "markdownDescription": "Specifies an array of modules to exclude from Command Explorer listing."
-        },
-        "powershell.powerShellAdditionalExePaths": {
-          "type": "object",
-          "default": {},
-          "markdownDescription": "Specifies a list of Item / Value pairs where the **Item** is a user-chosen name and the **Value** is an absolute path to a PowerShell executable. The name appears in the [Session Menu Command](command:PowerShell.ShowSessionMenu) and is used to reference this executable in the `#powershell.powerShellDefaultVersion#` setting.",
-          "additionalProperties": {
-            "type": "string"
+          "powershell.buttons.showPanelMovementButtons": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Show buttons in the editor's title bar for moving the terminals pane (with the PowerShell Extension Terminal) around."
+          },
+          "powershell.enableReferencesCodeLens": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Specifies if Code Lenses are displayed above function definitions, used to show the number of times the function is referenced in the workspace and navigate to those references. Large workspaces may want to disable this setting if performance is compromised. See also `#powershell.analyzeOpenDocumentsOnly#`."
+          },
+          "powershell.codeFolding.enable": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Enables syntax based code folding. When disabled, the default indentation based code folding is used."
+          },
+          "powershell.codeFolding.showLastLine": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Shows the last line of a folded section similar to the default VS Code folding style. When disabled, the entire folded region is hidden."
+          },
+          "powershell.helpCompletion": {
+            "type": "string",
+            "default": "BlockComment",
+            "enum": [
+              "Disabled",
+              "BlockComment",
+              "LineComment"
+            ],
+            "markdownEnumDescriptions": [
+              "Disables the feature.",
+              "Inserts a block style help comment, for example:\n\n`<#`\n\n`.<help keyword>`\n\n`<help content>`\n\n`#>`",
+              "Inserts a line style help comment, for example:\n\n`# .<help keyword>`\n\n`# <help content>`"
+            ],
+            "markdownDescription": "Specifies the [comment based help](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comment_based_help) completion style triggered by typing ` ##`."
+          },
+          "powershell.sideBar.CommandExplorerVisibility": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Specifies the visibility of the Command Explorer in the side bar."
+          },
+          "powershell.sideBar.CommandExplorerExcludeFilter": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "default": [],
+            "markdownDescription": "Specifies an array of modules to exclude from Command Explorer listing."
+          },
+          "powershell.promptToUpdatePowerShell": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Specifies whether you may be prompted to update your version of PowerShell."
+          },
+          "powershell.promptToUpdatePackageManagement": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "**Deprecated:** Specifies whether you should be prompted to update your version of `PackageManagement` if it's under 1.4.6.",
+            "markdownDeprecationMessage": "**Deprecated:** This prompt has been removed as it's no longer strictly necessary to upgrade the `PackageManagement` module."
+          },
+          "powershell.suppressAdditionalExeNotFoundWarning": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Suppresses the warning message when any of `#powershell.powerShellAdditionalExePaths#` is not found."
           }
-        },
-        "powershell.powerShellDefaultVersion": {
-          "type": "string",
-          "default": "",
-          "markdownDescription": "Specifies the default PowerShell version started by the extension. The name must match what is displayed in the [Session Menu command](command:PowerShell.ShowSessionMenu), for example, `Windows PowerShell (x86)`. You can specify additional PowerShell executables with the `#powershell.powerShellAdditionalExePaths#` setting."
-        },
-        "powershell.powerShellExePath": {
-          "type": "string",
-          "default": "",
-          "scope": "machine",
-          "markdownDescription": "**Deprecated:** Specifies the path to the PowerShell executable.",
-          "markdownDeprecationMessage": "**Deprecated:** Please use the `#powershell.powerShellAdditionalExePaths#` setting instead."
-        },
-        "powershell.promptToUpdatePowerShell": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Specifies whether you may be prompted to update your version of PowerShell."
-        },
-        "powershell.promptToUpdatePackageManagement": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "**Deprecated:** Specifies whether you should be prompted to update your version of `PackageManagement` if it's under 1.4.6.",
-          "markdownDeprecationMessage": "**Deprecated:** This prompt has been removed as it's no longer strictly necessary to upgrade the `PackageManagement` module."
-        },
-        "powershell.suppressAdditionalExeNotFoundWarning": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Suppresses the warning message when any of `#powershell.powerShellAdditionalExePaths#` is not found."
-        },
-        "powershell.startAsLoginShell.osx": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Starts the PowerShell extension's underlying PowerShell process as a login shell, if applicable."
-        },
-        "powershell.startAsLoginShell.linux": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Starts the PowerShell extension's underlying PowerShell process as a login shell, if applicable."
-        },
-        "powershell.startAutomatically": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Starts the PowerShell extension automatically when a PowerShell file is opened. If `false`, to start the extension use the [Restart Session command](command:PowerShell.RestartSession). **IntelliSense, code navigation, the Extension Terminal, code formatting, and other features are not enabled until the extension starts.**"
-        },
-        "powershell.useX86Host": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "**Deprecated:** Uses the 32-bit language service on 64-bit Windows. This setting has no effect on 32-bit Windows or on the PowerShell extension debugger, which has its own architecture configuration.",
-          "markdownDeprecationMessage": "**Deprecated:** This setting was removed when the PowerShell installation searcher was added. Please use the `#powershell.powerShellAdditionalExePaths#` setting instead."
-        },
-        "powershell.enableProfileLoading": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Specifies whether the extension loads [PowerShell profiles](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles). Note that the extension's \"Current Host\" profile is `Microsoft.VSCode_profile.ps1`, which will be loaded instead of the default \"Current Host\" profile of `Microsoft.PowerShell_profile.ps1`. Use the \"All Hosts\" profile `profile.ps1` for common configuration."
-        },
-        "powershell.enableReferencesCodeLens": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Specifies if Code Lenses are displayed above function definitions, used to show the number of times the function is referenced in the workspace and navigate to those references. Large workspaces may want to disable this setting if performance is compromised. See also `#powershell.analyzeOpenDocumentsOnly#`."
-        },
-        "powershell.analyzeOpenDocumentsOnly": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Specifies to search for references only within open documents instead of all workspace files. An alternative to `#powershell.enableReferencesCodeLens#` that allows large workspaces to support some references without the performance impact."
-        },
-        "powershell.bugReporting.project": {
-          "type": "string",
-          "default": "https://github.com/PowerShell/vscode-powershell",
-          "markdownDescription": "**Deprecated:** Specifies the URL of the GitHub project in which to generate bug reports.",
-          "markdownDeprecationMessage": "**Deprecated:** This setting was never meant to be changed!"
-        },
-        "powershell.helpCompletion": {
-          "type": "string",
-          "default": "BlockComment",
-          "enum": [
-            "Disabled",
-            "BlockComment",
-            "LineComment"
-          ],
-          "markdownEnumDescriptions": [
-            "Disables the feature.",
-            "Inserts a block style help comment, for example:\n\n`<#`\n\n`.<help keyword>`\n\n`<help content>`\n\n`#>`",
-            "Inserts a line style help comment, for example:\n\n`# .<help keyword>`\n\n`# <help content>`"
-          ],
-          "markdownDescription": "Specifies the [comment based help](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comment_based_help) completion style triggered by typing ` ##`."
-        },
-        "powershell.cwd": {
-          "type": "string",
-          "default": "",
-          "markdownDescription": "A path where the Extension Terminal will be launched. Both the PowerShell process's and the shell's location will be set to this directory. Does not support variables, but does support the use of '~' and paths relative to a single workspace. **For multi-root workspaces, use the name of the folder you wish to have as the cwd.**"
-        },
-        "powershell.scriptAnalysis.enable": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Enables real-time script analysis using [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer) that populates the [Problems view](command:workbench.panel.markers.view.focus)."
-        },
-        "powershell.scriptAnalysis.settingsPath": {
-          "type": "string",
-          "default": "PSScriptAnalyzerSettings.psd1",
-          "markdownDescription": "Specifies the path to a [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer) settings file. **This setting may not work as expected currently!**"
-        },
-        "powershell.codeFolding.enable": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Enables syntax based code folding. When disabled, the default indentation based code folding is used."
-        },
-        "powershell.codeFolding.showLastLine": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Shows the last line of a folded section similar to the default VS Code folding style. When disabled, the entire folded region is hidden."
-        },
-        "powershell.codeFormatting.autoCorrectAliases": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Replaces aliases with their aliased name."
-        },
-        "powershell.codeFormatting.avoidSemicolonsAsLineTerminators": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Removes redundant semicolon(s) at the end of a line where a line terminator is sufficient."
-        },
-        "powershell.codeFormatting.preset": {
-          "type": "string",
-          "default": "Custom",
-          "enum": [
-            "Custom",
-            "Allman",
-            "OTBS",
-            "Stroustrup"
-          ],
-          "markdownEnumDescriptions": [
-            "The three brace settings are respected as-is.",
-            "Sets `#powershell.codeFormatting.openBraceOnSameLine#` to `false`, `#powershell.codeFormatting.newLineAfterOpenBrace#` to `true`, and `#powershell.codeFormatting.newLineAfterCloseBrace#` to `true`.",
-            "Sets `#powershell.codeFormatting.openBraceOnSameLine#` to `true`, `#powershell.codeFormatting.newLineAfterOpenBrace#` to `true`, and `#powershell.codeFormatting.newLineAfterCloseBrace#` to `false`.",
-            "Sets `#powershell.codeFormatting.openBraceOnSameLine#` to `true`, `#powershell.codeFormatting.newLineAfterOpenBrace#` to `true`, and `#powershell.codeFormatting.newLineAfterCloseBrace#` to `true`."
-          ],
-          "markdownDescription": "Sets the code formatting options to follow the given indent style in a way that is compatible with PowerShell syntax. Any setting other than `Custom` will configure (and override) the settings:\n\n* `#powershell.codeFormatting.openBraceOnSameLine#`\n\n* `#powershell.codeFormatting.newLineAfterOpenBrace#`\n\n* `#powershell.codeFormatting.newLineAfterCloseBrace#`\n\nFor more information about the brace styles, please see [PoshCode's discussion](https://github.com/PoshCode/PowerShellPracticeAndStyle/issues/81)."
-        },
-        "powershell.codeFormatting.openBraceOnSameLine": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Places open brace on the same line as its associated statement."
-        },
-        "powershell.codeFormatting.newLineAfterOpenBrace": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds a newline (line break) after an open brace."
-        },
-        "powershell.codeFormatting.newLineAfterCloseBrace": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds a newline (line break) after a closing brace."
-        },
-        "powershell.codeFormatting.pipelineIndentationStyle": {
-          "type": "string",
-          "default": "NoIndentation",
-          "enum": [
-            "IncreaseIndentationForFirstPipeline",
-            "IncreaseIndentationAfterEveryPipeline",
-            "NoIndentation",
-            "None"
-          ],
-          "markdownEnumDescriptions": [
-            "Indent once after the first pipeline and keep this indentation.",
-            "Indent more after the first pipeline and keep this indentation.",
-            "Do not increase indentation.",
-            "Do not change any existing pipeline indentation (disables feature)."
-          ],
-          "markdownDescription": "Whether to increase indentation after a pipeline for multi-line statements. See [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer/blob/a94d9f5666bba9f569cdf9c1bc99556934f2b8f4/docs/Rules/UseConsistentIndentation.md#pipelineindentation-string-default-value-is-increaseindentationforfirstpipeline) for examples. It is suggested to use `IncreaseIndentationForFirstPipeline` instead of the default `NoIndentation`. **This default may change in the future,** please see the [Request For Comment](https://github.com/PowerShell/vscode-powershell/issues/4296)."
-        },
-        "powershell.codeFormatting.whitespaceBeforeOpenBrace": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds a space between a keyword and its associated script-block expression."
-        },
-        "powershell.codeFormatting.whitespaceBeforeOpenParen": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds a space between a keyword (`if`, `elseif`, `while`, `switch`, etc.) and its associated conditional expression."
-        },
-        "powershell.codeFormatting.whitespaceAroundOperator": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds spaces before and after an operator (`=`, `+`, `-`, etc.)."
-        },
-        "powershell.codeFormatting.whitespaceAfterSeparator": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds a space after a separator (`,` and `;`)."
-        },
-        "powershell.codeFormatting.whitespaceInsideBrace": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds a space after an opening brace (`{`) and before a closing brace (`}`)."
-        },
-        "powershell.codeFormatting.whitespaceBetweenParameters": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Removes redundant whitespace between parameters."
-        },
-        "powershell.codeFormatting.whitespaceAroundPipe": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "**Deprecated:** Please use the `#powershell.codeFormatting.addWhitespaceAroundPipe#` setting instead. If you've used this setting before, we have moved it for you automatically.",
-          "markdownDeprecationMessage": "**Deprecated:** Please use the `#powershell.codeFormatting.addWhitespaceAroundPipe#` setting instead. If you've used this setting before, we have moved it for you automatically."
-        },
-        "powershell.codeFormatting.addWhitespaceAroundPipe": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Adds a space before and after the pipeline operator (`|`) if it is missing."
-        },
-        "powershell.codeFormatting.trimWhitespaceAroundPipe": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Trims extraneous whitespace (more than one character) before and after the pipeline operator (`|`)."
-        },
-        "powershell.codeFormatting.ignoreOneLineBlock": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Does not reformat one-line code blocks, such as: `if (...) {...} else {...}`."
-        },
-        "powershell.codeFormatting.alignPropertyValuePairs": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Align assignment statements in a hashtable or a DSC Configuration."
-        },
-        "powershell.codeFormatting.useConstantStrings": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Use single quotes if a string is not interpolated and its value does not contain a single quote."
-        },
-        "powershell.codeFormatting.useCorrectCasing": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Use correct casing for cmdlets."
-        },
-        "powershell.integratedConsole.showOnStartup": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Shows the Extension Terminal when the PowerShell extension is initialized. When disabled, the pane is not opened on startup, but the Extension Terminal is still created in order to power the extension's features."
-        },
-        "powershell.integratedConsole.startInBackground": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Starts the Extension Terminal in the background. **If this is enabled, to access the terminal you must run the [Show Extension Terminal command](command:PowerShell.ShowSessionConsole), and once shown it cannot be put back into the background.** This option completely hides the Extension Terminal from the terminals view. You are probably looking for the `#powershell.integratedConsole.showOnStartup#` option instead."
-        },
-        "powershell.integratedConsole.startLocation": {
-          "type": "string",
-          "default": "Panel",
-          "enum": [
-            "Editor",
-            "Panel"
-          ],
-          "markdownEnumDescriptions": [
-            "Creates the Extension Terminal in Editor area",
-            "Creates the Extension Terminal in Panel area"
-          ],
-          "markdownDescription": "Sets the startup location for Extension Terminal."
-        },
-        "powershell.integratedConsole.focusConsoleOnExecute": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Switches focus to the console when a script selection is run or a script file is debugged."
-        },
-        "powershell.integratedConsole.useLegacyReadLine": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "This will disable the use of PSReadLine in the PowerShell Extension Terminal and use a legacy implementation. **This setting is not recommended and likely to be deprecated!**"
-        },
-        "powershell.integratedConsole.forceClearScrollbackBuffer": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Use the VS Code API to clear the terminal since that's the only reliable way to clear the scrollback buffer. Turn this on if you're used to `Clear-Host` clearing scroll history. **This setting is not recommended and likely to be deprecated!**"
-        },
-        "powershell.integratedConsole.suppressStartupBanner": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Do not show the startup banner in the PowerShell Extension Terminal."
-        },
-        "powershell.debugging.createTemporaryIntegratedConsole": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Creates a temporary PowerShell Extension Terminal for each debugging session. This is useful for debugging PowerShell classes and binary modules."
-        },
-        "powershell.debugging.executeMode": {
-          "type": "string",
-          "enum": [
-            "DotSource",
-            "Call"
-          ],
-          "default": "DotSource",
-          "markdownEnumDescriptions": [
-            "Use the Dot-Source operator `.` to launch the script, for example, `. 'C:\\Data\\MyScript.ps1'`",
-            "Use the Call operator `&` to launch the script, for example, `& 'C:\\Data\\MyScript.ps1'`"
-          ],
-          "markdownDescription": "Sets the operator used to launch scripts."
-        },
-        "powershell.developer.bundledModulesPath": {
-          "type": "string",
-          "default": "../../PowerShellEditorServices/module",
-          "markdownDescription": "Specifies an alternative path to the folder containing modules that are bundled with the PowerShell extension, that is: PowerShell Editor Services, PSScriptAnalyzer and PSReadLine. **This setting is only meant for extension developers and requires the extension to be run in development mode!**"
-        },
-        "powershell.developer.editorServicesLogLevel": {
-          "type": "string",
-          "default": "Normal",
-          "enum": [
-            "Diagnostic",
-            "Verbose",
-            "Normal",
-            "Warning",
-            "Error",
-            "None"
-          ],
-          "markdownEnumDescriptions": [
-            "Enables all logging possible, please use this setting when submitting logs for bug reports!",
-            "Enables more logging than normal.",
-            "The default logging level.",
-            "Only log warnings and errors.",
-            "Only log errors.",
-            "Disable all logging possible. No log files will be written!"
-          ],
-          "markdownDescription": "Sets the log verbosity for both the extension and its LSP server, PowerShell Editor Services. **Please set to `Diagnostic` when recording logs for a bug report!**"
-        },
-        "powershell.developer.editorServicesWaitForDebugger": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Launches the LSP server with the `/waitForDebugger` flag to force it to wait for a .NET debugger to attach before proceeding, and emit its PID until then. **This setting is only meant for extension developers and requires the extension to be run in development mode!**"
-        },
-        "powershell.developer.setExecutionPolicy": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "On Windows we launch the PowerShell executable with `-ExecutionPolicy Bypass` so that the LSP server (PowerShell Editor Services module) will launch without issue. Some anti-virus programs disallow this command-line argument and this flag can be used to remove it. **Using this setting may require trusting the script manually in order for it to launch!**"
-        },
-        "powershell.developer.featureFlags": {
-          "type": "array",
-          "items": {
-            "type": "string"
+        }
+      },
+      {
+        "title": "Formatting",
+        "properties": {
+          "powershell.codeFormatting.preset": {
+            "type": "string",
+            "default": "Custom",
+            "enum": [
+              "Custom",
+              "Allman",
+              "OTBS",
+              "Stroustrup"
+            ],
+            "markdownEnumDescriptions": [
+              "The three brace settings are respected as-is.",
+              "Sets `#powershell.codeFormatting.openBraceOnSameLine#` to `false`, `#powershell.codeFormatting.newLineAfterOpenBrace#` to `true`, and `#powershell.codeFormatting.newLineAfterCloseBrace#` to `true`.",
+              "Sets `#powershell.codeFormatting.openBraceOnSameLine#` to `true`, `#powershell.codeFormatting.newLineAfterOpenBrace#` to `true`, and `#powershell.codeFormatting.newLineAfterCloseBrace#` to `false`.",
+              "Sets `#powershell.codeFormatting.openBraceOnSameLine#` to `true`, `#powershell.codeFormatting.newLineAfterOpenBrace#` to `true`, and `#powershell.codeFormatting.newLineAfterCloseBrace#` to `true`."
+            ],
+            "markdownDescription": "Sets the code formatting options to follow the given indent style in a way that is compatible with PowerShell syntax. Any setting other than `Custom` will configure (and override) the settings:\n\n* `#powershell.codeFormatting.openBraceOnSameLine#`\n\n* `#powershell.codeFormatting.newLineAfterOpenBrace#`\n\n* `#powershell.codeFormatting.newLineAfterCloseBrace#`\n\nFor more information about the brace styles, please see [PoshCode's discussion](https://github.com/PoshCode/PowerShellPracticeAndStyle/issues/81)."
           },
-          "default": [],
-          "markdownDescription": "An array of strings that enable experimental features in the PowerShell extension. **No flags are currently available!**"
-        },
-        "powershell.developer.waitForSessionFileTimeoutSeconds": {
-          "type": "number",
-          "default": 240,
-          "markdownDescription": "Specifies how many seconds the extension will wait for the LSP server, PowerShell Editor Services, to connect. The default is four minutes; try increasing this value if your computer is particularly slow (often caused by overactive anti-malware programs)."
-        },
-        "powershell.pester.useLegacyCodeLens": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Use a CodeLens that is compatible with Pester 4. Disabling this will show `Run Tests` on all `It`, `Describe` and `Context` blocks, and will correctly work only with Pester 5 and newer."
-        },
-        "powershell.pester.codeLens": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "This setting controls the appearance of the `Run Tests` and `Debug Tests` CodeLenses that appears above Pester tests."
-        },
-        "powershell.pester.outputVerbosity": {
-          "type": "string",
-          "default": "FromPreference",
-          "enum": [
-            "FromPreference",
-            "None",
-            "Minimal",
-            "Normal",
-            "Detailed",
-            "Diagnostic"
-          ],
-          "markdownDescription": "Defines the verbosity of output to be used. For Pester 5 and newer the default value `FromPreference` will use the `Output` settings from the `$PesterPreference` defined in the caller's context, and will default to `Normal` if there is none. For Pester 4 the `FromPreference` and `Normal` options map to `All`, and `Minimal` option maps to `Fails`."
-        },
-        "powershell.pester.debugOutputVerbosity": {
-          "type": "string",
-          "enum": [
-            "None",
-            "Minimal",
-            "Normal",
-            "Detailed",
-            "Diagnostic"
-          ],
-          "default": "Diagnostic",
-          "markdownDescription": "Defines the verbosity of output to be used when debugging a test or a block. For Pester 5 and newer the default value `Diagnostic` will print additional information about discovery, skipped and filtered tests, mocking and more."
-        },
-        "powershell.buttons.showRunButtons": {
-          "type": "boolean",
-          "default": true,
-          "markdownDescription": "Show the `Run` and `Run Selection` buttons in the editor's title bar."
-        },
-        "powershell.buttons.showPanelMovementButtons": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Show buttons in the editor's title bar for moving the terminals pane (with the PowerShell Extension Terminal) around."
-        },
-        "powershell.trace.server": {
-          "type": "string",
-          "enum": [
-            "off",
-            "messages",
-            "verbose"
-          ],
-          "default": "off",
-          "markdownDescription": "Traces the communication between VS Code and the PowerShell Editor Services [LSP Server](https://microsoft.github.io/language-server-protocol/). **only for extension developers and issue troubleshooting!**"
-        },
-        "powershell.trace.dap": {
-          "type": "boolean",
-          "default": false,
-          "markdownDescription": "Traces the communication between VS Code and the PowerShell Editor Services [DAP Server](https://microsoft.github.io/debug-adapter-protocol/). **This setting is only meant for extension developers and issue troubleshooting!**"
+          "powershell.codeFormatting.autoCorrectAliases": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Replaces aliases with their aliased name."
+          },
+          "powershell.codeFormatting.avoidSemicolonsAsLineTerminators": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Removes redundant semicolon(s) at the end of a line where a line terminator is sufficient."
+          },
+          "powershell.codeFormatting.openBraceOnSameLine": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Places open brace on the same line as its associated statement."
+          },
+          "powershell.codeFormatting.newLineAfterOpenBrace": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds a newline (line break) after an open brace."
+          },
+          "powershell.codeFormatting.newLineAfterCloseBrace": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds a newline (line break) after a closing brace."
+          },
+          "powershell.codeFormatting.pipelineIndentationStyle": {
+            "type": "string",
+            "default": "NoIndentation",
+            "enum": [
+              "IncreaseIndentationForFirstPipeline",
+              "IncreaseIndentationAfterEveryPipeline",
+              "NoIndentation",
+              "None"
+            ],
+            "markdownEnumDescriptions": [
+              "Indent once after the first pipeline and keep this indentation.",
+              "Indent more after the first pipeline and keep this indentation.",
+              "Do not increase indentation.",
+              "Do not change any existing pipeline indentation (disables feature)."
+            ],
+            "markdownDescription": "Whether to increase indentation after a pipeline for multi-line statements. See [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer/blob/a94d9f5666bba9f569cdf9c1bc99556934f2b8f4/docs/Rules/UseConsistentIndentation.md#pipelineindentation-string-default-value-is-increaseindentationforfirstpipeline) for examples. It is suggested to use `IncreaseIndentationForFirstPipeline` instead of the default `NoIndentation`. **This default may change in the future,** please see the [Request For Comment](https://github.com/PowerShell/vscode-powershell/issues/4296)."
+          },
+          "powershell.codeFormatting.whitespaceBeforeOpenBrace": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds a space between a keyword and its associated script-block expression."
+          },
+          "powershell.codeFormatting.whitespaceBeforeOpenParen": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds a space between a keyword (`if`, `elseif`, `while`, `switch`, etc.) and its associated conditional expression."
+          },
+          "powershell.codeFormatting.whitespaceAroundOperator": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds spaces before and after an operator (`=`, `+`, `-`, etc.)."
+          },
+          "powershell.codeFormatting.whitespaceAfterSeparator": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds a space after a separator (`,` and `;`)."
+          },
+          "powershell.codeFormatting.whitespaceInsideBrace": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds a space after an opening brace (`{`) and before a closing brace (`}`)."
+          },
+          "powershell.codeFormatting.whitespaceBetweenParameters": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Removes redundant whitespace between parameters."
+          },
+          "powershell.codeFormatting.whitespaceAroundPipe": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "**Deprecated:** Please use the `#powershell.codeFormatting.addWhitespaceAroundPipe#` setting instead. If you've used this setting before, we have moved it for you automatically.",
+            "markdownDeprecationMessage": "**Deprecated:** Please use the `#powershell.codeFormatting.addWhitespaceAroundPipe#` setting instead. If you've used this setting before, we have moved it for you automatically."
+          },
+          "powershell.codeFormatting.addWhitespaceAroundPipe": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Adds a space before and after the pipeline operator (`|`) if it is missing."
+          },
+          "powershell.codeFormatting.trimWhitespaceAroundPipe": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Trims extraneous whitespace (more than one character) before and after the pipeline operator (`|`)."
+          },
+          "powershell.codeFormatting.ignoreOneLineBlock": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Does not reformat one-line code blocks, such as: `if (...) {...} else {...}`."
+          },
+          "powershell.codeFormatting.alignPropertyValuePairs": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Align assignment statements in a hashtable or a DSC Configuration."
+          },
+          "powershell.codeFormatting.useConstantStrings": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Use single quotes if a string is not interpolated and its value does not contain a single quote."
+          },
+          "powershell.codeFormatting.useCorrectCasing": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Use correct casing for cmdlets."
+          }
+        }
+      },
+      {
+        "title": "Editor Services",
+        "properties": {
+          "powershell.powerShellDefaultVersion": {
+            "type": "string",
+            "default": "",
+            "markdownDescription": "Specifies the default PowerShell version started by the extension. The name must match what is displayed in the [Session Menu command](command:PowerShell.ShowSessionMenu), for example, `Windows PowerShell (x86)`. You can specify additional PowerShell executables with the `#powershell.powerShellAdditionalExePaths#` setting."
+          },
+          "powershell.enableProfileLoading": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Specifies whether the extension loads [PowerShell profiles](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles). Note that the extension's \"Current Host\" profile is `Microsoft.VSCode_profile.ps1`, which will be loaded instead of the default \"Current Host\" profile of `Microsoft.PowerShell_profile.ps1`. Use the \"All Hosts\" profile `profile.ps1` for common configuration."
+          },
+          "powershell.startAutomatically": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Starts the PowerShell extension automatically when a PowerShell file is opened. If `false`, to start the extension use the [Restart Session command](command:PowerShell.RestartSession). **IntelliSense, code navigation, the Extension Terminal, code formatting, and other features are not enabled until the extension starts.**"
+          },
+          "powershell.scriptAnalysis.enable": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Enables real-time script analysis using [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer) that populates the [Problems view](command:workbench.panel.markers.view.focus)."
+          },
+          "powershell.scriptAnalysis.settingsPath": {
+            "type": "string",
+            "default": "PSScriptAnalyzerSettings.psd1",
+            "markdownDescription": "Specifies the path to a [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer) settings file. **This setting may not work as expected currently!**"
+          },
+          "powershell.analyzeOpenDocumentsOnly": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Specifies to search for references only within open documents instead of all workspace files. An alternative to `#powershell.enableReferencesCodeLens#` that allows large workspaces to support some references without the performance impact."
+          },
+          "powershell.debugging.createTemporaryIntegratedConsole": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Creates a temporary PowerShell Extension Terminal for each debugging session. This is useful for debugging PowerShell classes and binary modules."
+          },
+          "powershell.debugging.executeMode": {
+            "type": "string",
+            "enum": [
+              "DotSource",
+              "Call"
+            ],
+            "default": "DotSource",
+            "markdownEnumDescriptions": [
+              "Use the Dot-Source operator `.` to launch the script, for example, `. 'C:\\Data\\MyScript.ps1'`",
+              "Use the Call operator `&` to launch the script, for example, `& 'C:\\Data\\MyScript.ps1'`"
+            ],
+            "markdownDescription": "Sets the operator used to launch scripts."
+          },
+          "powershell.powerShellExePath": {
+            "type": "string",
+            "default": "",
+            "scope": "machine",
+            "markdownDescription": "**Deprecated:** Specifies the path to the PowerShell executable.",
+            "markdownDeprecationMessage": "**Deprecated:** Please use the `#powershell.powerShellAdditionalExePaths#` setting instead."
+          },
+          "powershell.powerShellAdditionalExePaths": {
+            "type": "object",
+            "default": {},
+            "markdownDescription": "Specifies a list of Item / Value pairs where the **Item** is a user-chosen name and the **Value** is an absolute path to a PowerShell executable. The name appears in the [Session Menu Command](command:PowerShell.ShowSessionMenu) and is used to reference this executable in the `#powershell.powerShellDefaultVersion#` setting.",
+            "additionalProperties": {
+              "type": "string"
+            }
+          },
+          "powershell.cwd": {
+            "type": "string",
+            "default": "",
+            "markdownDescription": "A path where the Extension Terminal will be launched. Both the PowerShell process's and the shell's location will be set to this directory. Does not support variables, but does support the use of '~' and paths relative to a single workspace. **For multi-root workspaces, use the name of the folder you wish to have as the cwd.**"
+          },
+          "powershell.startAsLoginShell.osx": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Starts the PowerShell extension's underlying PowerShell process as a login shell, if applicable."
+          },
+          "powershell.startAsLoginShell.linux": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Starts the PowerShell extension's underlying PowerShell process as a login shell, if applicable."
+          },
+          "powershell.useX86Host": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "**Deprecated:** Uses the 32-bit language service on 64-bit Windows. This setting has no effect on 32-bit Windows or on the PowerShell extension debugger, which has its own architecture configuration.",
+            "markdownDeprecationMessage": "**Deprecated:** This setting was removed when the PowerShell installation searcher was added. Please use the `#powershell.powerShellAdditionalExePaths#` setting instead."
+          }
+        }
+      },
+      {
+        "title": "Pester",
+        "properties": {
+          "powershell.pester.useLegacyCodeLens": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Use a CodeLens that is compatible with Pester 4. Disabling this will show `Run Tests` on all `It`, `Describe` and `Context` blocks, and will correctly work only with Pester 5 and newer."
+          },
+          "powershell.pester.codeLens": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "This setting controls the appearance of the `Run Tests` and `Debug Tests` CodeLenses that appears above Pester tests."
+          },
+          "powershell.pester.outputVerbosity": {
+            "type": "string",
+            "default": "FromPreference",
+            "enum": [
+              "FromPreference",
+              "None",
+              "Minimal",
+              "Normal",
+              "Detailed",
+              "Diagnostic"
+            ],
+            "markdownDescription": "Defines the verbosity of output to be used. For Pester 5 and newer the default value `FromPreference` will use the `Output` settings from the `$PesterPreference` defined in the caller's context, and will default to `Normal` if there is none. For Pester 4 the `FromPreference` and `Normal` options map to `All`, and `Minimal` option maps to `Fails`."
+          },
+          "powershell.pester.debugOutputVerbosity": {
+            "type": "string",
+            "enum": [
+              "None",
+              "Minimal",
+              "Normal",
+              "Detailed",
+              "Diagnostic"
+            ],
+            "default": "Diagnostic",
+            "markdownDescription": "Defines the verbosity of output to be used when debugging a test or a block. For Pester 5 and newer the default value `Diagnostic` will print additional information about discovery, skipped and filtered tests, mocking and more."
+          }
+        }
+      },
+      {
+        "title": "Terminal",
+        "properties": {
+          "powershell.integratedConsole.suppressStartupBanner": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Do not show the startup banner in the PowerShell Extension Terminal."
+          },
+          "powershell.integratedConsole.showOnStartup": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Shows the Extension Terminal when the PowerShell extension is initialized. When disabled, the pane is not opened on startup, but the Extension Terminal is still created in order to power the extension's features."
+          },
+          "powershell.integratedConsole.startInBackground": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Starts the Extension Terminal in the background. **If this is enabled, to access the terminal you must run the [Show Extension Terminal command](command:PowerShell.ShowSessionConsole), and once shown it cannot be put back into the background.** This option completely hides the Extension Terminal from the terminals view. You are probably looking for the `#powershell.integratedConsole.showOnStartup#` option instead."
+          },
+          "powershell.integratedConsole.startLocation": {
+            "type": "string",
+            "default": "Panel",
+            "enum": [
+              "Editor",
+              "Panel"
+            ],
+            "markdownEnumDescriptions": [
+              "Creates the Extension Terminal in Editor area",
+              "Creates the Extension Terminal in Panel area"
+            ],
+            "markdownDescription": "Sets the startup location for Extension Terminal."
+          },
+          "powershell.integratedConsole.focusConsoleOnExecute": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "Switches focus to the console when a script selection is run or a script file is debugged."
+          },
+          "powershell.integratedConsole.useLegacyReadLine": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "This will disable the use of PSReadLine in the PowerShell Extension Terminal and use a legacy implementation. **This setting is not recommended and likely to be deprecated!**"
+          },
+          "powershell.integratedConsole.forceClearScrollbackBuffer": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Use the VS Code API to clear the terminal since that's the only reliable way to clear the scrollback buffer. Turn this on if you're used to `Clear-Host` clearing scroll history. **This setting is not recommended and likely to be deprecated!**"
+          }
+        }
+      },
+      {
+        "title": "Developer",
+        "properties": {
+          "powershell.developer.editorServicesLogLevel": {
+            "type": "string",
+            "default": "Warning",
+            "enum": [
+              "Trace",
+              "Debug",
+              "Information",
+              "Warning",
+              "Error",
+              "None"
+            ],
+            "markdownEnumDescriptions": [
+              "Enables all logging possible, please use this setting when submitting logs for bug reports!",
+              "Enables more detailed logging of the extension",
+              "Logs high-level information about what the extension is doing.",
+              "Only log warnings and errors. This is the default setting",
+              "Only log errors.",
+              "Disable all logging possible. No log files will be written!"
+            ],
+            "markdownDescription": "Sets the log verbosity for both the extension and its LSP server, PowerShell Editor Services. **Please set to `Trace` when recording logs for a bug report!**"
+          },
+          "powershell.trace.server": {
+            "type": "string",
+            "enum": [
+              "off",
+              "messages",
+              "verbose"
+            ],
+            "default": "off",
+            "markdownDescription": "Traces the communication between VS Code and the PowerShell Editor Services [LSP Server](https://microsoft.github.io/language-server-protocol/). The output will be logged and also visible in the Output pane, where the verbosity is configurable. **For extension developers and issue troubleshooting only!**"
+          },
+          "powershell.developer.traceDap": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Traces the DAP communication between VS Code and the PowerShell Editor Services [DAP Server](https://microsoft.github.io/debug-adapter-protocol/). The output will be logged and also visible in the Output pane, where the verbosity is configurable. **For extension developers and issue troubleshooting only!**"
+          },
+          "powershell.developer.editorServicesWaitForDebugger": {
+            "type": "boolean",
+            "default": false,
+            "markdownDescription": "Launches the LSP server with the `/waitForDebugger` flag to force it to wait for a .NET debugger to attach before proceeding, and emit its PID until then. **This setting is only meant for extension developers and requires the extension to be run in development mode!**"
+          },
+          "powershell.developer.setExecutionPolicy": {
+            "type": "boolean",
+            "default": true,
+            "markdownDescription": "On Windows we launch the PowerShell executable with `-ExecutionPolicy Bypass` so that the LSP server (PowerShell Editor Services module) will launch without issue. Some anti-virus programs disallow this command-line argument and this flag can be used to remove it. **Using this setting may require trusting the script manually in order for it to launch!**"
+          },
+          "powershell.developer.bundledModulesPath": {
+            "type": "string",
+            "default": "../../PowerShellEditorServices/module",
+            "markdownDescription": "Specifies an alternative path to the folder containing modules that are bundled with the PowerShell extension, that is: PowerShell Editor Services, PSScriptAnalyzer and PSReadLine. **This setting is only meant for extension developers and requires the extension to be run in development mode!**"
+          },
+          "powershell.developer.featureFlags": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "default": [],
+            "markdownDescription": "An array of strings that enable experimental features in the PowerShell extension. **No flags are currently available!**"
+          },
+          "powershell.developer.waitForSessionFileTimeoutSeconds": {
+            "type": "number",
+            "default": 240,
+            "markdownDescription": "Specifies how many seconds the extension will wait for the LSP server, PowerShell Editor Services, to connect. The default is four minutes; try increasing this value if your computer is particularly slow (often caused by overactive anti-malware programs)."
+          },
+          "powershell.bugReporting.project": {
+            "type": "string",
+            "default": "https://github.com/PowerShell/vscode-powershell",
+            "markdownDescription": "**Deprecated:** Specifies the URL of the GitHub project in which to generate bug reports.",
+            "markdownDeprecationMessage": "**Deprecated:** This setting was never meant to be changed!"
+          }
         }
       }
-    },
+    ],
     "capabilities": {
       "untrustedWorkspaces": {
         "supported": false
diff --git a/pwsh-extension-dev.code-workspace b/pwsh-extension-dev.code-workspace
new file mode 100644
index 0000000000..dc4208242f
--- /dev/null
+++ b/pwsh-extension-dev.code-workspace
@@ -0,0 +1,412 @@
+{
+  "folders": [
+    {
+      "name": "Client",
+      "path": ".",
+    },
+    {
+      "name": "Server",
+      "path": "../PowerShellEditorServices",
+    },
+  ],
+  "extensions": {
+    "recommendations": [
+      "davidanson.vscode-markdownlint",
+      "dbaeumer.vscode-eslint",
+      "editorconfig.editorconfig",
+      "esbenp.prettier-vscode",
+      "ms-dotnettools.csharp",
+      "ms-vscode.powershell",
+      "connor4312.esbuild-problem-matchers",
+      "ms-vscode.extension-test-runner",
+    ],
+  },
+  "settings": {
+    "window.title": "PowerShell VS Code Extension Development",
+    "debug.onTaskErrors": "prompt",
+    "editor.formatOnSave": true,
+    "editor.formatOnSaveMode": "modifications",
+    "editor.formatOnPaste": true,
+    "editor.codeActionsOnSave": {
+      "source.fixAll": "explicit",
+    },
+    "[typescript][javascript][json][jsonc]": {
+      "editor.defaultFormatter": "esbenp.prettier-vscode",
+      "editor.formatOnSaveMode": "file",
+    },
+    "files.associations": {
+      "**/snippets/*.json": "jsonc", // Use JSONC instead of JSON because that's how VS Code interprets snippet files, and it enables better source documentation.
+    },
+    // Ignore the Markdown rule:
+    "markdownlint.config": {
+      "MD024": false, // no-duplicate-header
+    },
+    "powershell.cwd": "Client",
+    "powershell.codeFormatting.autoCorrectAliases": true,
+    "powershell.codeFormatting.avoidSemicolonsAsLineTerminators": true,
+    "powershell.codeFormatting.newLineAfterCloseBrace": false,
+    "powershell.codeFormatting.trimWhitespaceAroundPipe": true,
+    "powershell.codeFormatting.useCorrectCasing": true,
+    "powershell.codeFormatting.whitespaceBeforeOpenBrace": false,
+    "powershell.codeFormatting.whitespaceBetweenParameters": true,
+    "powershell.codeFormatting.pipelineIndentationStyle": "IncreaseIndentationForFirstPipeline",
+    "typescript.tsdk": "Client/node_modules/typescript/lib", // Lock the TypeScript SDK path to the version we use
+    "typescript.tsserver.experimental.enableProjectDiagnostics": true,
+    "testExplorer.useNativeTesting": true,
+  },
+  "tasks": {
+    "version": "2.0.0",
+    "windows": {
+      "options": {
+        "shell": {
+          "executable": "pwsh.exe",
+          "args": ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"],
+        },
+      },
+    },
+    "linux": {
+      "options": {
+        "shell": {
+          "executable": "pwsh",
+          "args": ["-NoProfile", "-Command"],
+        },
+      },
+    },
+    "osx": {
+      "options": {
+        "shell": {
+          "executable": "pwsh",
+          "args": ["-NoProfile", "-Command"],
+        },
+      },
+    },
+    "tasks": [
+      {
+        "label": "Build",
+        "icon": {
+          "id": "tools",
+        },
+        "type": "shell",
+        "options": {
+          "cwd": "${workspaceFolder:Client}",
+        },
+        "command": "Invoke-Build Build",
+        "problemMatcher": ["$msCompile", "$tsc"],
+        "group": {
+          "kind": "build",
+          "isDefault": true,
+        },
+      },
+      {
+        "label": "Extension: Watch",
+        "type": "shell",
+        "isBackground": true,
+        "options": {
+          "cwd": "${workspaceFolder:Client}",
+        },
+        "command": "npm run watch",
+        "problemMatcher": {
+          "owner": "esbuild-watch",
+          "pattern": {
+            "regexp": "^\\[ERROR\\] (.+)\\n\\n\\s+([^:]+):(\\d+):(\\d+):",
+            "message": 1,
+            "file": 2,
+            "line": 3,
+            "column": 4,
+          },
+          "background": {
+            "activeOnStart": true,
+            "beginsPattern": "^\\[watch\\] build started",
+            "endsPattern": "^\\[watch\\] build finished",
+          },
+        },
+        "icon": {
+          "id": "sync",
+          "color": "terminal.ansiCyan",
+        },
+        "group": {
+          "kind": "build",
+        },
+      },
+      {
+        "label": "PSES: BuildIfChanged",
+        "type": "shell",
+        "options": {
+          "cwd": "${workspaceFolder:Server}",
+        },
+        "command": "Invoke-Build BuildIfChanged",
+        "problemMatcher": "$msCompile",
+        "icon": {
+          "id": "tools",
+          "color": "terminal.ansiCyan",
+        },
+        "group": {
+          "kind": "build",
+        },
+      },
+      {
+        "label": "PreLaunch",
+        "dependsOn": ["Extension: Watch", "PSES: BuildIfChanged"],
+        "dependsOrder": "parallel",
+      },
+      {
+        "label": "Test Client",
+        "type": "shell",
+        "options": {
+          "cwd": "${workspaceFolder:Client}",
+        },
+        "command": "Invoke-Build Test",
+        "problemMatcher": ["$msCompile", "$tsc"],
+        "group": {
+          "kind": "test",
+          "isDefault": true,
+        },
+      },
+      {
+        "label": "Test Server",
+        "type": "shell",
+        "options": {
+          "cwd": "${workspaceFolder:Server}",
+        },
+        "problemMatcher": ["$msCompile"],
+        "command": "Invoke-Build TestPS74",
+        "group": {
+          "kind": "test",
+          "isDefault": true,
+        },
+      },
+      {
+        "label": "Invoke-Build Client",
+        "type": "shell",
+        "options": {
+          "cwd": "${workspaceFolder:Client}",
+        },
+        "command": "Invoke-Build ${input:clientBuildCommand}",
+        "group": "build",
+      },
+      {
+        "label": "Invoke-Build Server",
+        "type": "shell",
+        "options": {
+          "cwd": "${workspaceFolder:Server}",
+        },
+        "command": "Invoke-Build ${input:serverBuildCommand}",
+        "group": "build",
+      },
+    ],
+    "inputs": [
+      {
+        "type": "pickString",
+        "id": "clientBuildCommand",
+        "description": "Which Invoke-Build Client Task?",
+        "options": ["Restore", "Clean", "Build", "Test", "Package"],
+        "default": "Clean",
+      },
+      {
+        "type": "pickString",
+        "id": "serverBuildCommand",
+        "description": "Which Invoke-Build Server Task?",
+        "options": [
+          "SetupDotNet",
+          "BinClean",
+          "Clean",
+          "Build",
+          "Test",
+          "TestPS74",
+          "TestE2EPwsh",
+          "TestPS51",
+          "TestE2EPowerShell",
+        ],
+        "default": "Clean",
+      },
+    ],
+  },
+  "launch": {
+    "version": "0.2.0",
+    "compounds": [
+      {
+        "name": "Launch Extension",
+        "configurations": ["Launch", "PowerShell Editor Services"],
+        "preLaunchTask": "Build",
+        "stopAll": true,
+        "presentation": {
+          "hidden": false,
+          "group": "Test",
+          "order": 1,
+        },
+      },
+      {
+        "name": "Launch Extension - Temp Profile",
+        "configurations": ["Launch-Temp", "PowerShell Editor Services"],
+        "preLaunchTask": "PreLaunch",
+        "stopAll": true,
+        "presentation": {
+          "hidden": false,
+          "group": "Test",
+          "order": 2,
+        },
+      },
+      {
+        "name": "Launch Extension - Isolated Profile",
+        "configurations": ["Launch-Isolated", "PowerShell Editor Services"],
+        "preLaunchTask": "Build",
+        "stopAll": true,
+        "presentation": {
+          "hidden": false,
+          "group": "Test",
+          "order": 3,
+        },
+      },
+    ],
+    "configurations": [
+      {
+        "name": "Launch",
+        "type": "extensionHost",
+        "request": "launch",
+        "env": {
+          "VSCODE_PARENT_SESSION_ID": "${command:GetVsCodeSessionId}",
+        },
+        "runtimeExecutable": "${execPath}",
+        "args": [
+          "--extensionDevelopmentPath=${workspaceFolder:Client}",
+          "${workspaceFolder:Client}/examples",
+        ],
+        "sourceMaps": true,
+        // This speeds up source map detection and makes smartStep work correctly
+        "outFiles": ["${workspaceFolder:Client}/dist/*.js"],
+        "skipFiles": [
+          "<node_internals>/**",
+          "**/node_modules/**",
+          "**/.vscode-test/**",
+          "**/app/out/vs/**", // Skips Extension Host internals
+        ],
+        "presentation": {
+          "hidden": true,
+        },
+      },
+      {
+        "name": "Launch-Temp",
+        "type": "extensionHost",
+        "request": "launch",
+        "env": {
+          "VSCODE_PARENT_SESSION_ID": "${command:GetVsCodeSessionId}",
+        },
+        "runtimeExecutable": "${execPath}",
+        "args": [
+          // Runs the extension in an empty temp profile that is automatically cleaned up after use
+          // Undocumented: https://github.com/microsoft/vscode-docs/issues/6220
+          "--profile-temp",
+          "--extensionDevelopmentPath=${workspaceFolder:Client}",
+          "${workspaceFolder:Client}/examples",
+        ],
+        "sourceMaps": true,
+        // This speeds up source map detection and makes smartStep work correctly
+        "outFiles": ["${workspaceFolder:Client}/dist/*.js"],
+        "skipFiles": [
+          "<node_internals>/**",
+          "**/node_modules/**",
+          "**/.vscode-test/**",
+          "**/app/out/vs/**", // Skips Extension Host internals
+        ],
+        "presentation": {
+          "hidden": true,
+        },
+      },
+      {
+        "name": "Launch-Isolated",
+        "type": "extensionHost",
+        "request": "launch",
+        "env": {
+          "VSCODE_PARENT_SESSION_ID": "${command:GetVsCodeSessionId}",
+        },
+        "runtimeExecutable": "${execPath}",
+        "args": [
+          // Runs the extension in an empty temp profile that is automatically cleaned up after use
+          // Undocumented: https://github.com/microsoft/vscode-docs/issues/6220
+          "--profile=pwsh-debug",
+          "--extensionDevelopmentPath=${workspaceFolder:Client}",
+          "${workspaceFolder:Client}/examples",
+        ],
+        "sourceMaps": true,
+        // This speeds up source map detection and makes smartStep work correctly
+        "outFiles": ["${workspaceFolder:Client}/dist/*.js"],
+        "skipFiles": [
+          "<node_internals>/**",
+          "**/node_modules/**",
+          "**/.vscode-test/**",
+          "**/app/out/vs/**", // Skips Extension Host internals
+        ],
+        "presentation": {
+          "hidden": true,
+        },
+      },
+      {
+        // https://code.visualstudio.com/docs/csharp/debugger-settings
+        "name": "Attach to Editor Services",
+        "type": "coreclr",
+        "request": "attach",
+        "processId": "${command:PowerShell.PickPSHostProcess}",
+        "justMyCode": true,
+        "suppressJITOptimizations": true,
+        "symbolOptions": {
+          "searchPaths": [],
+          "searchMicrosoftSymbolServer": false,
+          "searchNuGetOrgSymbolServer": false,
+        },
+        "presentation": {
+          "hidden": false,
+          "group": "Test",
+          "order": 5,
+        },
+        "logging": {
+          "moduleLoad": false,
+        },
+      },
+      {
+        // https://code.visualstudio.com/docs/csharp/debugger-settings
+        "name": "PowerShell Editor Services",
+        "type": "coreclr",
+        "request": "attach",
+        // Waits for the extension terminal to become available and gets the PID, saves having to enter it manually.
+        "processId": "${command:PowerShell.WaitForPsesActivationAndReturnProcessId}",
+        "justMyCode": true,
+        "suppressJITOptimizations": true,
+        "symbolOptions": {
+          "searchPaths": [],
+          "searchMicrosoftSymbolServer": false,
+          "searchNuGetOrgSymbolServer": false,
+        },
+        "presentation": {
+          "hidden": true,
+        },
+        "logging": {
+          "moduleLoad": false,
+        },
+      },
+      {
+        // Runs the extension in an isolated but persistent profile separate from the user settings
+        // Undocumented: https://github.com/microsoft/vscode-docs/issues/6220
+        "name": "Launch Extension - Rename Test Cases",
+        "type": "extensionHost",
+        "request": "launch",
+        "runtimeExecutable": "${execPath}",
+        "args": [
+          "--profile=debug",
+          "--extensionDevelopmentPath=${workspaceFolder:Client}",
+          "${workspaceFolder:Server}/test/PowerShellEditorServices.Test.Shared/Refactoring",
+        ],
+        "sourceMaps": true,
+        // This speeds up source map detection and makes smartStep work correctly
+        "outFiles": ["${workspaceFolder:Client}/dist/*.js"],
+        "skipFiles": [
+          "<node_internals>/**",
+          "**/node_modules/**",
+          "**/.vscode-test/**", // Skips Extension Host internals
+        ],
+        "presentation": {
+          "hidden": true,
+        },
+      },
+    ],
+  },
+}
diff --git a/snippets/PowerShell.json b/snippets/PowerShell.json
index bd478f1ff3..ffbdb35e84 100644
--- a/snippets/PowerShell.json
+++ b/snippets/PowerShell.json
@@ -38,10 +38,7 @@
     ]
   },
   "Class Constructor": {
-    "prefix": [
-      "ctor-class",
-      "class-constructor"
-    ],
+    "prefix": ["ctor-class", "class-constructor"],
     "description": "Set default values and validate object logic at the moment of creating the instance of the class. Constructors have the same name as the class. Constructors might have arguments, to initialize the data members of the new object. More: Get-Help about_Classes",
     "body": [
       "${1:ClassName}(${2:<#OptionalParameters#>}) {",
@@ -61,14 +58,10 @@
   "Class Property": {
     "prefix": "class-property",
     "description": "Properties are variables declared at class scope. A property may be of any built-in type or an instance of another class. Classes have no restriction in the number of properties they have. More: Get-Help about_Classes",
-    "body": [
-      "[${1:propertyType}] $${0:PropertyName}"
-    ]
+    "body": ["[${1:propertyType}] $${0:PropertyName}"]
   },
   "Comment Block": {
-    "prefix": [
-      "block-comment"
-    ],
+    "prefix": ["block-comment"],
     "description": "A multi-line comment.",
     "body": [
       "$BLOCK_COMMENT_START",
@@ -162,24 +155,24 @@
     ]
   },
   "Foreach with Progress": {
-		"prefix": "foreach-progress",
+    "prefix": "foreach-progress",
     "description": "Insert a foreach loop with Write-Progress initialized",
-		"body": [
-\\$progPercent = \"{0:n2}\" -f ([math]::round(\\$i/\\$array.count,4) * 100)",
-
-Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count - \\$progPercent% Complete:\" -PercentComplete \\$progPercent",
-		  "\\$i = 1",
-		  "foreach ($${2:item} in $${1:array}) {",
-		  "    \\$progPercent = \"{0:n2}\" -f ([math]::round(\\$i/\\$total,4) * 100)",
-		  "    Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$total - \\$progPercent% Complete:\" -PercentComplete \\$progPercent",
-		  "    # Insert Code Here",
-		  "    ${0}",
-		  "    ",
-		  "    \\$i++",
-		  "}",
-		  ""
-		]
-	},
+    "body": [
+      "\\$total = \\$${1:array}.count",
+      "\\$${4:i} = 1",
+      "\\$progPercent = \"{0:n2}\" -f ([math]::round(\\$${4:i}/\\$total,4) * 100)",
+      "Write-Progress -Activity \"${3:activityName}\" -Status \"\\$${4:i} of \\$total - \\$progPercent% Complete:\" -PercentComplete \\$progPercent",
+      "foreach ($${2:item} in $${1:array}) {",
+      "    \\$progPercent = \"{0:n2}\" -f ([math]::round(\\$${4:i}/\\$total,4) * 100)",
+      "    Write-Progress -Activity \"${3:activityName}\" -Status \"\\$${4:i} of \\$total - \\$progPercent% Complete:\" -PercentComplete \\$progPercent",
+      "    # Insert Code Here",
+      "    ${0}",
+      "    ",
+      "    \\$${4:i}++",
+      "}",
+      ""
+    ]
+  },
   "ForEach-Object -Parallel": {
     "prefix": "foreach-parallel",
     "description": "[PS 7+] Process multiple objects in parallel using runspaces. This has some limitations compared to a regular ForEach-Object. More: Get-Help ForEach-Object",
@@ -202,10 +195,7 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
     ]
   },
   "Function Help": {
-    "prefix": [
-      "help-function",
-      "comment-help"
-    ],
+    "prefix": ["help-function", "comment-help"],
     "description": "Comment-based help for an advanced function. More: Get-Help about_Comment_Based_Help",
     "body": [
       "<#",
@@ -226,10 +216,7 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
     ]
   },
   "Function-Advanced": {
-    "prefix": [
-      "function-advanced",
-      "cmdlet"
-    ],
+    "prefix": ["function-advanced", "cmdlet"],
     "description": "Script advanced function definition snippet. More: Get-Help about_Functions_Advanced",
     "body": [
       "function ${1:Verb-Noun} {",
@@ -252,6 +239,101 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
       "}"
     ]
   },
+  "Function-Advanced-Doc-Full-Example-From-ISE": {
+    "prefix": ["function-advanced-doc-fromISE", "cmdlet-doc-fromISE"],
+    "description": "Script advanced function definition with full comment-based help and parameter attributes.",
+    "body": [
+      "function ${1:Verb-Noun} {",
+      "\t<#",
+      "\t.SYNOPSIS",
+      "\t${2:Short description}",
+      "\t.DESCRIPTION",
+      "\t${3:Long description}",
+      "\t.EXAMPLE",
+      "\t${4:Example of how to use this cmdlet}",
+      "\t.EXAMPLE",
+      "\t${5:Another example of how to use this cmdlet}",
+      "\t.INPUTS",
+      "\t${6:Inputs to this cmdlet (if any)}",
+      "\t.OUTPUTS",
+      "\t${7:Output from this cmdlet (if any)}",
+      "\t.NOTES",
+      "\t${8:General notes}",
+      "\t.COMPONENT",
+      "\t${9:The component this cmdlet belongs to}",
+      "\t.ROLE",
+      "\t${10:The role this cmdlet belongs to}",
+      "\t.FUNCTIONALITY",
+      "\t${11:The functionality that best describes this cmdlet}",
+      "\t#>",
+      "\t[CmdletBinding(DefaultParameterSetName = '${12:ParameterSet1}',",
+      "\t\tSupportsShouldProcess,",
+      "\t\tPositionalBinding,",
+      "\t\tHelpUri = '${13:http://yourwebsiteforhelp.here}',",
+      "\t\tConfirmImpact = 'Medium')]",
+      "\t[Alias('${14:Be-lazyWithThis}','${15:lzy}','${16:Use-OldFunctionName}')]",
+      "\t[OutputType([${17:String}])]",
+      "\tparam (",
+      "\t\t# ${18:Param1} help description",
+      "\t\t[Parameter(Mandatory,",
+      "\t\t\tValueFromPipeline,",
+      "\t\t\tValueFromPipelineByPropertyName,",
+      "\t\t\tValueFromRemainingArguments,",
+      "\t\t\tPosition = 0,",
+      "\t\t\tParameterSetName = '${12:ParameterSet1}')]",
+      "\t\t[ValidateNotNull()]",
+      "\t\t[ValidateNotNullOrEmpty()]",
+      "\t\t[ValidateCount(0, 5)]",
+      "\t\t[ValidateSet(\"${19:sun}\", \"${20:moon}\", \"${21:earth}\")]",
+      "\t\t[Alias(\"${22:p1}\")]",
+      "\t\t$${18:Param1},",
+      "",
+      "\t\t# ${24:Param2} help description",
+      "\t\t[Parameter(ParameterSetName = '${12:ParameterSet1}')]",
+      "\t\t[AllowNull()]",
+      "\t\t[AllowEmptyCollection()]",
+      "\t\t[AllowEmptyString()]",
+      "\t\t[ValidateScript({ ${25:true} })]",
+      "\t\t[ValidateRange(0, 5)]",
+      "\t\t[${26:int}]",
+      "\t\t$${24:Param2},",
+      "",
+      "\t\t# ${28:Param3} help description",
+      "\t\t[Parameter(ParameterSetName = '${29:Another Parameter Set}')]",
+      "\t\t[ValidatePattern(\"${30:[a-z]*}\")]",
+      "\t\t[ValidateLength(0, 15)]",
+      "\t\t[${31:String}]",
+      "\t\t$${28:Param3},",
+      "",
+      "\t\t# ${33:Param4} help description",
+      "\t\t# Checkout the docs https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_argument_completion?view=powershell-7.5#argumentcompletions-attribute on different ways to provide Argument Completion",
+      "\t\t[Parameter(ParameterSetName = '${34:Yet Another Parameter Set}')]",
+      "\t\t[ArgumentCompleter({'${35:add completer script}'})]",
+      "\t\t[ValidateLength(0, 15)]",
+      "\t\t[${36:String}]",
+      "\t\t$${33:Param4}",
+      "\t)",
+      "",
+      "\tbegin {",
+      "\t\t${38:#BeginCodeHere}",
+      "\t}",
+      "",
+      "\tprocess {",
+      "\t\tif (\\$pscmdlet.ShouldProcess(\"${39:Target}\", \"${40:Operation}\")) {",
+      "\t\t\t${41:#ProcessCodeHere}",
+      "\t\t}",
+      "\t}",
+      "",
+      "\tend {",
+      "\t\t${42:#EndCodeHere}",
+      "\t}",
+      "",
+      "\tclean {",
+      "\t\t${43:#CleanCodeHere} - Added in 7.3 for more information see https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_methods?view=powershell-7.5#clean",
+      "\t}",
+      "}"
+    ]
+  },
   "Function-Inline": {
     "prefix": "function-inline",
     "description": "Function definition snippet that does not contain a param block, but defines parameters inline. This syntax is commonly used in other languages. More: Get-Help about_Functions",
@@ -262,59 +344,35 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
     ]
   },
   "Function: Suppress PSScriptAnalyzer Rule": {
-    "prefix": [
-      "suppress-message-rule-function",
-      "[SuppressMessageAttribute]"
-    ],
+    "prefix": ["suppress-message-rule-function", "[SuppressMessageAttribute]"],
     "description": "Suppress a PSScriptAnalyzer rule for a function. More: https://docs.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules#suppressing-rules",
     "body": [
       "[Diagnostics.CodeAnalysis.SuppressMessageAttribute(",
-      "\t<#Category#>'${1:PSProvideDefaultParameterValue}', <#CheckId>\\$null, Scope='Function',",
-      "\tJustification = '${0:${TM_SELECTED_TEXT:Reason for suppressing}}'",
+      "\t<#Category#>'${1:PSProvideDefaultParameterValue}', <#CheckId#>\\$null,",
+      "\tScope='Function',",
+      "\tJustification='${0:${TM_SELECTED_TEXT:Reason for suppressing}}'",
       ")]"
     ]
   },
   "Hashtable": {
     "prefix": "hashtable",
     "description": "A key/value store that are very efficient for finding and retrieving data. More: Get-Help about_Hash_Tables",
-    "body": [
-      "\\$${1:Var} = @{",
-      "\t${2:Name} = ${3:Value}",
-      "}"
-    ]
+    "body": ["\\$${1:Var} = @{", "\t${2:Name} = ${3:Value}", "}"]
   },
   "Here-String": {
-    "prefix": [
-      "hs",
-      "here-string"
-    ],
+    "prefix": ["hs", "here-string"],
     "description": "Escape all text but evaluate variables. More: Get-Help about_Quoting_Rules",
-    "body": [
-      "@\"",
-      "${0:TM_SELECTED_TEXT}",
-      "\"@",
-      ""
-    ]
+    "body": ["@\"", "${0:TM_SELECTED_TEXT}", "\"@", ""]
   },
   "Here-String (Literal)": {
-    "prefix": [
-      "hsl",
-      "literal-here-string"
-    ],
+    "prefix": ["hsl", "literal-here-string"],
     "description": "Escape all text literally. More: Get-Help about_Quoting_Rules",
-    "body": [
-      "@'",
-      "${0:TM_SELECTED_TEXT}",
-      "'@",
-      ""
-    ]
+    "body": ["@'", "${0:TM_SELECTED_TEXT}", "'@", ""]
   },
   "Hidden Property": {
     "prefix": "class-proph-hidden",
     "description": "Useful for creating internal properties and methods within a class that are hidden from users. More: Get-Help about_Hidden",
-    "body": [
-      "hidden [${1:string}] $${0:PropertyName}"
-    ]
+    "body": ["hidden [${1:string}] $${0:PropertyName}"]
   },
   "IArgumentCompleter Class": {
     "prefix": "iargument-completer",
@@ -517,15 +575,13 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
     ]
   },
   "Parameter: Suppress PSScriptAnalyzer Rule": {
-    "prefix": [
-      "suppress-message-rule-parameter",
-      "[SuppressMessageAttribute]"
-    ],
+    "prefix": ["suppress-message-rule-parameter", "[SuppressMessageAttribute]"],
     "description": "Suppress a PSScriptAnalyzer rule on a parameter. More: https://docs.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules#suppressing-rules",
     "body": [
-      "[Diagnostics.CodeAnalysis.SuppressMessageAttribute(<#Category#>'${1:PSUseDeclaredVarsMoreThanAssignments}',",
-      "\t<#ParameterName#>'${0:${TM_SELECTED_TEXT:ParamName}}',",
-      "\tJustification = '${0:${TM_SELECTED_TEXT:Reason for suppressing}}'",
+      "[Diagnostics.CodeAnalysis.SuppressMessageAttribute(",
+      "\t<#Category#>'${1:PSUseDeclaredVarsMoreThanAssignments}',",
+      "\t<#ParameterName#>'${2:${TM_SELECTED_TEXT:ParamName}}',",
+      "\tJustification='${0:Reason for suppressing}'",
       ")]"
     ]
   },
@@ -546,34 +602,24 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
     ]
   },
   "PSCustomObject": {
-    "prefix": [
-      "pscustomobject",
-      "[PSCustomObject]"
-    ],
+    "prefix": ["pscustomobject", "[PSCustomObject]"],
     "description": "Create a custom object from a hashtable of properties. More: Get-Help about_PSCustomObject",
-    "body": [
-      "[PSCustomObject]@{",
-      "\t${1:Name} = ${2:Value}",
-      "}"
-    ]
+    "body": ["[PSCustomObject]@{", "\t${1:Name} = ${2:Value}", "}"]
   },
   "Region Block": {
     "prefix": "region",
     "description": "Region block for organizing and folding of your code",
-    "body": [
-      "#region ${1}",
-      "${0:$TM_SELECTED_TEXT}",
-      "#endregion"
-    ]
+    "body": ["#region ${1}", "${0:$TM_SELECTED_TEXT}", "#endregion"]
   },
   "Scope: Suppress PSScriptAnalyzer Rule": {
-    "prefix": "suppress-message-rule-scope",
+    "prefix": ["suppress-message-rule-scope", "[SuppressMessageAttribute]"],
     "description": "Suppress a PSScriptAnalyzer rule based on a function/parameter/class/variable/object's name by setting the SuppressMessageAttribute's Target property to a regular expression or a glob pattern. More: https://docs.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules#suppressing-rules",
     "body": [
       "[Diagnostics.CodeAnalysis.SuppressMessageAttribute(",
-      "\t<#Category#>'${1:PSUseDeclaredVarsMoreThanAssignments}', <#CheckId#>\\$null, Scope='Function',",
-      "\tTarget='${1:${TM_SELECTED_TEXT:RegexOrGlobPatternToMatchName}}'",
-      "\tJustification = '${0:Reason for suppressing}}'",
+      "\t<#Category#>'${1:PSUseDeclaredVarsMoreThanAssignments}', <#CheckId#>\\$null,",
+      "\tScope='${2|Function,Parameter,Class,Variable,Object|}',",
+      "\tTarget='${3:${TM_SELECTED_TEXT:RegexOrGlobPatternToMatchName}}',",
+      "\tJustification='${0:Reason for suppressing}'",
       ")]"
     ]
   },
@@ -588,10 +634,7 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
     ]
   },
   "Suppress PSScriptAnalyzer Rule": {
-    "prefix": [
-      "suppress-message-rule",
-      "[SuppressMessageAttribute]"
-    ],
+    "prefix": ["suppress-message-rule", "[SuppressMessageAttribute]"],
     "description": "Suppress a PSScriptAnalyzer rule. More: https://docs.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules#suppressing-rules",
     "body": [
       "[Diagnostics.CodeAnalysis.SuppressMessageAttribute(",
@@ -659,10 +702,6 @@ Write-Progress -Activity \"${3:activityName}\" -Status \"\\$i of \\$array.count
   "while": {
     "prefix": "while",
     "description": "Repeatedly perform an action after verifying a condition is true first. More: Get-Help about_While",
-    "body": [
-      "while (${1:condition}) {",
-      "\t${0:$TM_SELECTED_TEXT}",
-      "}"
-    ]
+    "body": ["while (${1:condition}) {", "\t${0:$TM_SELECTED_TEXT}", "}"]
   }
 }
diff --git a/src/controls/checkboxQuickPick.ts b/src/controls/checkboxQuickPick.ts
index e318992365..2c8bf72c07 100644
--- a/src/controls/checkboxQuickPick.ts
+++ b/src/controls/checkboxQuickPick.ts
@@ -6,7 +6,8 @@ import vscode = require("vscode");
 const confirmItemLabel = "$(checklist) Confirm";
 const checkedPrefix = "[ $(check) ]";
 const uncheckedPrefix = "[     ]";
-const defaultPlaceHolder = "Select 'Confirm' to confirm or press 'Esc' key to cancel";
+const defaultPlaceHolder =
+    "Select 'Confirm' to confirm or press 'Esc' key to cancel";
 
 export interface ICheckboxQuickPickItem {
     label: string;
@@ -18,17 +19,21 @@ export interface ICheckboxQuickPickOptions {
     confirmPlaceHolder: string;
 }
 
-const defaultOptions: ICheckboxQuickPickOptions = { confirmPlaceHolder: defaultPlaceHolder };
+const defaultOptions: ICheckboxQuickPickOptions = {
+    confirmPlaceHolder: defaultPlaceHolder,
+};
 
 export async function showCheckboxQuickPick(
     items: ICheckboxQuickPickItem[],
-    options: ICheckboxQuickPickOptions = defaultOptions): Promise<ICheckboxQuickPickItem[] | undefined> {
-
+    options: ICheckboxQuickPickOptions = defaultOptions,
+): Promise<ICheckboxQuickPickItem[] | undefined> {
     const selectedItem = await showInner(items, options);
     return selectedItem !== undefined ? items : undefined;
 }
 
-function getQuickPickItems(items: ICheckboxQuickPickItem[]): vscode.QuickPickItem[] {
+function getQuickPickItems(
+    items: ICheckboxQuickPickItem[],
+): vscode.QuickPickItem[] {
     const quickPickItems: vscode.QuickPickItem[] = [];
     quickPickItems.push({ label: confirmItemLabel, description: "" });
 
@@ -44,15 +49,16 @@ function getQuickPickItems(items: ICheckboxQuickPickItem[]): vscode.QuickPickIte
 
 async function showInner(
     items: ICheckboxQuickPickItem[],
-    options: ICheckboxQuickPickOptions): Promise<vscode.QuickPickItem | undefined> {
-
+    options: ICheckboxQuickPickOptions,
+): Promise<vscode.QuickPickItem | undefined> {
     const selection = await vscode.window.showQuickPick(
         getQuickPickItems(items),
         {
             ignoreFocusOut: true,
             matchOnDescription: true,
             placeHolder: options.confirmPlaceHolder,
-        });
+        },
+    );
 
     if (selection === undefined) {
         return undefined;
@@ -66,13 +72,18 @@ async function showInner(
     if (index >= 0) {
         toggleSelection(items[index]);
     } else {
-        console.log(`Couldn't find CheckboxQuickPickItem for label '${selection.label}'`);
+        console.log(
+            `Couldn't find CheckboxQuickPickItem for label '${selection.label}'`,
+        );
     }
 
     return showInner(items, options);
 }
 
-function getItemIndex(items: ICheckboxQuickPickItem[], itemLabel: string): number {
+function getItemIndex(
+    items: ICheckboxQuickPickItem[],
+    itemLabel: string,
+): number {
     const trimmedLabel = itemLabel.substring(itemLabel.indexOf("]") + 2);
     return items.findIndex((item) => item.label === trimmedLabel);
 }
diff --git a/src/extension.ts b/src/extension.ts
index 01a4ee4a1c..d89708440f 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -6,11 +6,17 @@ import TelemetryReporter from "@vscode/extension-telemetry";
 import { DocumentSelector } from "vscode-languageclient";
 import { CodeActionsFeature } from "./features/CodeActions";
 import { ConsoleFeature } from "./features/Console";
-import { DebugSessionFeature } from "./features/DebugSession";
+import {
+    DebugSessionFeature,
+    SpecifyScriptArgsFeature,
+} from "./features/DebugSession";
 import { ExamplesFeature } from "./features/Examples";
 import { ExpandAliasFeature } from "./features/ExpandAlias";
 import { ExtensionCommandsFeature } from "./features/ExtensionCommands";
-import { ExternalApiFeature, IPowerShellExtensionClient } from "./features/ExternalApi";
+import {
+    ExternalApiFeature,
+    type IPowerShellExtensionClient,
+} from "./features/ExternalApi";
 import { GenerateBugReportFeature } from "./features/GenerateBugReport";
 import { GetCommandsFeature } from "./features/GetCommands";
 import { HelpCompletionFeature } from "./features/HelpCompletion";
@@ -19,20 +25,15 @@ import { OpenInISEFeature } from "./features/OpenInISE";
 import { PesterTestsFeature } from "./features/PesterTests";
 import { RemoteFilesFeature } from "./features/RemoteFiles";
 import { ShowHelpFeature } from "./features/ShowHelp";
-import { SpecifyScriptArgsFeature } from "./features/DebugSession";
+import { LanguageClientConsumer } from "./languageClientConsumer";
 import { Logger } from "./logging";
 import { SessionManager } from "./session";
-import { LogLevel, getSettings } from "./settings";
-import { PowerShellLanguageId } from "./utils";
-import { LanguageClientConsumer } from "./languageClientConsumer";
-
-// The most reliable way to get the name and version of the current extension.
-// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-var-requires
-const PackageJSON: any = require("../package.json");
-
+import { getSettings } from "./settings";
+import { PowerShellLanguageId, sleep } from "./utils";
 // The 1DS telemetry key, which is just shared among all Microsoft extensions
 // (and isn't sensitive).
-const TELEMETRY_KEY = "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255";
+const TELEMETRY_KEY =
+    "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255";
 
 let languageConfigurationDisposable: vscode.Disposable;
 let logger: Logger;
@@ -46,22 +47,28 @@ const documentSelector: DocumentSelector = [
     { language: "powershell", scheme: "untitled" },
 ];
 
-export async function activate(context: vscode.ExtensionContext): Promise<IPowerShellExtensionClient> {
-    const logLevel = vscode.workspace.getConfiguration(`${PowerShellLanguageId}.developer`)
-        .get<string>("editorServicesLogLevel", LogLevel.Normal);
-    logger = new Logger(logLevel, context.globalStorageUri);
+export async function activate(
+    context: vscode.ExtensionContext,
+): Promise<IPowerShellExtensionClient> {
+    logger = new Logger();
+    if (context.extensionMode === vscode.ExtensionMode.Development) {
+        restartOnExtensionFileChanges(context);
+    }
 
     telemetryReporter = new TelemetryReporter(TELEMETRY_KEY);
 
     const settings = getSettings();
-    logger.writeVerbose(`Loaded settings:\n${JSON.stringify(settings, undefined, 2)}`);
+    logger.writeDebug(
+        `Loaded settings:\n${JSON.stringify(settings, undefined, 2)}`,
+    );
 
     languageConfigurationDisposable = vscode.languages.setLanguageConfiguration(
         PowerShellLanguageId,
         {
             // TODO: Remove the useless escapes
-            // eslint-disable-next-line no-useless-escape
-            wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\'\"\,\.\<\>\/\?\s]+)/g,
+            wordPattern:
+                // eslint-disable-next-line no-useless-escape
+                /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\'\"\,\.\<\>\/\?\s]+)/g,
 
             indentationRules: {
                 // ^(.*\*/)?\s*\}.*$
@@ -86,47 +93,71 @@ export async function activate(context: vscode.ExtensionContext): Promise<IPower
                     // e.g. /** | */
                     // eslint-disable-next-line no-useless-escape
                     beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,
-                    // eslint-disable-next-line no-useless-escape
                     afterText: /^\s*\*\/$/,
-                    action: { indentAction: vscode.IndentAction.IndentOutdent, appendText: " * " },
+                    action: {
+                        indentAction: vscode.IndentAction.IndentOutdent,
+                        appendText: " * ",
+                    },
                 },
                 {
                     // e.g. /** ...|
                     // eslint-disable-next-line no-useless-escape
                     beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,
-                    action: { indentAction: vscode.IndentAction.None, appendText: " * " },
+                    action: {
+                        indentAction: vscode.IndentAction.None,
+                        appendText: " * ",
+                    },
                 },
                 {
                     // e.g.  * ...|
                     // eslint-disable-next-line no-useless-escape
                     beforeText: /^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,
-                    action: { indentAction: vscode.IndentAction.None, appendText: "* " },
+                    action: {
+                        indentAction: vscode.IndentAction.None,
+                        appendText: "* ",
+                    },
                 },
                 {
                     // e.g.  */|
                     // eslint-disable-next-line no-useless-escape
                     beforeText: /^(\t|(\ \ ))*\ \*\/\s*$/,
-                    action: { indentAction: vscode.IndentAction.None, removeText: 1 },
+                    action: {
+                        indentAction: vscode.IndentAction.None,
+                        removeText: 1,
+                    },
                 },
                 {
                     // e.g.  *-----*/|
                     // eslint-disable-next-line no-useless-escape
                     beforeText: /^(\t|(\ \ ))*\ \*[^/]*\*\/\s*$/,
-                    action: { indentAction: vscode.IndentAction.None, removeText: 1 },
+                    action: {
+                        indentAction: vscode.IndentAction.None,
+                        removeText: 1,
+                    },
                 },
             ],
-        });
+        },
+    );
+
+    interface IPackageInfo {
+        name: string;
+        displayName: string;
+        version: string;
+        publisher: string;
+    }
+    const packageInfo: IPackageInfo = context.extension.packageJSON;
 
     sessionManager = new SessionManager(
         context,
         settings,
         logger,
         documentSelector,
-        PackageJSON.name,
-        PackageJSON.displayName,
-        PackageJSON.version,
-        PackageJSON.publisher,
-        telemetryReporter);
+        packageInfo.name,
+        packageInfo.displayName,
+        packageInfo.version,
+        packageInfo.publisher,
+        telemetryReporter,
+    );
 
     // Register commands that do not require Language client
     commandRegistrations = [
@@ -137,6 +168,26 @@ export async function activate(context: vscode.ExtensionContext): Promise<IPower
         new PesterTestsFeature(sessionManager, logger),
         new CodeActionsFeature(logger),
         new SpecifyScriptArgsFeature(context),
+
+        vscode.commands.registerCommand(
+            "PowerShell.OpenLogFolder",
+            async () => {
+                await vscode.commands.executeCommand(
+                    "vscode.openFolder",
+                    context.logUri,
+                    { forceNewWindow: true },
+                );
+            },
+        ),
+        vscode.commands.registerCommand("PowerShell.ShowLogs", () => {
+            logger.showLogPanel();
+        }),
+        vscode.commands.registerCommand(
+            "GetVsCodeSessionId",
+            () => vscode.env.sessionId,
+        ),
+        // Register a command that waits for the Extension Terminal to be active. Can be used by .NET Attach Tasks.
+        registerWaitForPsesActivationCommand(context),
     ];
 
     const externalApi = new ExternalApiFeature(context, sessionManager, logger);
@@ -160,14 +211,74 @@ export async function activate(context: vscode.ExtensionContext): Promise<IPower
     }
 
     return {
-        registerExternalExtension: (id: string, apiVersion = "v1") => externalApi.registerExternalExtension(id, apiVersion),
-        unregisterExternalExtension: uuid => externalApi.unregisterExternalExtension(uuid),
-        getPowerShellVersionDetails: uuid => externalApi.getPowerShellVersionDetails(uuid),
-        waitUntilStarted: uuid => externalApi.waitUntilStarted(uuid),
+        registerExternalExtension: (id: string, apiVersion = "v1") =>
+            externalApi.registerExternalExtension(id, apiVersion),
+        unregisterExternalExtension: (uuid) =>
+            externalApi.unregisterExternalExtension(uuid),
+        getPowerShellVersionDetails: (uuid) =>
+            externalApi.getPowerShellVersionDetails(uuid),
+        waitUntilStarted: (uuid) => externalApi.waitUntilStarted(uuid),
         getStorageUri: () => externalApi.getStorageUri(),
+        getLogUri: () => externalApi.getLogUri(),
     };
 }
 
+/** Registers a command that waits for PSES Activation and returns the PID, used to auto-attach the PSES debugger */
+function registerWaitForPsesActivationCommand(
+    context: vscode.ExtensionContext,
+): vscode.Disposable {
+    return vscode.commands.registerCommand(
+        "PowerShell.WaitForPsesActivationAndReturnProcessId",
+        async () => {
+            const pidFileName = `PSES-${vscode.env.sessionId}.pid`;
+            const pidFile = vscode.Uri.joinPath(
+                context.globalStorageUri,
+                "sessions",
+                pidFileName,
+            );
+            const fs = vscode.workspace.fs;
+            // Wait for the file to be created
+            // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+            while (true) {
+                try {
+                    const pidContent = await fs.readFile(pidFile);
+                    const pid = parseInt(pidContent.toString(), 10);
+                    try {
+                        // Check if the process is still alive, delete the PID file if not and continue waiting.
+                        // https://nodejs.org/api/process.html#process_process_kill_pid_signal
+                        // "As a special case, a signal of 0 can be used to test for the existence of a process. "
+                        const NODE_TEST_PROCESS_EXISTENCE = 0;
+                        process.kill(pid, NODE_TEST_PROCESS_EXISTENCE);
+                    } catch {
+                        await fs.delete(pidFile);
+                        continue;
+                    }
+                    // VSCode command returns for launch configurations *must* be string type explicitly, will error on number or otherwise.
+                    return pidContent.toString();
+                } catch {
+                    // File doesn't exist yet, wait and try again
+                    await sleep(200);
+                }
+            }
+        },
+    );
+}
+
+/** Restarts the extension host when extension file changes are detected. Useful for development. */
+function restartOnExtensionFileChanges(context: vscode.ExtensionContext): void {
+    const watcher = vscode.workspace.createFileSystemWatcher(
+        new vscode.RelativePattern(context.extensionPath, "dist/*.js"),
+    );
+
+    context.subscriptions.push(watcher);
+    watcher.onDidChange(({ fsPath }) => {
+        vscode.window.showInformationMessage(
+            `${fsPath.split(context.extensionPath, 2)[1]} changed. Reloading Extension Host...`,
+        );
+        vscode.commands.executeCommand("workbench.action.restartExtensionHost");
+    });
+}
+
 export async function deactivate(): Promise<void> {
     // Clean up all extension features
     for (const commandRegistration of commandRegistrations) {
diff --git a/src/features/CodeActions.ts b/src/features/CodeActions.ts
index 23aac14986..825b7941a9 100644
--- a/src/features/CodeActions.ts
+++ b/src/features/CodeActions.ts
@@ -2,7 +2,7 @@
 // Licensed under the MIT License.
 
 import vscode = require("vscode");
-import { ILogger } from "../logging";
+import type { ILogger } from "../logging";
 
 export class CodeActionsFeature implements vscode.Disposable {
     private command: vscode.Disposable;
@@ -13,10 +13,12 @@ export class CodeActionsFeature implements vscode.Disposable {
         //
         // TODO: In the far future with LSP 3.19 the server can just set a URL
         // and this can go away. See https://github.com/microsoft/language-server-protocol/issues/1548
-        this.command =
-            vscode.commands.registerCommand("PowerShell.ShowCodeActionDocumentation", async (ruleName: string) => {
+        this.command = vscode.commands.registerCommand(
+            "PowerShell.ShowCodeActionDocumentation",
+            async (ruleName: string) => {
                 await this.showRuleDocumentation(ruleName);
-            });
+            },
+        );
     }
 
     public dispose(): void {
@@ -24,10 +26,13 @@ export class CodeActionsFeature implements vscode.Disposable {
     }
 
     private async showRuleDocumentation(ruleId: string): Promise<void> {
-        const pssaDocBaseURL = "https://docs.microsoft.com/powershell/utility-modules/psscriptanalyzer/rules/";
+        const pssaDocBaseURL =
+            "https://docs.microsoft.com/powershell/utility-modules/psscriptanalyzer/rules/";
 
         if (!ruleId) {
-            this.log.writeWarning("Cannot show documentation for code action, no ruleName was supplied.");
+            this.log.writeWarning(
+                "Cannot show documentation for code action, no ruleName was supplied.",
+            );
             return;
         }
 
@@ -35,6 +40,9 @@ export class CodeActionsFeature implements vscode.Disposable {
             ruleId = ruleId.substring(2);
         }
 
-        await vscode.commands.executeCommand("vscode.open", vscode.Uri.parse(pssaDocBaseURL + ruleId));
+        await vscode.commands.executeCommand(
+            "vscode.open",
+            vscode.Uri.parse(pssaDocBaseURL + ruleId),
+        );
     }
 }
diff --git a/src/features/Console.ts b/src/features/Console.ts
index 01cb5c6915..f7038f5ec1 100644
--- a/src/features/Console.ts
+++ b/src/features/Console.ts
@@ -4,21 +4,33 @@
 import vscode = require("vscode");
 import { NotificationType, RequestType } from "vscode-languageclient";
 import { LanguageClient } from "vscode-languageclient/node";
-import { ICheckboxQuickPickItem, showCheckboxQuickPick } from "../controls/checkboxQuickPick";
-import { ILogger } from "../logging";
-import { getSettings } from "../settings";
+import {
+    type ICheckboxQuickPickItem,
+    showCheckboxQuickPick,
+} from "../controls/checkboxQuickPick";
 import { LanguageClientConsumer } from "../languageClientConsumer";
+import type { ILogger } from "../logging";
+import { getSettings } from "../settings";
 
-export const EvaluateRequestType = new RequestType<IEvaluateRequestArguments, void, void>("evaluate");
-export const OutputNotificationType = new NotificationType<IOutputNotificationBody>("output");
-
-export const ShowChoicePromptRequestType =
-    new RequestType<IShowChoicePromptRequestArgs,
-        IShowChoicePromptResponseBody, string>("powerShell/showChoicePrompt");
-
-export const ShowInputPromptRequestType =
-    new RequestType<IShowInputPromptRequestArgs,
-        IShowInputPromptResponseBody, string>("powerShell/showInputPrompt");
+export const EvaluateRequestType = new RequestType<
+    IEvaluateRequestArguments,
+    void,
+    void
+>("evaluate");
+export const OutputNotificationType =
+    new NotificationType<IOutputNotificationBody>("output");
+
+export const ShowChoicePromptRequestType = new RequestType<
+    IShowChoicePromptRequestArgs,
+    IShowChoicePromptResponseBody,
+    string
+>("powerShell/showChoicePrompt");
+
+export const ShowInputPromptRequestType = new RequestType<
+    IShowInputPromptRequestArgs,
+    IShowInputPromptResponseBody,
+    string
+>("powerShell/showInputPrompt");
 
 export interface IEvaluateRequestArguments {
     expression: string;
@@ -57,27 +69,29 @@ interface IShowInputPromptResponseBody {
     promptCancelled: boolean;
 }
 
-
-function showChoicePrompt(promptDetails: IShowChoicePromptRequestArgs): Thenable<IShowChoicePromptResponseBody> {
-
+function showChoicePrompt(
+    promptDetails: IShowChoicePromptRequestArgs,
+): Thenable<IShowChoicePromptResponseBody> {
     let resultThenable: Thenable<IShowChoicePromptResponseBody>;
 
     if (!promptDetails.isMultiChoice) {
-        let quickPickItems =
-            promptDetails.choices.map<vscode.QuickPickItem>((choice) => {
+        let quickPickItems = promptDetails.choices.map<vscode.QuickPickItem>(
+            (choice) => {
                 return {
                     label: choice.label,
                     description: choice.helpMessage,
                 };
-            });
+            },
+        );
 
         if (promptDetails.defaultChoices.length > 0) {
             // Shift the default items to the front of the
             // array so that the user can select it easily
             const defaultChoice = promptDetails.defaultChoices[0];
-            if (defaultChoice > -1 &&
-                defaultChoice < promptDetails.choices.length) {
-
+            if (
+                defaultChoice > -1 &&
+                defaultChoice < promptDetails.choices.length
+            ) {
                 const defaultChoiceItem = quickPickItems[defaultChoice];
                 quickPickItems.splice(defaultChoice, 1);
 
@@ -86,12 +100,11 @@ function showChoicePrompt(promptDetails: IShowChoicePromptRequestArgs): Thenable
             }
         }
 
-        resultThenable =
-            vscode.window
-                .showQuickPick(
-                    quickPickItems,
-                    { placeHolder: promptDetails.message })
-                .then(onItemSelected);
+        resultThenable = vscode.window
+            .showQuickPick(quickPickItems, {
+                placeHolder: promptDetails.message,
+            })
+            .then(onItemSelected);
     } else {
         const checkboxQuickPickItems =
             promptDetails.choices.map<ICheckboxQuickPickItem>((choice) => {
@@ -107,26 +120,33 @@ function showChoicePrompt(promptDetails: IShowChoicePromptRequestArgs): Thenable
             checkboxQuickPickItems[choice].isSelected = true;
         }
 
-        resultThenable =
-            showCheckboxQuickPick(
-                checkboxQuickPickItems,
-                { confirmPlaceHolder: promptDetails.message })
-                .then(onItemsSelected);
+        resultThenable = showCheckboxQuickPick(checkboxQuickPickItems, {
+            confirmPlaceHolder: promptDetails.message,
+        }).then(onItemsSelected);
     }
 
     return resultThenable;
 }
 
-async function showInputPrompt(promptDetails: IShowInputPromptRequestArgs): Promise<IShowInputPromptResponseBody> {
-    const responseText = await vscode.window.showInputBox({ placeHolder: promptDetails.name + ": " });
+async function showInputPrompt(
+    promptDetails: IShowInputPromptRequestArgs,
+): Promise<IShowInputPromptResponseBody> {
+    const responseText = await vscode.window.showInputBox({
+        placeHolder: promptDetails.name + ": ",
+    });
     return onInputEntered(responseText);
 }
 
-function onItemsSelected(chosenItems: ICheckboxQuickPickItem[] | undefined): IShowChoicePromptResponseBody {
+function onItemsSelected(
+    chosenItems: ICheckboxQuickPickItem[] | undefined,
+): IShowChoicePromptResponseBody {
     if (chosenItems !== undefined) {
         return {
             promptCancelled: false,
-            responseText: chosenItems.filter((item) => item.isSelected).map((item) => item.label).join(", "),
+            responseText: chosenItems
+                .filter((item) => item.isSelected)
+                .map((item) => item.label)
+                .join(", "),
         };
     } else {
         // User cancelled the prompt, send the cancellation
@@ -137,7 +157,9 @@ function onItemsSelected(chosenItems: ICheckboxQuickPickItem[] | undefined): ISh
     }
 }
 
-function onItemSelected(chosenItem: vscode.QuickPickItem | undefined): IShowChoicePromptResponseBody {
+function onItemSelected(
+    chosenItem: vscode.QuickPickItem | undefined,
+): IShowChoicePromptResponseBody {
     if (chosenItem !== undefined) {
         return {
             promptCancelled: false,
@@ -152,7 +174,9 @@ function onItemSelected(chosenItem: vscode.QuickPickItem | undefined): IShowChoi
     }
 }
 
-function onInputEntered(responseText: string | undefined): IShowInputPromptResponseBody {
+function onInputEntered(
+    responseText: string | undefined,
+): IShowInputPromptResponseBody {
     if (responseText !== undefined) {
         return {
             promptCancelled: false,
@@ -173,43 +197,69 @@ export class ConsoleFeature extends LanguageClientConsumer {
     constructor(private logger: ILogger) {
         super();
         this.commands = [
-            vscode.commands.registerCommand("PowerShell.RunSelection", async () => {
-                if (vscode.window.activeTerminal &&
-                    vscode.window.activeTerminal.name !== "PowerShell Extension") {
-                    this.logger.write("PowerShell Extension Terminal is not active! Running in current terminal using 'runSelectedText'.");
-                    await vscode.commands.executeCommand("workbench.action.terminal.runSelectedText");
-
-                    // We need to honor the focusConsoleOnExecute setting here too. However, the boolean that `show`
-                    // takes is called `preserveFocus` which when `true` the terminal will not take focus.
-                    // This is the inverse of focusConsoleOnExecute so we have to inverse the boolean.
-                    vscode.window.activeTerminal.show(!getSettings().integratedConsole.focusConsoleOnExecute);
-                    await vscode.commands.executeCommand("workbench.action.terminal.scrollToBottom");
-
-                    return;
-                }
-
-                const editor = vscode.window.activeTextEditor;
-                if (editor === undefined) {
-                    return;
-                }
-
-                let selectionRange: vscode.Range;
-
-                if (!editor.selection.isEmpty) {
-                    selectionRange = new vscode.Range(editor.selection.start, editor.selection.end);
-                } else {
-                    selectionRange = editor.document.lineAt(editor.selection.start.line).range;
-                }
-                const client = await LanguageClientConsumer.getLanguageClient();
-                await client.sendRequest(EvaluateRequestType, {
-                    expression: editor.document.getText(selectionRange),
-                });
-
-                // Show the Extension Terminal if it isn't already visible and
-                // scroll terminal to bottom so new output is visible
-                await vscode.commands.executeCommand("PowerShell.ShowSessionConsole", true);
-                await vscode.commands.executeCommand("workbench.action.terminal.scrollToBottom");
-            }),
+            vscode.commands.registerCommand(
+                "PowerShell.RunSelection",
+                async () => {
+                    if (
+                        vscode.window.activeTerminal &&
+                        vscode.window.activeTerminal.name !==
+                            "PowerShell Extension"
+                    ) {
+                        this.logger.write(
+                            "PowerShell Extension Terminal is not active! Running in current terminal using 'runSelectedText'.",
+                        );
+                        await vscode.commands.executeCommand(
+                            "workbench.action.terminal.runSelectedText",
+                        );
+
+                        // We need to honor the focusConsoleOnExecute setting here too. However, the boolean that `show`
+                        // takes is called `preserveFocus` which when `true` the terminal will not take focus.
+                        // This is the inverse of focusConsoleOnExecute so we have to inverse the boolean.
+                        vscode.window.activeTerminal.show(
+                            !getSettings().integratedConsole
+                                .focusConsoleOnExecute,
+                        );
+                        await vscode.commands.executeCommand(
+                            "workbench.action.terminal.scrollToBottom",
+                        );
+
+                        return;
+                    }
+
+                    const editor = vscode.window.activeTextEditor;
+                    if (editor === undefined) {
+                        return;
+                    }
+
+                    let selectionRange: vscode.Range;
+
+                    if (!editor.selection.isEmpty) {
+                        selectionRange = new vscode.Range(
+                            editor.selection.start,
+                            editor.selection.end,
+                        );
+                    } else {
+                        selectionRange = editor.document.lineAt(
+                            editor.selection.start.line,
+                        ).range;
+                    }
+                    const client =
+                        await LanguageClientConsumer.getLanguageClient();
+                    await client.sendRequest(EvaluateRequestType, {
+                        expression: editor.document.getText(selectionRange),
+                    });
+
+                    // Show the Extension Terminal if it isn't already visible and
+                    // scroll terminal to bottom so new output is visible
+                    await vscode.commands.executeCommand(
+                        "PowerShell.ShowSessionConsole",
+                        true,
+                    );
+                    await vscode.commands.executeCommand(
+                        "workbench.action.terminal.scrollToBottom",
+                    );
+                },
+            ),
         ];
     }
 
@@ -227,11 +277,13 @@ export class ConsoleFeature extends LanguageClientConsumer {
         this.handlers = [
             languageClient.onRequest(
                 ShowChoicePromptRequestType,
-                (promptDetails) => showChoicePrompt(promptDetails)),
+                (promptDetails) => showChoicePrompt(promptDetails),
+            ),
 
             languageClient.onRequest(
                 ShowInputPromptRequestType,
-                (promptDetails) => showInputPrompt(promptDetails)),
+                (promptDetails) => showInputPrompt(promptDetails),
+            ),
         ];
     }
 }
diff --git a/src/features/DebugSession.ts b/src/features/DebugSession.ts
index 17b8fb9831..3128db3b46 100644
--- a/src/features/DebugSession.ts
+++ b/src/features/DebugSession.ts
@@ -1,49 +1,51 @@
 // Copyright (c) Microsoft Corporation.
 // Licensed under the MIT License.
 
+import type { DebugProtocol } from "@vscode/debugprotocol";
+import path from "path";
 import {
-    debug,
-    CancellationToken,
     CancellationTokenSource,
-    DebugAdapterDescriptor,
-    DebugAdapterDescriptorFactory,
     DebugAdapterExecutable,
     DebugAdapterNamedPipeServer,
-    DebugConfiguration,
-    DebugConfigurationProvider,
-    DebugSession,
-    ExtensionContext,
-    WorkspaceFolder,
+    DebugConfigurationProviderTriggerKind,
     Disposable,
-    window,
+    commands,
+    debug,
     extensions,
+    window,
     workspace,
-    commands,
-    InputBoxOptions,
-    QuickPickItem,
-    QuickPickOptions,
-    DebugConfigurationProviderTriggerKind,
-    DebugAdapterTrackerFactory,
-    DebugAdapterTracker,
-    LogOutputChannel
+    type CancellationToken,
+    type DebugAdapterDescriptor,
+    type DebugAdapterDescriptorFactory,
+    type DebugAdapterTracker,
+    type DebugAdapterTrackerFactory,
+    type DebugConfiguration,
+    type DebugConfigurationProvider,
+    type DebugSession,
+    type ExtensionContext,
+    type InputBoxOptions,
+    type LogOutputChannel,
+    type QuickPickItem,
+    type QuickPickOptions,
+    type WorkspaceFolder,
 } from "vscode";
-import type { DebugProtocol } from "@vscode/debugprotocol";
 import { NotificationType, RequestType } from "vscode-languageclient";
 import { LanguageClient } from "vscode-languageclient/node";
 import { LanguageClientConsumer } from "../languageClientConsumer";
-import { ILogger } from "../logging";
+import type { ILogger } from "../logging";
 import { OperatingSystem, getPlatformDetails } from "../platform";
 import { PowerShellProcess } from "../process";
-import { IEditorServicesSessionDetails, SessionManager } from "../session";
+import { SessionManager, type IEditorServicesSessionDetails } from "../session";
 import { getSettings } from "../settings";
-import path from "path";
 import { checkIfFileExists } from "../utils";
 
-export const StartDebuggerNotificationType =
-    new NotificationType<void>("powerShell/startDebugger");
+export const StartDebuggerNotificationType = new NotificationType<void>(
+    "powerShell/startDebugger",
+);
 
-export const StopDebuggerNotificationType =
-    new NotificationType<void>("powerShell/stopDebugger");
+export const StopDebuggerNotificationType = new NotificationType<void>(
+    "powerShell/stopDebugger",
+);
 
 export enum DebugConfig {
     LaunchCurrentFile,
@@ -54,12 +56,16 @@ export enum DebugConfig {
     ModuleInteractiveSession,
     BinaryModule,
     BinaryModulePester,
+    WindowsPowerShell,
 }
 
 /** Make the implicit behavior of undefined and null in the debug api more explicit  */
 type PREVENT_DEBUG_START = undefined;
 type PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG = null;
-type ResolveDebugConfigurationResult = DebugConfiguration | PREVENT_DEBUG_START | PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
+type ResolveDebugConfigurationResult =
+    | DebugConfiguration
+    | PREVENT_DEBUG_START
+    | PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
 
 const PREVENT_DEBUG_START = undefined;
 const PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG = null;
@@ -78,7 +84,7 @@ export const DebugConfigurations: Record<DebugConfig, DebugConfiguration> = {
         name: "PowerShell: Launch Script",
         type: "PowerShell",
         request: "launch",
-        script: "Enter path or command to execute, for example: \"${workspaceFolder}/src/foo.ps1\" or \"Invoke-Pester\"",
+        script: 'Enter path or command to execute, for example: "${workspaceFolder}/src/foo.ps1" or "Invoke-Pester"',
         args: [],
     },
     [DebugConfig.InteractiveSession]: {
@@ -103,13 +109,13 @@ export const DebugConfigurations: Record<DebugConfig, DebugConfiguration> = {
         name: "PowerShell: Module Interactive Session",
         type: "PowerShell",
         request: "launch",
-        script: "Enter command to import your binary module, for example: \"Import-Module -Force ${workspaceFolder}/path/to/module.psd1|dll\"",
+        script: 'Enter command to import your binary module, for example: "Import-Module -Force ${workspaceFolder}/path/to/module.psd1|dll"',
     },
     [DebugConfig.BinaryModule]: {
         name: "PowerShell: Binary Module Interactive",
         type: "PowerShell",
         request: "launch",
-        script: "Enter command to import your binary module, for example: \"Import-Module -Force ${workspaceFolder}/path/to/module.psd1|dll\"",
+        script: 'Enter command to import your binary module, for example: "Import-Module -Force ${workspaceFolder}/path/to/module.psd1|dll"',
         createTemporaryIntegratedConsole: true,
         attachDotnetDebugger: true,
     },
@@ -120,18 +126,30 @@ export const DebugConfigurations: Record<DebugConfig, DebugConfiguration> = {
         script: "Invoke-Pester",
         createTemporaryIntegratedConsole: true,
         attachDotnetDebugger: true,
-    }
+    },
+    [DebugConfig.WindowsPowerShell]: {
+        name: "PowerShell: Windows PowerShell",
+        type: "PowerShell",
+        request: "launch",
+        sessionName: "Windows PowerShell (x64)",
+    },
 };
 
-export class DebugSessionFeature extends LanguageClientConsumer
-    implements DebugConfigurationProvider, DebugAdapterDescriptorFactory {
+export class DebugSessionFeature
+    extends LanguageClientConsumer
+    implements DebugConfigurationProvider, DebugAdapterDescriptorFactory
+{
     private tempDebugProcess: PowerShellProcess | undefined;
     private tempSessionDetails: IEditorServicesSessionDetails | undefined;
     private commands: Disposable[] = [];
     private handlers: Disposable[] = [];
     private adapterName = "PowerShell";
 
-    constructor(context: ExtensionContext, private sessionManager: SessionManager, private logger: ILogger) {
+    constructor(
+        context: ExtensionContext,
+        private sessionManager: SessionManager,
+        private logger: ILogger,
+    ) {
         super();
 
         this.activateDebugAdaptor(context);
@@ -140,15 +158,22 @@ export class DebugSessionFeature extends LanguageClientConsumer
         // substitutions in VS Code debug configurations are required to return
         // strings. Hence to the `toString()` on these.
         this.commands = [
-            commands.registerCommand("PowerShell.PickPSHostProcess", async () => {
-                const processId = await this.pickPSHostProcess();
-                return processId?.toString();
-            }),
-
-            commands.registerCommand("PowerShell.PickRunspace", async (processId) => {
-                const runspace = await this.pickRunspace(processId);
-                return runspace?.toString();
-            }, this),
+            commands.registerCommand(
+                "PowerShell.PickPSHostProcess",
+                async () => {
+                    const processId = await this.pickPSHostProcess();
+                    return processId?.toString();
+                },
+            ),
+
+            commands.registerCommand(
+                "PowerShell.PickRunspace",
+                async (processId) => {
+                    const runspace = await this.pickRunspace(processId);
+                    return runspace?.toString();
+                },
+                this,
+            ),
         ];
     }
 
@@ -166,19 +191,25 @@ export class DebugSessionFeature extends LanguageClientConsumer
     public activateDebugAdaptor(context: ExtensionContext): void {
         const triggers = [
             DebugConfigurationProviderTriggerKind.Initial,
-            DebugConfigurationProviderTriggerKind.Dynamic
+            DebugConfigurationProviderTriggerKind.Dynamic,
         ];
 
-
         for (const triggerKind of triggers) {
             context.subscriptions.push(
-                debug.registerDebugConfigurationProvider(this.adapterName, this, triggerKind)
+                debug.registerDebugConfigurationProvider(
+                    this.adapterName,
+                    this,
+                    triggerKind,
+                ),
             );
         }
 
         context.subscriptions.push(
-            debug.registerDebugAdapterTrackerFactory(this.adapterName, new PowerShellDebugAdapterTrackerFactory(this.adapterName)),
-            debug.registerDebugAdapterDescriptorFactory(this.adapterName, this)
+            debug.registerDebugAdapterTrackerFactory(
+                this.adapterName,
+                new PowerShellDebugAdapterTrackerFactory(this.adapterName),
+            ),
+            debug.registerDebugAdapterDescriptorFactory(this.adapterName, this),
         );
     }
 
@@ -186,23 +217,30 @@ export class DebugSessionFeature extends LanguageClientConsumer
         this.handlers = [
             languageClient.onNotification(
                 StartDebuggerNotificationType,
-                () => void debug.startDebugging(undefined, DebugConfigurations[DebugConfig.InteractiveSession])),
+                () =>
+                    void debug.startDebugging(
+                        undefined,
+                        DebugConfigurations[DebugConfig.InteractiveSession],
+                    ),
+            ),
 
             languageClient.onNotification(
                 StopDebuggerNotificationType,
-                () => void debug.stopDebugging(undefined))
+                () => void debug.stopDebugging(undefined),
+            ),
         ];
     }
 
     public async provideDebugConfigurations(
         _folder: WorkspaceFolder | undefined,
-        _token?: CancellationToken): Promise<DebugConfiguration[]> {
-
+        _token?: CancellationToken,
+    ): Promise<DebugConfiguration[]> {
         const debugConfigPickItems = [
             {
                 id: DebugConfig.LaunchCurrentFile,
                 label: "Launch Current File",
-                description: "Launch and debug the file in the currently active editor window",
+                description:
+                    "Launch and debug the file in the currently active editor window",
             },
             {
                 id: DebugConfig.LaunchScript,
@@ -212,39 +250,56 @@ export class DebugSessionFeature extends LanguageClientConsumer
             {
                 id: DebugConfig.InteractiveSession,
                 label: "Interactive Session",
-                description: "Debug commands executed from the PowerShell Extension Terminal",
+                description:
+                    "Debug commands executed from the PowerShell Extension Terminal",
             },
             {
                 id: DebugConfig.AttachHostProcess,
                 label: "Attach",
-                description: "Attach the debugger to a running PowerShell Host Process",
+                description:
+                    "Attach the debugger to a running PowerShell Host Process",
             },
             {
                 id: DebugConfig.RunPester,
                 label: "Run Pester Tests",
-                description: "Debug Pester Tests detected in your current directory (runs Invoke-Pester)",
+                description:
+                    "Debug Pester Tests detected in your current directory (runs Invoke-Pester)",
             },
             {
                 id: DebugConfig.ModuleInteractiveSession,
                 label: "Interactive Session (Module)",
-                description: "Debug commands executed from the PowerShell Extension Terminal after auto-loading your module",
+                description:
+                    "Debug commands executed from the PowerShell Extension Terminal after auto-loading your module",
             },
             {
                 id: DebugConfig.BinaryModule,
                 label: "Interactive Session (Binary Module)",
-                description: "Debug a .NET binary or hybrid module loaded into a PowerShell session. Breakpoints you set in your .NET (C#/F#/VB/etc.) code will be hit upon command execution. You may want to add a compile or watch action as a pre-launch task to this configuration.",
+                description:
+                    "Debug a .NET binary or hybrid module loaded into a PowerShell session. Breakpoints you set in your .NET (C#/F#/VB/etc.) code will be hit upon command execution. You may want to add a compile or watch action as a pre-launch task to this configuration.",
             },
             {
-                id: DebugConfig.RunPester,
+                id: DebugConfig.BinaryModulePester,
                 label: "Run Pester Tests (Binary Module)",
-                description: "Debug a .NET binary or hybrid module by running Pester tests. Breakpoints you set in your .NET (C#/F#/VB/etc.) code will be hit upon command execution. You may want to add a compile or watch action as a pre-launch task to this configuration.",
+                description:
+                    "Debug a .NET binary or hybrid module by running Pester tests. Breakpoints you set in your .NET (C#/F#/VB/etc.) code will be hit upon command execution. You may want to add a compile or watch action as a pre-launch task to this configuration.",
             },
         ];
 
-        const launchSelection =
-            await window.showQuickPick(
-                debugConfigPickItems,
-                { placeHolder: "Select a PowerShell debug configuration" });
+        // Only show the Windows PowerShell option if the platform is Windows
+        const platformDetails = getPlatformDetails();
+        if (platformDetails.operatingSystem === OperatingSystem.Windows) {
+            debugConfigPickItems.push({
+                id: DebugConfig.WindowsPowerShell,
+                label: "Windows PowerShell",
+                description:
+                    "Launch Windows PowerShell in a temporary integrated console for debugging",
+            });
+        }
+
+        const launchSelection = await window.showQuickPick(
+            debugConfigPickItems,
+            { placeHolder: "Select a PowerShell debug configuration" },
+        );
 
         if (launchSelection) {
             return [DebugConfigurations[launchSelection.id]];
@@ -258,21 +313,27 @@ export class DebugSessionFeature extends LanguageClientConsumer
     public async resolveDebugConfiguration(
         _folder: WorkspaceFolder | undefined,
         config: DebugConfiguration,
-        _token?: CancellationToken): Promise<ResolveDebugConfigurationResult> {
-
+        _token?: CancellationToken,
+    ): Promise<ResolveDebugConfigurationResult> {
         // NOTE: We intentionally do not touch the `cwd` setting of the config.
 
         if (!config.request) {
             // No launch.json, create the default configuration for both unsaved
             // (Untitled) and saved documents.
-            const LaunchCurrentFileConfig = DebugConfigurations[DebugConfig.LaunchCurrentFile];
+            const LaunchCurrentFileConfig =
+                DebugConfigurations[DebugConfig.LaunchCurrentFile];
             config = { ...config, ...LaunchCurrentFileConfig };
             config.current_document = true;
         }
 
-        if (config.script === "${file}" || config.script === "${relativeFile}") {
+        if (
+            config.script === "${file}" ||
+            config.script === "${relativeFile}"
+        ) {
             if (window.activeTextEditor === undefined) {
-                void this.logger.writeAndShowError("To debug the 'Current File', you must first open a PowerShell script file in the editor.");
+                void this.logger.writeAndShowError(
+                    "To debug the 'Current File', you must first open a PowerShell script file in the editor.",
+                );
                 return PREVENT_DEBUG_START;
             }
             config.current_document = true;
@@ -290,22 +351,25 @@ export class DebugSessionFeature extends LanguageClientConsumer
     public async resolveDebugConfigurationWithSubstitutedVariables(
         _folder: WorkspaceFolder | undefined,
         config: DebugConfiguration,
-        _token?: CancellationToken): Promise<ResolveDebugConfigurationResult> {
-
+        _token?: CancellationToken,
+    ): Promise<ResolveDebugConfigurationResult> {
         let resolvedConfig: ResolveDebugConfigurationResult;
 
         // Prevent the Debug Console from opening
         config.internalConsoleOptions = "neverOpen";
 
         const settings = getSettings();
-        config.createTemporaryIntegratedConsole ??= settings.debugging.createTemporaryIntegratedConsole;
+        config.createTemporaryIntegratedConsole ??=
+            settings.debugging.createTemporaryIntegratedConsole;
         config.executeMode ??= settings.debugging.executeMode;
         if (config.request === "attach") {
             resolvedConfig = await this.resolveAttachDebugConfiguration(config);
         } else if (config.request === "launch") {
             resolvedConfig = await this.resolveLaunchDebugConfiguration(config);
         } else {
-            void this.logger.writeAndShowError(`PowerShell debug configuration's request type was invalid: '${config.request}'.`);
+            void this.logger.writeAndShowError(
+                `PowerShell debug configuration's request type was invalid: '${config.request}'.`,
+            );
             return PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
         }
 
@@ -320,11 +384,12 @@ export class DebugSessionFeature extends LanguageClientConsumer
     // make this method async.
     public async createDebugAdapterDescriptor(
         session: DebugSession,
-        _executable: DebugAdapterExecutable | undefined): Promise<DebugAdapterDescriptor | undefined> {
-
+        _executable: DebugAdapterExecutable | undefined,
+    ): Promise<DebugAdapterDescriptor | undefined> {
         await this.sessionManager.start();
 
-        const sessionDetails = session.configuration.createTemporaryIntegratedConsole
+        const sessionDetails = session.configuration
+            .createTemporaryIntegratedConsole
             ? await this.createTemporaryIntegratedConsole(session)
             : this.sessionManager.getSessionDetails();
 
@@ -335,42 +400,68 @@ export class DebugSessionFeature extends LanguageClientConsumer
         // Create or show the debug terminal (either temporary or session).
         this.sessionManager.showDebugTerminal(true);
 
-        this.logger.writeVerbose(`Connecting to pipe: ${sessionDetails.debugServicePipeName}`);
-        this.logger.writeVerbose(`Debug configuration: ${JSON.stringify(session.configuration, undefined, 2)}`);
+        this.logger.writeDebug(
+            `Connecting to pipe: ${sessionDetails.debugServicePipeName}`,
+        );
+        this.logger.writeDebug(
+            `Debug configuration: ${JSON.stringify(session.configuration, undefined, 2)}`,
+        );
 
-        return new DebugAdapterNamedPipeServer(sessionDetails.debugServicePipeName);
+        return new DebugAdapterNamedPipeServer(
+            sessionDetails.debugServicePipeName,
+        );
     }
 
-    private async resolveLaunchDebugConfiguration(config: DebugConfiguration): Promise<ResolveDebugConfigurationResult> {
+    private async resolveLaunchDebugConfiguration(
+        config: DebugConfiguration,
+    ): Promise<ResolveDebugConfigurationResult> {
         // Check the languageId and file extension only for current documents
         // (which includes untitled documents). This prevents accidentally
         // running the debugger for an open non-PowerShell file.
         if (config.current_document) {
             const currentDocument = window.activeTextEditor?.document;
             if (currentDocument?.languageId !== "powershell") {
-                void this.logger.writeAndShowError(`PowerShell does not support debugging this language mode: '${currentDocument?.languageId}'.`);
+                void this.logger.writeAndShowError(
+                    `PowerShell does not support debugging this language mode: '${currentDocument?.languageId}'.`,
+                );
                 return PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
             }
 
             if (await checkIfFileExists(config.script)) {
                 const ext = path.extname(config.script).toLowerCase();
                 if (!(ext === ".ps1" || ext === ".psm1")) {
-                    void this.logger.writeAndShowError(`PowerShell does not support debugging this file type: '${path.basename(config.script)}'.`);
+                    void this.logger.writeAndShowError(
+                        `PowerShell does not support debugging this file type: '${path.basename(config.script)}'.`,
+                    );
                     return PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
                 }
             }
         }
 
-        if (config.untitled_document && config.createTemporaryIntegratedConsole) {
-            void this.logger.writeAndShowError("PowerShell does not support debugging untitled files in a temporary console.");
+        if (
+            config.untitled_document &&
+            config.createTemporaryIntegratedConsole
+        ) {
+            void this.logger.writeAndShowError(
+                "PowerShell does not support debugging untitled files in a temporary console.",
+            );
             return PREVENT_DEBUG_START;
         }
 
-        if (!config.createTemporaryIntegratedConsole && config.attachDotnetDebugger) {
-            void this.logger.writeAndShowError("dotnet debugging without using a temporary console is currently not supported. Please updated your launch config to include createTemporaryIntegratedConsole: true.");
+        if (
+            !config.createTemporaryIntegratedConsole &&
+            config.attachDotnetDebugger
+        ) {
+            void this.logger.writeAndShowError(
+                "dotnet debugging without using a temporary console is currently not supported. Please updated your launch config to include createTemporaryIntegratedConsole: true.",
+            );
             return PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
         }
 
+        if (config.sessionName) {
+            config.createTemporaryIntegratedConsole = true;
+        }
+
         if (config.attachDotnetDebugger) {
             return this.resolveAttachDotnetDebugConfiguration(config);
         }
@@ -378,16 +469,24 @@ export class DebugSessionFeature extends LanguageClientConsumer
         return config;
     }
 
-    private resolveAttachDotnetDebugConfiguration(config: DebugConfiguration): ResolveDebugConfigurationResult {
+    private resolveAttachDotnetDebugConfiguration(
+        config: DebugConfiguration,
+    ): ResolveDebugConfigurationResult {
         if (!extensions.getExtension("ms-dotnettools.csharp")) {
-            void this.logger.writeAndShowError("You specified attachDotnetDebugger in your PowerShell Launch configuration but the C# extension is not installed. Please install the C# extension and try again.");
+            void this.logger.writeAndShowError(
+                "You specified attachDotnetDebugger in your PowerShell Launch configuration but the C# extension is not installed. Please install the C# extension and try again.",
+            );
             return PREVENT_DEBUG_START;
         }
 
-        const dotnetDebuggerConfig = this.getDotnetNamedConfigOrDefault(config.dotnetDebuggerConfigName);
+        const dotnetDebuggerConfig = this.getDotnetNamedConfigOrDefault(
+            config.dotnetDebuggerConfigName,
+        );
 
         if (dotnetDebuggerConfig === undefined) {
-            void this.logger.writeAndShowError(`You specified dotnetDebuggerConfigName in your PowerShell Launch configuration but a matching launch config was not found. Please ensure you have a coreclr attach config with the name ${config.dotnetDebuggerConfigName} in your launch.json file or remove dotnetDebuggerConfigName from your PowerShell Launch configuration to use the defaults`);
+            void this.logger.writeAndShowError(
+                `You specified dotnetDebuggerConfigName in your PowerShell Launch configuration but a matching launch config was not found. Please ensure you have a coreclr attach config with the name ${config.dotnetDebuggerConfigName} in your launch.json file or remove dotnetDebuggerConfigName from your PowerShell Launch configuration to use the defaults`,
+            );
             return PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
         }
 
@@ -395,12 +494,20 @@ export class DebugSessionFeature extends LanguageClientConsumer
         return config;
     }
 
-    private async createTemporaryIntegratedConsole(session: DebugSession): Promise<IEditorServicesSessionDetails | undefined> {
+    private async createTemporaryIntegratedConsole(
+        session: DebugSession,
+    ): Promise<IEditorServicesSessionDetails | undefined> {
         const settings = getSettings();
-        this.tempDebugProcess = await this.sessionManager.createDebugSessionProcess(settings);
+        this.tempDebugProcess =
+            await this.sessionManager.createDebugSessionProcess(
+                settings,
+                session.configuration.sessionName,
+            );
         // TODO: Maybe set a timeout on the cancellation token?
         const cancellationTokenSource = new CancellationTokenSource();
-        this.tempSessionDetails = await this.tempDebugProcess.start(cancellationTokenSource.token);
+        this.tempSessionDetails = await this.tempDebugProcess.start(
+            cancellationTokenSource.token,
+        );
 
         // NOTE: Dotnet attach debugging is only currently supported if a temporary debug terminal is used, otherwise we get lots of lock conflicts from loading the assemblies.
         if (session.configuration.attachDotnetDebugger) {
@@ -409,73 +516,103 @@ export class DebugSessionFeature extends LanguageClientConsumer
             // Will wait until the process is started and available before attaching
             const pid = await this.tempDebugProcess.getPid();
             if (pid === undefined) {
-                void this.logger.writeAndShowError("Attach Dotnet Debugger was specified but the PowerShell temporary debug session failed to start. This is probably a bug.");
+                void this.logger.writeAndShowError(
+                    "Attach Dotnet Debugger was specified but the PowerShell temporary debug session failed to start. This is probably a bug.",
+                );
                 return PREVENT_DEBUG_START;
             }
             dotnetAttachConfig.processId = pid;
 
             // Ensure the .NET session stops before the PowerShell session so that the .NET debug session doesn't emit an error about the process unexpectedly terminating.
             let tempConsoleDotnetAttachSession: DebugSession;
-            const startDebugEvent = debug.onDidStartDebugSession(dotnetAttachSession => {
-                if (dotnetAttachSession.configuration.name != dotnetAttachConfig.name) { return; }
-
-                // Makes the event one-time
-                // HACK: This seems like you would be calling a method on a variable not assigned yet, but it does work in the flow.
-                // The dispose shorthand demonry for making an event one-time courtesy of: https://github.com/OmniSharp/omnisharp-vscode/blob/b8b07bb12557b4400198895f82a94895cb90c461/test/integrationTests/launchConfiguration.integration.test.ts#L41-L45
-                startDebugEvent.dispose();
-
-                this.logger.writeVerbose(`Debugger session detected: ${dotnetAttachSession.name} (${dotnetAttachSession.id})`);
-
-                tempConsoleDotnetAttachSession = dotnetAttachSession;
-
-                const stopDebugEvent = debug.onDidTerminateDebugSession(async tempConsoleSession => {
-                    if (tempConsoleDotnetAttachSession.parentSession?.id !== tempConsoleSession.id) { return; }
+            const startDebugEvent = debug.onDidStartDebugSession(
+                (dotnetAttachSession) => {
+                    if (
+                        dotnetAttachSession.configuration.name !=
+                        dotnetAttachConfig.name
+                    ) {
+                        return;
+                    }
 
                     // Makes the event one-time
-                    stopDebugEvent.dispose();
-
-                    this.logger.writeVerbose(`Debugger session terminated: ${tempConsoleSession.name} (${tempConsoleSession.id})`);
-
-                    // HACK: As of 2023-08-17, there is no vscode debug API to request the C# debugger to detach, so we send it a custom DAP request instead.
-                    const disconnectRequest: DebugProtocol.DisconnectRequest = {
-                        command: "disconnect",
-                        seq: 0,
-                        type: "request",
-                        arguments: {
-                            restart: false,
-                            terminateDebuggee: false,
-                            suspendDebuggee: false
-                        }
-                    };
-
-                    try {
-                        await dotnetAttachSession.customRequest(
-                            disconnectRequest.command,
-                            disconnectRequest.arguments
-                        );
-                    } catch (err) {
-                        this.logger.writeWarning(`Disconnect request to dotnet debugger failed: ${err}`);
-                    }
-                });
-            });
+                    // HACK: This seems like you would be calling a method on a variable not assigned yet, but it does work in the flow.
+                    // The dispose shorthand demonry for making an event one-time courtesy of: https://github.com/OmniSharp/omnisharp-vscode/blob/b8b07bb12557b4400198895f82a94895cb90c461/test/integrationTests/launchConfiguration.integration.test.ts#L41-L45
+                    startDebugEvent.dispose();
+
+                    this.logger.writeDebug(
+                        `Debugger session detected: ${dotnetAttachSession.name} (${dotnetAttachSession.id})`,
+                    );
+
+                    tempConsoleDotnetAttachSession = dotnetAttachSession;
+
+                    const stopDebugEvent = debug.onDidTerminateDebugSession(
+                        async (tempConsoleSession) => {
+                            if (
+                                tempConsoleDotnetAttachSession.parentSession
+                                    ?.id !== tempConsoleSession.id
+                            ) {
+                                return;
+                            }
+
+                            // Makes the event one-time
+                            stopDebugEvent.dispose();
+
+                            this.logger.writeDebug(
+                                `Debugger session terminated: ${tempConsoleSession.name} (${tempConsoleSession.id})`,
+                            );
+
+                            // HACK: As of 2023-08-17, there is no vscode debug API to request the C# debugger to detach, so we send it a custom DAP request instead.
+                            const disconnectRequest: DebugProtocol.DisconnectRequest =
+                                {
+                                    command: "disconnect",
+                                    seq: 0,
+                                    type: "request",
+                                    arguments: {
+                                        restart: false,
+                                        terminateDebuggee: false,
+                                        suspendDebuggee: false,
+                                    },
+                                };
+
+                            try {
+                                await dotnetAttachSession.customRequest(
+                                    disconnectRequest.command,
+                                    disconnectRequest.arguments,
+                                );
+                            } catch (err) {
+                                this.logger.writeWarning(
+                                    `Disconnect request to dotnet debugger failed: ${err}`,
+                                );
+                            }
+                        },
+                    );
+                },
+            );
 
             // Start a child debug session to attach the dotnet debugger
             // TODO: Accommodate multi-folder workspaces if the C# code is in a different workspace folder
             await debug.startDebugging(undefined, dotnetAttachConfig, session);
-            this.logger.writeVerbose(`Dotnet attach debug configuration: ${JSON.stringify(dotnetAttachConfig, undefined, 2)}`);
-            this.logger.writeVerbose(`Attached dotnet debugger to process: ${pid}`);
+            this.logger.writeDebug(
+                `Dotnet attach debug configuration: ${JSON.stringify(dotnetAttachConfig, undefined, 2)}`,
+            );
+            this.logger.writeDebug(
+                `Attached dotnet debugger to process: ${pid}`,
+            );
         }
 
         return this.tempSessionDetails;
     }
 
-    private getDotnetNamedConfigOrDefault(configName?: string): ResolveDebugConfigurationResult {
+    private getDotnetNamedConfigOrDefault(
+        configName?: string,
+    ): ResolveDebugConfigurationResult {
         if (configName) {
             const debugConfigs = this.getLaunchConfigurations();
-            return debugConfigs.find(({ type, request, name }) =>
-                type === "coreclr" &&
-                request === "attach" &&
-                name === configName
+            return debugConfigs.find(
+                ({ type, request, name }) =>
+                    type === "coreclr" &&
+                    request === "attach" &&
+                    name === configName,
             );
         }
 
@@ -487,27 +624,41 @@ export class DebugSessionFeature extends LanguageClientConsumer
             request: "attach",
             processId: undefined,
             logging: {
-                moduleLoad: false
-            }
+                moduleLoad: false,
+            },
         };
     }
 
     /** Fetches all available vscode launch configurations. This is abstracted out for easier testing. */
     private getLaunchConfigurations(): DebugConfiguration[] {
-        return workspace.getConfiguration("launch").get<DebugConfiguration[]>("configurations") ?? [];
+        return (
+            workspace
+                .getConfiguration("launch")
+                .get<DebugConfiguration[]>("configurations") ?? []
+        );
     }
 
-    private async resolveAttachDebugConfiguration(config: DebugConfiguration): Promise<ResolveDebugConfigurationResult> {
+    private async resolveAttachDebugConfiguration(
+        config: DebugConfiguration,
+    ): Promise<ResolveDebugConfigurationResult> {
         const platformDetails = getPlatformDetails();
-        const versionDetails = this.sessionManager.getPowerShellVersionDetails();
+        const versionDetails =
+            this.sessionManager.getPowerShellVersionDetails();
         if (versionDetails === undefined) {
-            void this.logger.writeAndShowError(`PowerShell session version details were not found for '${config.name}'.`);
+            void this.logger.writeAndShowError(
+                `PowerShell session version details were not found for '${config.name}'.`,
+            );
             return PREVENT_DEBUG_START;
         }
 
         // Cross-platform attach to process was added in 6.2.0-preview.4.
-        if (versionDetails.version < "7.0.0" && platformDetails.operatingSystem !== OperatingSystem.Windows) {
-            void this.logger.writeAndShowError(`Attaching to a PowerShell Host Process on ${OperatingSystem[platformDetails.operatingSystem]} requires PowerShell 7.0 or higher (Current Version: ${versionDetails.version}).`);
+        if (
+            versionDetails.version < "7.0.0" &&
+            platformDetails.operatingSystem !== OperatingSystem.Windows
+        ) {
+            void this.logger.writeAndShowError(
+                `Attaching to a PowerShell Host Process on ${OperatingSystem[platformDetails.operatingSystem]} requires PowerShell 7.0 or higher (Current Version: ${versionDetails.version}).`,
+            );
             return PREVENT_DEBUG_START;
         }
 
@@ -522,18 +673,27 @@ export class DebugSessionFeature extends LanguageClientConsumer
 
         // If we were given a stringified int from the user, or from the picker
         // command, we need to parse it here.
-        if (typeof config.processId === "string" && config.processId != "current") {
+        if (
+            typeof config.processId === "string" &&
+            config.processId != "current"
+        ) {
             config.processId = parseInt(config.processId);
         }
 
         // NOTE: We don't support attaching to the Extension Terminal, even
         // though in the past it looked like we did. The implementation was
         // half-baked and left things unusable.
-        if (config.processId === "current" || config.processId === await this.sessionManager.getLanguageServerPid()) {
+        if (
+            config.processId === "current" ||
+            config.processId ===
+                (await this.sessionManager.getLanguageServerPid())
+        ) {
             // TODO: When (if ever) it's supported, we need to convert 0 and the
             // old notion of "current" to the actual process ID, like this:
             // config.processId = await this.sessionManager.getLanguageServerPid();
-            void this.logger.writeAndShowError("Attaching to the PowerShell Extension terminal is not supported. Please use the 'PowerShell: Interactive Session' debug configuration instead.");
+            void this.logger.writeAndShowError(
+                "Attaching to the PowerShell Extension terminal is not supported. Please use the 'PowerShell: Interactive Session' debug configuration instead.",
+            );
             return PREVENT_DEBUG_START_AND_OPEN_DEBUGCONFIG;
         }
 
@@ -550,7 +710,10 @@ export class DebugSessionFeature extends LanguageClientConsumer
 
     private async pickPSHostProcess(): Promise<number | undefined> {
         const client = await LanguageClientConsumer.getLanguageClient();
-        const response = await client.sendRequest(GetPSHostProcessesRequestType, {});
+        const response = await client.sendRequest(
+            GetPSHostProcessesRequestType,
+            {},
+        );
         const items: IProcessItem[] = [];
         for (const process of response) {
             let windowTitle = "";
@@ -566,7 +729,9 @@ export class DebugSessionFeature extends LanguageClientConsumer
         }
 
         if (items.length === 0) {
-            return Promise.reject(new Error("There are no PowerShell host processes to attach."));
+            return Promise.reject(
+                new Error("There are no PowerShell host processes to attach."),
+            );
         }
 
         const options: QuickPickOptions = {
@@ -582,7 +747,9 @@ export class DebugSessionFeature extends LanguageClientConsumer
 
     private async pickRunspace(processId: number): Promise<number | undefined> {
         const client = await LanguageClientConsumer.getLanguageClient();
-        const response = await client.sendRequest(GetRunspaceRequestType, { processId });
+        const response = await client.sendRequest(GetRunspaceRequestType, {
+            processId,
+        });
         const items: IRunspaceItem[] = [];
         for (const runspace of response) {
             items.push({
@@ -604,67 +771,85 @@ export class DebugSessionFeature extends LanguageClientConsumer
     }
 }
 
-class PowerShellDebugAdapterTrackerFactory implements DebugAdapterTrackerFactory, Disposable {
+class PowerShellDebugAdapterTrackerFactory
+    implements DebugAdapterTrackerFactory, Disposable
+{
     disposables: Disposable[] = [];
-    dapLogEnabled: boolean = workspace.getConfiguration("powershell").get<boolean>("trace.dap") ?? false;
-    constructor(private adapterName = "PowerShell") {
-        this.disposables.push(workspace.onDidChangeConfiguration(change => {
-            if (
-                change.affectsConfiguration("powershell.trace.dap")
-            ) {
-                this.dapLogEnabled = workspace.getConfiguration("powershell").get<boolean>("trace.dap") ?? false;
-                if (this.dapLogEnabled) {
-                    // Trigger the output pane to appear. This gives the user time to position it before starting a debug.
-                    this.log?.show(true);
-                }
-            }
-        }));
-    }
+    constructor(private adapterName = "PowerShell") {}
 
-    /* We want to use a shared output log for separate debug sessions as usually only one is running at a time and we
-    *  dont need an output window for every debug session. We also want to leave it active so user can copy and paste
-    *  even on run end. When user changes the setting and disables it getter will return undefined, which will result
-    * in a noop for the logging activities, effectively pausing logging but not disposing the output channel. If the
-    * user re-enables, then logging resumes.
-    */
     _log: LogOutputChannel | undefined;
+    /** Lazily creates a {@link LogOutputChannel} for debug tracing, and presents it only when DAP logging is enabled.
+     *
+     * We want to use a shared output log for separate debug sessions as usually only one is running at a time and we
+     * dont need an output window for every debug session. We also want to leave it active so user can copy and paste
+     * even on run end. When user changes the setting and disables it getter will return undefined, which will result
+     * in a noop for the logging activities, effectively pausing logging but not disposing the output channel. If the
+     * user re-enables, then logging resumes.
+     */
     get log(): LogOutputChannel | undefined {
-        if (this.dapLogEnabled && this._log === undefined) {
-            this._log = window.createOutputChannel(`${this.adapterName} Trace - DAP`, { log: true });
+        if (
+            workspace
+                .getConfiguration("powershell.developer")
+                .get<boolean>("traceDap") &&
+            this._log === undefined
+        ) {
+            this._log = window.createOutputChannel(
+                `${this.adapterName}: Trace DAP`,
+                { log: true },
+            );
             this.disposables.push(this._log);
         }
-        return this.dapLogEnabled ? this._log : undefined;
+        return this._log;
     }
 
+    // This tracker effectively implements the logging for the debug adapter to a LogOutputChannel
     createDebugAdapterTracker(session: DebugSession): DebugAdapterTracker {
         const sessionInfo = `${this.adapterName} Debug Session: ${session.name} [${session.id}]`;
         return {
-            onWillStartSession: () => this.log?.info(`Starting ${sessionInfo}. Set log level to trace to see DAP messages beyond errors`),
+            onWillStartSession: () =>
+                this.log?.info(
+                    `Starting ${sessionInfo}. Set log level to trace to see DAP messages beyond errors`,
+                ),
             onWillStopSession: () => this.log?.info(`Stopping ${sessionInfo}`),
-            onExit: code => this.log?.info(`${sessionInfo} exited with code ${code}`),
+            onExit: (code) =>
+                this.log?.info(`${sessionInfo} exited with code ${code}`),
             onWillReceiveMessage: (m): void => {
-                this.log?.debug(`▶️${m.seq} ${m.type}: ${m.command}`);
-                if (m.arguments && (Array.isArray(m.arguments) ? m.arguments.length > 0 : Object.keys(m.arguments).length > 0)) {
-                    this.log?.trace(`${m.seq}: ` + JSON.stringify(m.arguments, undefined, 2));
+                this.log?.debug(`➡️${m.seq} ${m.type}: ${m.command}`);
+                if (
+                    m.arguments &&
+                    (Array.isArray(m.arguments)
+                        ? m.arguments.length > 0
+                        : Object.keys(m.arguments).length > 0)
+                ) {
+                    this.log?.trace(
+                        `${m.seq}: ` +
+                            JSON.stringify(m.arguments, undefined, 2),
+                    );
                 }
             },
-            onDidSendMessage: (m):void => {
-                const responseSummary = m.request_seq !== undefined
-                    ? `${m.success ? "✅" : "❌"}${m.request_seq} ${m.type}(${m.seq}): ${m.command}`
-                    : `◀️${m.seq} ${m.type}: ${m.event ?? m.command}`;
-                this.log?.debug(
-                    responseSummary
-                );
-                if (m.body && (Array.isArray(m.body) ? m.body.length > 0 : Object.keys(m.body).length > 0)) {
-                    this.log?.trace(`${m.seq}: ` + JSON.stringify(m.body, undefined, 2));
+            onDidSendMessage: (m): void => {
+                const responseSummary =
+                    m.request_seq !== undefined
+                        ? `${m.success ? "✅" : "❌"}${m.request_seq} ${m.type}(${m.seq}): ${m.command}`
+                        : `⬅️${m.seq} ${m.type}: ${m.event ?? m.command}`;
+                this.log?.debug(responseSummary);
+                if (
+                    m.body &&
+                    (Array.isArray(m.body)
+                        ? m.body.length > 0
+                        : Object.keys(m.body).length > 0)
+                ) {
+                    this.log?.trace(
+                        `${m.seq}: ` + JSON.stringify(m.body, undefined, 2),
+                    );
                 }
             },
-            onError: e => this.log?.error(e),
+            onError: (e) => this.log?.error(e),
         };
     }
 
     dispose(): void {
-        this.disposables.forEach(d => d.dispose());
+        this.disposables.forEach((d) => d.dispose());
     }
 }
 
@@ -675,9 +860,12 @@ export class SpecifyScriptArgsFeature implements Disposable {
     constructor(context: ExtensionContext) {
         this.context = context;
 
-        this.command = commands.registerCommand("PowerShell.SpecifyScriptArgs", () => {
-            return this.specifyScriptArguments();
-        });
+        this.command = commands.registerCommand(
+            "PowerShell.SpecifyScriptArgs",
+            () => {
+                return this.specifyScriptArguments();
+            },
+        );
     }
 
     public dispose(): void {
@@ -689,10 +877,14 @@ export class SpecifyScriptArgsFeature implements Disposable {
 
         const options: InputBoxOptions = {
             ignoreFocusOut: true,
-            placeHolder: "Enter script arguments or leave empty to pass no args",
+            placeHolder:
+                "Enter script arguments or leave empty to pass no args",
         };
 
-        const prevArgs = this.context.workspaceState.get(powerShellDbgScriptArgsKey, "");
+        const prevArgs = this.context.workspaceState.get(
+            powerShellDbgScriptArgsKey,
+            "",
+        );
         if (prevArgs.length > 0) {
             options.value = prevArgs;
         }
@@ -701,7 +893,10 @@ export class SpecifyScriptArgsFeature implements Disposable {
         // When user cancel's the input box (by pressing Esc), the text value is undefined.
         // Let's not blow away the previous setting.
         if (text !== undefined) {
-            await this.context.workspaceState.update(powerShellDbgScriptArgsKey, text);
+            await this.context.workspaceState.update(
+                powerShellDbgScriptArgsKey,
+                text,
+            );
         }
 
         return text;
@@ -712,9 +907,7 @@ interface IProcessItem extends QuickPickItem {
     processId: number; // payload for the QuickPick UI
 }
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-interface IGetPSHostProcessesArguments {
-}
+interface IGetPSHostProcessesArguments {}
 
 interface IPSHostProcessInfo {
     processName: string;
@@ -723,17 +916,17 @@ interface IPSHostProcessInfo {
     mainWindowTitle: string;
 }
 
-export const GetPSHostProcessesRequestType =
-    new RequestType<IGetPSHostProcessesArguments, IPSHostProcessInfo[], string>("powerShell/getPSHostProcesses");
-
+export const GetPSHostProcessesRequestType = new RequestType<
+    IGetPSHostProcessesArguments,
+    IPSHostProcessInfo[],
+    string
+>("powerShell/getPSHostProcesses");
 
 interface IRunspaceItem extends QuickPickItem {
     id: number; // payload for the QuickPick UI
 }
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-interface IGetRunspaceRequestArguments {
-}
+interface IGetRunspaceRequestArguments {}
 
 interface IRunspace {
     id: number;
@@ -741,5 +934,8 @@ interface IRunspace {
     availability: string;
 }
 
-export const GetRunspaceRequestType =
-    new RequestType<IGetRunspaceRequestArguments, IRunspace[], string>("powerShell/getRunspace");
+export const GetRunspaceRequestType = new RequestType<
+    IGetRunspaceRequestArguments,
+    IRunspace[],
+    string
+>("powerShell/getRunspace");
diff --git a/src/features/Examples.ts b/src/features/Examples.ts
index 8dcddbeb79..d3c0b0da56 100644
--- a/src/features/Examples.ts
+++ b/src/features/Examples.ts
@@ -2,7 +2,7 @@
 // Licensed under the MIT License.
 
 import path = require("path");
-import utils = require("../utils")
+import utils = require("../utils");
 import vscode = require("vscode");
 
 export class ExamplesFeature implements vscode.Disposable {
@@ -10,13 +10,22 @@ export class ExamplesFeature implements vscode.Disposable {
     private examplesPath: vscode.Uri;
 
     constructor() {
-        this.examplesPath = vscode.Uri.file(path.resolve(__dirname, "../examples"));
-        this.command = vscode.commands.registerCommand("PowerShell.OpenExamplesFolder", async () => {
-            await vscode.commands.executeCommand("vscode.openFolder", this.examplesPath, true);
-            // Return existence of the path for testing. The `vscode.openFolder`
-            // command should do this, but doesn't (yet).
-            return utils.checkIfFileExists(this.examplesPath);
-        });
+        this.examplesPath = vscode.Uri.file(
+            path.resolve(__dirname, "../examples"),
+        );
+        this.command = vscode.commands.registerCommand(
+            "PowerShell.OpenExamplesFolder",
+            async () => {
+                await vscode.commands.executeCommand(
+                    "vscode.openFolder",
+                    this.examplesPath,
+                    true,
+                );
+                // Return existence of the path for testing. The `vscode.openFolder`
+                // command should do this, but doesn't (yet).
+                return utils.checkIfFileExists(this.examplesPath);
+            },
+        );
     }
 
     public dispose(): void {
diff --git a/src/features/ExpandAlias.ts b/src/features/ExpandAlias.ts
index 94ad8f95ab..45e86be7e1 100644
--- a/src/features/ExpandAlias.ts
+++ b/src/features/ExpandAlias.ts
@@ -3,57 +3,76 @@
 
 import vscode = require("vscode");
 import { RequestType } from "vscode-languageclient";
-import { LanguageClientConsumer } from "../languageClientConsumer";
 import type { LanguageClient } from "vscode-languageclient/node";
+import { LanguageClientConsumer } from "../languageClientConsumer";
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-interface IExpandAliasRequestArguments {
-}
+interface IExpandAliasRequestArguments {}
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
 interface IExpandAliasRequestResponse {
-    text: string
+    text: string;
 }
 
-export const ExpandAliasRequestType = new RequestType<IExpandAliasRequestArguments, IExpandAliasRequestResponse, void>("powerShell/expandAlias");
+export const ExpandAliasRequestType = new RequestType<
+    IExpandAliasRequestArguments,
+    IExpandAliasRequestResponse,
+    void
+>("powerShell/expandAlias");
 
 export class ExpandAliasFeature extends LanguageClientConsumer {
     private command: vscode.Disposable;
 
     constructor() {
         super();
-        this.command = vscode.commands.registerCommand("PowerShell.ExpandAlias", async () => {
-            const editor = vscode.window.activeTextEditor;
-            if (editor === undefined) {
-                return;
-            }
-
-            const document = editor.document;
-            const selection = editor.selection;
-            const sls = selection.start;
-            const sle = selection.end;
-
-            let text: string;
-            let range: vscode.Range | vscode.Position;
-
-            if ((sls.character === sle.character) && (sls.line === sle.line)) {
-                text = document.getText();
-                range = new vscode.Range(0, 0, document.lineCount, text.length);
-            } else {
-                text = document.getText(selection);
-                range = new vscode.Range(sls.line, sls.character, sle.line, sle.character);
-            }
-
-            const client = await LanguageClientConsumer.getLanguageClient();
-            const result = await client.sendRequest(ExpandAliasRequestType, { text });
-            await editor.edit((editBuilder) => {
-                editBuilder.replace(range, result.text);
-            });
-        });
+        this.command = vscode.commands.registerCommand(
+            "PowerShell.ExpandAlias",
+            async () => {
+                const editor = vscode.window.activeTextEditor;
+                if (editor === undefined) {
+                    return;
+                }
+
+                const document = editor.document;
+                const selection = editor.selection;
+                const sls = selection.start;
+                const sle = selection.end;
+
+                let text: string;
+                let range: vscode.Range | vscode.Position;
+
+                if (sls.character === sle.character && sls.line === sle.line) {
+                    text = document.getText();
+                    range = new vscode.Range(
+                        0,
+                        0,
+                        document.lineCount,
+                        text.length,
+                    );
+                } else {
+                    text = document.getText(selection);
+                    range = new vscode.Range(
+                        sls.line,
+                        sls.character,
+                        sle.line,
+                        sle.character,
+                    );
+                }
+
+                const client = await LanguageClientConsumer.getLanguageClient();
+                const result = await client.sendRequest(
+                    ExpandAliasRequestType,
+                    { text },
+                );
+                await editor.edit((editBuilder) => {
+                    editBuilder.replace(range, result.text);
+                });
+            },
+        );
     }
 
-    // eslint-disable-next-line @typescript-eslint/no-empty-function
-    public override onLanguageClientSet(_languageClient: LanguageClient): void {}
+    public override onLanguageClientSet(
+        _languageClient: LanguageClient,
+        // eslint-disable-next-line @typescript-eslint/no-empty-function
+    ): void {}
 
     public dispose(): void {
         this.command.dispose();
diff --git a/src/features/ExtensionCommands.ts b/src/features/ExtensionCommands.ts
index c0f4804c78..c4ca7203b0 100644
--- a/src/features/ExtensionCommands.ts
+++ b/src/features/ExtensionCommands.ts
@@ -4,13 +4,16 @@
 import * as path from "path";
 import * as vscode from "vscode";
 import {
-    NotificationType, NotificationType0,
-    Position, Range, RequestType
+    NotificationType,
+    NotificationType0,
+    Position,
+    Range,
+    RequestType,
 } from "vscode-languageclient";
 import { LanguageClient } from "vscode-languageclient/node";
-import { ILogger } from "../logging";
-import { getSettings, validateCwdSetting } from "../settings";
 import { LanguageClientConsumer } from "../languageClientConsumer";
+import type { ILogger } from "../logging";
+import { getSettings, validateCwdSetting } from "../settings";
 import { DebugConfig, DebugConfigurations } from "./DebugSession";
 
 export interface IExtensionCommand {
@@ -22,9 +25,11 @@ export interface IExtensionCommandQuickPickItem extends vscode.QuickPickItem {
     command: IExtensionCommand;
 }
 
-export const InvokeExtensionCommandRequestType =
-    new RequestType<IInvokeExtensionCommandRequestArguments, void, void>(
-        "powerShell/invokeExtensionCommand");
+export const InvokeExtensionCommandRequestType = new RequestType<
+    IInvokeExtensionCommandRequestArguments,
+    void,
+    void
+>("powerShell/invokeExtensionCommand");
 
 export interface IEditorContext {
     currentFileContent: string;
@@ -41,7 +46,8 @@ export interface IInvokeExtensionCommandRequestArguments {
 
 export const ExtensionCommandAddedNotificationType =
     new NotificationType<IExtensionCommandAddedNotificationBody>(
-        "powerShell/extensionCommandAdded");
+        "powerShell/extensionCommandAdded",
+    );
 
 export interface IExtensionCommandAddedNotificationBody {
     name: string;
@@ -60,24 +66,26 @@ function asCodePosition(value: Position): vscode.Position {
     return new vscode.Position(value.line, value.character);
 }
 
-export const GetEditorContextRequestType =
-    new RequestType<IGetEditorContextRequestArguments, IEditorContext, void>(
-        "editor/getEditorContext");
+export const GetEditorContextRequestType = new RequestType<
+    IGetEditorContextRequestArguments,
+    IEditorContext,
+    void
+>("editor/getEditorContext");
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-export interface IGetEditorContextRequestArguments {
-}
+export interface IGetEditorContextRequestArguments {}
 
 // NOTE: The server at least now expects this response, but it's not used in any
 // way. In the future we could actually communicate an error to the user.
 enum EditorOperationResponse {
     Completed,
-    Failed
+    Failed,
 }
 
-export const InsertTextRequestType =
-    new RequestType<IInsertTextRequestArguments, EditorOperationResponse, void>(
-        "editor/insertText");
+export const InsertTextRequestType = new RequestType<
+    IInsertTextRequestArguments,
+    EditorOperationResponse,
+    void
+>("editor/insertText");
 
 export interface IInsertTextRequestArguments {
     filePath: string;
@@ -85,53 +93,72 @@ export interface IInsertTextRequestArguments {
     insertRange: Range;
 }
 
-export const SetSelectionRequestType =
-    new RequestType<ISetSelectionRequestArguments, EditorOperationResponse, void>(
-        "editor/setSelection");
+export const SetSelectionRequestType = new RequestType<
+    ISetSelectionRequestArguments,
+    EditorOperationResponse,
+    void
+>("editor/setSelection");
 
 export interface ISetSelectionRequestArguments {
     selectionRange: Range;
 }
 
-export const OpenFileRequestType =
-    new RequestType<IOpenFileDetails, EditorOperationResponse, void>(
-        "editor/openFile");
+export const OpenFileRequestType = new RequestType<
+    IOpenFileDetails,
+    EditorOperationResponse,
+    void
+>("editor/openFile");
 
 export interface IOpenFileDetails {
     filePath: string;
     preview: boolean;
 }
 
-export const NewFileRequestType =
-    new RequestType<string, EditorOperationResponse, void>(
-        "editor/newFile");
-
-export const CloseFileRequestType =
-    new RequestType<string, EditorOperationResponse, void>(
-        "editor/closeFile");
-
-export const SaveFileRequestType =
-    new RequestType<ISaveFileDetails, EditorOperationResponse, void>(
-        "editor/saveFile");
-
-export const ShowErrorMessageRequestType =
-    new RequestType<string, EditorOperationResponse, void>(
-        "editor/showErrorMessage");
-
-export const ShowWarningMessageRequestType =
-    new RequestType<string, EditorOperationResponse, void>(
-        "editor/showWarningMessage");
-
-export const ShowInformationMessageRequestType =
-    new RequestType<string, EditorOperationResponse, void>(
-        "editor/showInformationMessage");
-
-export const SetStatusBarMessageRequestType =
-    new RequestType<IStatusBarMessageDetails, EditorOperationResponse, void>(
-        "editor/setStatusBarMessage");
-
-export const ClearTerminalNotificationType =
-    new NotificationType0("editor/clearTerminal");
+export const NewFileRequestType = new RequestType<
+    string,
+    EditorOperationResponse,
+    void
+>("editor/newFile");
+
+export const CloseFileRequestType = new RequestType<
+    string,
+    EditorOperationResponse,
+    void
+>("editor/closeFile");
+
+export const SaveFileRequestType = new RequestType<
+    ISaveFileDetails,
+    EditorOperationResponse,
+    void
+>("editor/saveFile");
+
+export const ShowErrorMessageRequestType = new RequestType<
+    string,
+    EditorOperationResponse,
+    void
+>("editor/showErrorMessage");
+
+export const ShowWarningMessageRequestType = new RequestType<
+    string,
+    EditorOperationResponse,
+    void
+>("editor/showWarningMessage");
+
+export const ShowInformationMessageRequestType = new RequestType<
+    string,
+    EditorOperationResponse,
+    void
+>("editor/showInformationMessage");
+
+export const SetStatusBarMessageRequestType = new RequestType<
+    IStatusBarMessageDetails,
+    EditorOperationResponse,
+    void
+>("editor/setStatusBarMessage");
+
+export const ClearTerminalNotificationType = new NotificationType0(
+    "editor/clearTerminal",
+);
 
 export interface ISaveFileDetails {
     filePath: string;
@@ -156,40 +183,70 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
     constructor(private logger: ILogger) {
         super();
         this.commands = [
-            vscode.commands.registerCommand("PowerShell.ShowAdditionalCommands", async () => {
-                await this.showExtensionCommands();
-            }),
+            vscode.commands.registerCommand(
+                "PowerShell.ShowAdditionalCommands",
+                async () => {
+                    await this.showExtensionCommands();
+                },
+            ),
 
-            vscode.commands.registerCommand("PowerShell.InvokeRegisteredEditorCommand",
+            vscode.commands.registerCommand(
+                "PowerShell.InvokeRegisteredEditorCommand",
                 async (param: IInvokeRegisteredEditorCommandParameter) => {
                     const commandToExecute = this.extensionCommands.find(
-                        (x) => x.name === param.commandName);
+                        (x) => x.name === param.commandName,
+                    );
 
                     if (commandToExecute) {
-
-                        const client = await LanguageClientConsumer.getLanguageClient();
+                        const client =
+                            await LanguageClientConsumer.getLanguageClient();
                         await client.sendRequest(
                             InvokeExtensionCommandRequestType,
                             {
                                 name: commandToExecute.name,
-                                context: this.getEditorContext()
-                            });
+                                context: this.getEditorContext(),
+                            },
+                        );
                     }
-                }),
-
-            vscode.commands.registerCommand("PowerShell.ClosePanel",
-                async () => { await vscode.commands.executeCommand("workbench.action.togglePanel"); }),
-
-            vscode.commands.registerCommand("PowerShell.PositionPanelLeft",
-                async () => { await vscode.commands.executeCommand("workbench.action.positionPanelLeft"); }),
+                },
+            ),
 
-            vscode.commands.registerCommand("PowerShell.PositionPanelBottom",
-                async () => { await vscode.commands.executeCommand("workbench.action.positionPanelBottom"); }),
-
-            vscode.commands.registerCommand("PowerShell.Debug.Start",
+            vscode.commands.registerCommand(
+                "PowerShell.ClosePanel",
+                async () => {
+                    await vscode.commands.executeCommand(
+                        "workbench.action.togglePanel",
+                    );
+                },
+            ),
+
+            vscode.commands.registerCommand(
+                "PowerShell.PositionPanelLeft",
+                async () => {
+                    await vscode.commands.executeCommand(
+                        "workbench.action.positionPanelLeft",
+                    );
+                },
+            ),
+
+            vscode.commands.registerCommand(
+                "PowerShell.PositionPanelBottom",
                 async () => {
-                    await vscode.debug.startDebugging(undefined, DebugConfigurations[DebugConfig.LaunchCurrentFile]);
-                })
+                    await vscode.commands.executeCommand(
+                        "workbench.action.positionPanelBottom",
+                    );
+                },
+            ),
+
+            vscode.commands.registerCommand(
+                "PowerShell.Debug.Start",
+                async () => {
+                    await vscode.debug.startDebugging(
+                        undefined,
+                        DebugConfigurations[DebugConfig.LaunchCurrentFile],
+                    );
+                },
+            ),
         ];
     }
 
@@ -200,61 +257,68 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
         this.handlers = [
             languageClient.onNotification(
                 ExtensionCommandAddedNotificationType,
-                (command) => { this.addExtensionCommand(command); }),
+                (command) => {
+                    this.addExtensionCommand(command);
+                },
+            ),
 
-            languageClient.onRequest(
-                GetEditorContextRequestType,
-                (_details) => this.getEditorContext()),
+            languageClient.onRequest(GetEditorContextRequestType, (_details) =>
+                this.getEditorContext(),
+            ),
 
-            languageClient.onRequest(
-                InsertTextRequestType,
-                (details) => this.insertText(details)),
+            languageClient.onRequest(InsertTextRequestType, (details) =>
+                this.insertText(details),
+            ),
 
-            languageClient.onRequest(
-                SetSelectionRequestType,
-                (details) => this.setSelection(details)),
+            languageClient.onRequest(SetSelectionRequestType, (details) =>
+                this.setSelection(details),
+            ),
 
-            languageClient.onRequest(
-                NewFileRequestType,
-                (_content) => this.newFile(_content)),
+            languageClient.onRequest(NewFileRequestType, (_content) =>
+                this.newFile(_content),
+            ),
 
-            languageClient.onRequest(
-                OpenFileRequestType,
-                (filePath) => this.openFile(filePath)),
+            languageClient.onRequest(OpenFileRequestType, (filePath) =>
+                this.openFile(filePath),
+            ),
 
-            languageClient.onRequest(
-                CloseFileRequestType,
-                (filePath) => this.closeFile(filePath)),
+            languageClient.onRequest(CloseFileRequestType, (filePath) =>
+                this.closeFile(filePath),
+            ),
 
-            languageClient.onRequest(
-                SaveFileRequestType,
-                (saveFileDetails) => this.saveFile(saveFileDetails)),
+            languageClient.onRequest(SaveFileRequestType, (saveFileDetails) =>
+                this.saveFile(saveFileDetails),
+            ),
 
             languageClient.onRequest(
                 ShowInformationMessageRequestType,
-                (message) => this.showInformationMessage(message)),
+                (message) => this.showInformationMessage(message),
+            ),
 
-            languageClient.onRequest(
-                ShowErrorMessageRequestType,
-                (message) => this.showErrorMessage(message)),
+            languageClient.onRequest(ShowErrorMessageRequestType, (message) =>
+                this.showErrorMessage(message),
+            ),
 
-            languageClient.onRequest(
-                ShowWarningMessageRequestType,
-                (message) => this.showWarningMessage(message)),
+            languageClient.onRequest(ShowWarningMessageRequestType, (message) =>
+                this.showWarningMessage(message),
+            ),
 
             languageClient.onRequest(
                 SetStatusBarMessageRequestType,
-                (messageDetails) => this.setStatusBarMessage(messageDetails)),
-
-            languageClient.onNotification(
-                ClearTerminalNotificationType,
-                () => {
-                    // We check to see if they have TrueClear on. If not, no-op because the
-                    // overriden Clear-Host already calls [System.Console]::Clear()
-                    if (getSettings().integratedConsole.forceClearScrollbackBuffer) {
-                        void vscode.commands.executeCommand("workbench.action.terminal.clear");
-                    }
-                })
+                (messageDetails) => this.setStatusBarMessage(messageDetails),
+            ),
+
+            languageClient.onNotification(ClearTerminalNotificationType, () => {
+                // We check to see if they have TrueClear on. If not, no-op because the
+                // overriden Clear-Host already calls [System.Console]::Clear()
+                if (
+                    getSettings().integratedConsole.forceClearScrollbackBuffer
+                ) {
+                    void vscode.commands.executeCommand(
+                        "workbench.action.terminal.clear",
+                    );
+                }
+            }),
         ];
     }
 
@@ -270,7 +334,9 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
         }
     }
 
-    private addExtensionCommand(command: IExtensionCommandAddedNotificationBody): void {
+    private addExtensionCommand(
+        command: IExtensionCommandAddedNotificationBody,
+    ): void {
         this.extensionCommands.push({
             name: command.name,
             displayName: command.displayName,
@@ -278,59 +344,66 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
 
         this.extensionCommands.sort(
             (a: IExtensionCommand, b: IExtensionCommand) =>
-                a.name.localeCompare(b.name));
+                a.name.localeCompare(b.name),
+        );
     }
 
     private async showExtensionCommands(): Promise<void> {
         // If no extension commands are available, show a message
         if (this.extensionCommands.length === 0) {
-            void this.logger.writeAndShowInformation("No extension commands have been loaded into the current session.");
+            void this.logger.writeAndShowInformation(
+                "No extension commands have been loaded into the current session.",
+            );
             return;
         }
 
         const quickPickItems =
-            this.extensionCommands.map<IExtensionCommandQuickPickItem>((command) => {
-                return {
-                    label: command.displayName,
-                    description: command.name,
-                    command,
-                };
-            });
+            this.extensionCommands.map<IExtensionCommandQuickPickItem>(
+                (command) => {
+                    return {
+                        label: command.displayName,
+                        description: command.name,
+                        command,
+                    };
+                },
+            );
 
         const selectedCommand = await vscode.window.showQuickPick(
             quickPickItems,
-            { placeHolder: "Select a command..." });
+            { placeHolder: "Select a command..." },
+        );
 
         return this.onCommandSelected(selectedCommand);
     }
 
-    private async onCommandSelected(chosenItem?: IExtensionCommandQuickPickItem): Promise<void> {
+    private async onCommandSelected(
+        chosenItem?: IExtensionCommandQuickPickItem,
+    ): Promise<void> {
         if (chosenItem !== undefined) {
             const client = await LanguageClientConsumer.getLanguageClient();
-            await client.sendRequest(
-                InvokeExtensionCommandRequestType,
-                {
-                    name: chosenItem.command.name,
-                    context: this.getEditorContext()
-                });
+            await client.sendRequest(InvokeExtensionCommandRequestType, {
+                name: chosenItem.command.name,
+                context: this.getEditorContext(),
+            });
         }
     }
 
-    private async insertText(details: IInsertTextRequestArguments): Promise<EditorOperationResponse> {
+    private async insertText(
+        details: IInsertTextRequestArguments,
+    ): Promise<EditorOperationResponse> {
         const edit = new vscode.WorkspaceEdit();
 
-        edit.set(
-            vscode.Uri.parse(details.filePath),
-            [
-                new vscode.TextEdit(
-                    new vscode.Range(
-                        details.insertRange.start.line,
-                        details.insertRange.start.character,
-                        details.insertRange.end.line,
-                        details.insertRange.end.character),
-                    details.insertText),
-            ],
-        );
+        edit.set(vscode.Uri.parse(details.filePath), [
+            new vscode.TextEdit(
+                new vscode.Range(
+                    details.insertRange.start.line,
+                    details.insertRange.start.character,
+                    details.insertRange.end.line,
+                    details.insertRange.end.character,
+                ),
+                details.insertText,
+            ),
+        ]);
 
         await vscode.workspace.applyEdit(edit);
 
@@ -343,46 +416,70 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
         }
 
         return {
-            currentFileContent: vscode.window.activeTextEditor.document.getText(),
-            currentFileLanguage: vscode.window.activeTextEditor.document.languageId,
-            currentFilePath: vscode.window.activeTextEditor.document.uri.toString(),
-            cursorPosition: asPosition(vscode.window.activeTextEditor.selection.active),
-            selectionRange:
-                asRange(
-                    new vscode.Range(
-                        vscode.window.activeTextEditor.selection.start,
-                        vscode.window.activeTextEditor.selection.end)),
+            currentFileContent:
+                vscode.window.activeTextEditor.document.getText(),
+            currentFileLanguage:
+                vscode.window.activeTextEditor.document.languageId,
+            currentFilePath:
+                vscode.window.activeTextEditor.document.uri.toString(),
+            cursorPosition: asPosition(
+                vscode.window.activeTextEditor.selection.active,
+            ),
+            selectionRange: asRange(
+                new vscode.Range(
+                    vscode.window.activeTextEditor.selection.start,
+                    vscode.window.activeTextEditor.selection.end,
+                ),
+            ),
         };
     }
 
     private async newFile(content: string): Promise<EditorOperationResponse> {
-        const doc = await vscode.workspace.openTextDocument(
-            { language: "powershell", content: content });
+        const doc = await vscode.workspace.openTextDocument({
+            language: "powershell",
+            content: content,
+        });
         await vscode.window.showTextDocument(doc);
         return EditorOperationResponse.Completed;
     }
 
-    private async openFile(openFileDetails: IOpenFileDetails): Promise<EditorOperationResponse> {
-        const filePath = await this.resolveFilePathWithCwd(openFileDetails.filePath);
+    private async openFile(
+        openFileDetails: IOpenFileDetails,
+    ): Promise<EditorOperationResponse> {
+        const filePath = await this.resolveFilePathWithCwd(
+            openFileDetails.filePath,
+        );
         try {
             const doc = await vscode.workspace.openTextDocument(filePath);
-            await vscode.window.showTextDocument(doc, { preview: openFileDetails.preview });
+            await vscode.window.showTextDocument(doc, {
+                preview: openFileDetails.preview,
+            });
         } catch {
-            void this.logger.writeAndShowWarning(`File to open not found: ${filePath}`);
+            void this.logger.writeAndShowWarning(
+                `File to open not found: ${filePath}`,
+            );
             return EditorOperationResponse.Failed;
         }
         return EditorOperationResponse.Completed;
     }
 
-    private async closeFile(filePath: string): Promise<EditorOperationResponse> {
+    private async closeFile(
+        filePath: string,
+    ): Promise<EditorOperationResponse> {
         filePath = await this.resolveFilePathWithCwd(filePath);
-        const doc = vscode.workspace.textDocuments.find((x) => x.uri.fsPath === filePath);
+        const doc = vscode.workspace.textDocuments.find(
+            (x) => x.uri.fsPath === filePath,
+        );
         if (doc != undefined && !doc.isClosed) {
             await vscode.window.showTextDocument(doc);
-            await vscode.commands.executeCommand("workbench.action.closeActiveEditor");
+            await vscode.commands.executeCommand(
+                "workbench.action.closeActiveEditor",
+            );
             return EditorOperationResponse.Completed;
         }
-        void this.logger.writeAndShowWarning(`File to close not found or already closed: ${filePath}`);
+        void this.logger.writeAndShowWarning(
+            `File to close not found or already closed: ${filePath}`,
+        );
         return EditorOperationResponse.Failed;
     }
 
@@ -390,19 +487,30 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
      * Save a file, possibly to a new path. If the save is not possible, return a completed response
      * @param saveFileDetails the object detailing the path of the file to save and optionally its new path to save to
      */
-    private async saveFile(saveFileDetails: ISaveFileDetails): Promise<EditorOperationResponse> {
+    private async saveFile(
+        saveFileDetails: ISaveFileDetails,
+    ): Promise<EditorOperationResponse> {
         // Try to interpret the filePath as a URI, defaulting to "file://" if we don't succeed
         let currentFileUri: vscode.Uri;
-        if (saveFileDetails.filePath.startsWith("untitled") || saveFileDetails.filePath.startsWith("file")) {
+        if (
+            saveFileDetails.filePath.startsWith("untitled") ||
+            saveFileDetails.filePath.startsWith("file")
+        ) {
             currentFileUri = vscode.Uri.parse(saveFileDetails.filePath);
         } else {
-            const filePath = await this.resolveFilePathWithCwd(saveFileDetails.filePath);
+            const filePath = await this.resolveFilePathWithCwd(
+                saveFileDetails.filePath,
+            );
             currentFileUri = vscode.Uri.file(filePath);
         }
 
-        const doc = vscode.workspace.textDocuments.find((x) => x.uri.fsPath === currentFileUri.fsPath);
+        const doc = vscode.workspace.textDocuments.find(
+            (x) => x.uri.fsPath === currentFileUri.fsPath,
+        );
         if (doc === undefined) {
-            void this.logger.writeAndShowWarning(`File to save not found: ${currentFileUri.fsPath}`);
+            void this.logger.writeAndShowWarning(
+                `File to save not found: ${currentFileUri.fsPath}`,
+            );
             return EditorOperationResponse.Failed;
         }
 
@@ -419,12 +527,17 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
             // Special case where we interpret a path as relative to the current
             // file, not the CWD!
             if (!path.isAbsolute(newFilePath)) {
-                newFilePath = path.join(path.dirname(currentFileUri.fsPath), newFilePath);
+                newFilePath = path.join(
+                    path.dirname(currentFileUri.fsPath),
+                    newFilePath,
+                );
             }
         } else if (currentFileUri.scheme === "untitled") {
             // We need a new name to save an untitled file
             if (newFilePath === undefined) {
-                void this.logger.writeAndShowWarning("Cannot save untitled file! Try SaveAs(\"path/to/file.ps1\") instead.");
+                void this.logger.writeAndShowWarning(
+                    'Cannot save untitled file! Try SaveAs("path/to/file.ps1") instead.',
+                );
                 return EditorOperationResponse.Failed;
             }
 
@@ -434,7 +547,8 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
             const msg = JSON.stringify(saveFileDetails, undefined, 2);
             void this.logger.writeAndShowWarning(
                 `<${ExtensionCommandsFeature.name}>: Saving a document with scheme '${currentFileUri.scheme}' ` +
-                `is currently unsupported. Message: '${msg}'`);
+                    `is currently unsupported. Message: '${msg}'`,
+            );
             return EditorOperationResponse.Failed;
         }
 
@@ -446,16 +560,22 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
      * @param documentUri the URI of the vscode document to save
      * @param filePath the absolute path to save the document contents to
      */
-    private async saveFileAs(doc: vscode.TextDocument, filePath: string): Promise<EditorOperationResponse> {
+    private async saveFileAs(
+        doc: vscode.TextDocument,
+        filePath: string,
+    ): Promise<EditorOperationResponse> {
         // Write the old document's contents to the new document path
         const newFileUri = vscode.Uri.file(filePath);
         try {
             await vscode.workspace.fs.writeFile(
                 newFileUri,
-                Buffer.from(doc.getText()));
+                Buffer.from(doc.getText()),
+            );
         } catch (err) {
-            void this.logger.writeAndShowWarning(`<${ExtensionCommandsFeature.name}>: ` +
-                `Unable to save file to path '${filePath}': ${err}`);
+            void this.logger.writeAndShowWarning(
+                `<${ExtensionCommandsFeature.name}>: ` +
+                    `Unable to save file to path '${filePath}': ${err}`,
+            );
             return EditorOperationResponse.Failed;
         }
 
@@ -474,12 +594,15 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
         return filePath;
     }
 
-    private setSelection(details: ISetSelectionRequestArguments): EditorOperationResponse {
+    private setSelection(
+        details: ISetSelectionRequestArguments,
+    ): EditorOperationResponse {
         if (vscode.window.activeTextEditor !== undefined) {
             vscode.window.activeTextEditor.selections = [
                 new vscode.Selection(
                     asCodePosition(details.selectionRange.start),
-                    asCodePosition(details.selectionRange.end)),
+                    asCodePosition(details.selectionRange.end),
+                ),
             ];
             return EditorOperationResponse.Completed;
         }
@@ -501,13 +624,20 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
         return EditorOperationResponse.Completed;
     }
 
-    private setStatusBarMessage(messageDetails: IStatusBarMessageDetails): EditorOperationResponse {
+    private setStatusBarMessage(
+        messageDetails: IStatusBarMessageDetails,
+    ): EditorOperationResponse {
         if (messageDetails.timeout) {
             this.statusBarMessages.push(
-                vscode.window.setStatusBarMessage(messageDetails.message, messageDetails.timeout));
+                vscode.window.setStatusBarMessage(
+                    messageDetails.message,
+                    messageDetails.timeout,
+                ),
+            );
         } else {
             this.statusBarMessages.push(
-                vscode.window.setStatusBarMessage(messageDetails.message));
+                vscode.window.setStatusBarMessage(messageDetails.message),
+            );
         }
         return EditorOperationResponse.Completed;
     }
diff --git a/src/features/ExternalApi.ts b/src/features/ExternalApi.ts
index 7943bf8fa6..cafd856c26 100644
--- a/src/features/ExternalApi.ts
+++ b/src/features/ExternalApi.ts
@@ -1,9 +1,9 @@
 // Copyright (c) Microsoft Corporation.
 // Licensed under the MIT License.
 
-import * as vscode from "vscode";
 import { v4 as uuidv4 } from "uuid";
-import { ILogger } from "../logging";
+import * as vscode from "vscode";
+import type { ILogger } from "../logging";
 import { SessionManager } from "../session";
 
 export interface IExternalPowerShellDetails {
@@ -16,9 +16,12 @@ export interface IExternalPowerShellDetails {
 export interface IPowerShellExtensionClient {
     registerExternalExtension(id: string, apiVersion?: string): string;
     unregisterExternalExtension(uuid: string): boolean;
-    getPowerShellVersionDetails(uuid: string): Promise<IExternalPowerShellDetails>;
+    getPowerShellVersionDetails(
+        uuid: string,
+    ): Promise<IExternalPowerShellDetails>;
     waitUntilStarted(uuid: string): Promise<void>;
     getStorageUri(): vscode.Uri;
+    getLogUri(): vscode.Uri;
 }
 
 /*
@@ -33,13 +36,16 @@ NOTE: At some point, we should release a helper npm package that wraps the API a
 
 */
 export class ExternalApiFeature implements IPowerShellExtensionClient {
-    private static readonly registeredExternalExtension: Map<string, IExternalExtension> = new Map<string, IExternalExtension>();
+    private static readonly registeredExternalExtension: Map<
+        string,
+        IExternalExtension
+    > = new Map<string, IExternalExtension>();
 
     constructor(
         private extensionContext: vscode.ExtensionContext,
         private sessionManager: SessionManager,
-        private logger: ILogger) {
-    }
+        private logger: ILogger,
+    ) {}
 
     /*
     DESCRIPTION:
@@ -55,10 +61,14 @@ export class ExternalApiFeature implements IPowerShellExtensionClient {
         string session uuid
     */
     public registerExternalExtension(id: string, apiVersion = "v1"): string {
-        this.logger.writeVerbose(`Registering extension '${id}' for use with API version '${apiVersion}'.`);
-
-        // eslint-disable-next-line @typescript-eslint/no-unused-vars
-        for (const [_name, externalExtension] of ExternalApiFeature.registeredExternalExtension) {
+        this.logger.writeDebug(
+            `Registering extension '${id}' for use with API version '${apiVersion}'.`,
+        );
+
+        for (const [
+            _name,
+            externalExtension,
+        ] of ExternalApiFeature.registeredExternalExtension) {
             if (externalExtension.id === id) {
                 const message = `The extension '${id}' is already registered.`;
                 this.logger.writeWarning(message);
@@ -66,19 +76,26 @@ export class ExternalApiFeature implements IPowerShellExtensionClient {
             }
         }
 
-        if (!vscode.extensions.all.some(ext => ext.id === id)) {
-            throw new Error(`No extension installed with id '${id}'. You must use a valid extension id.`);
+        if (!vscode.extensions.all.some((ext) => ext.id === id)) {
+            throw new Error(
+                `No extension installed with id '${id}'. You must use a valid extension id.`,
+            );
         }
 
         // Our ID is only only allowed to be used in our unit tests.
-        if (id === "ms-vscode.powershell" && !(this.extensionContext.extensionMode === vscode.ExtensionMode.Test)) {
-            throw new Error("You can't use the PowerShell extension's id in this registration.");
+        if (
+            id === "ms-vscode.powershell" &&
+            !(this.extensionContext.extensionMode === vscode.ExtensionMode.Test)
+        ) {
+            throw new Error(
+                "You can't use the PowerShell extension's id in this registration.",
+            );
         }
 
         const uuid = uuidv4();
         ExternalApiFeature.registeredExternalExtension.set(uuid, {
             id,
-            apiVersion
+            apiVersion,
         });
         return uuid;
     }
@@ -96,9 +113,13 @@ export class ExternalApiFeature implements IPowerShellExtensionClient {
         true if it worked, otherwise throws an error.
     */
     public unregisterExternalExtension(uuid = ""): boolean {
-        this.logger.writeVerbose(`Unregistering extension with session UUID: ${uuid}`);
+        this.logger.writeDebug(
+            `Unregistering extension with session UUID: ${uuid}`,
+        );
         if (!ExternalApiFeature.registeredExternalExtension.delete(uuid)) {
-            throw new Error(`No extension registered with session UUID: ${uuid}`);
+            throw new Error(
+                `No extension registered with session UUID: ${uuid}`,
+            );
         }
         return true;
     }
@@ -106,7 +127,8 @@ export class ExternalApiFeature implements IPowerShellExtensionClient {
     private getRegisteredExtension(uuid = ""): IExternalExtension {
         if (!ExternalApiFeature.registeredExternalExtension.has(uuid)) {
             throw new Error(
-                "UUID provided was invalid, make sure you ran the 'powershellExtensionClient.registerExternalExtension(extensionId)' method and pass in the UUID that it returns to subsequent methods.");
+                "UUID provided was invalid, make sure you ran the 'powershellExtensionClient.registerExternalExtension(extensionId)' method and pass in the UUID that it returns to subsequent methods.",
+            );
         }
 
         // TODO: When we have more than one API version, make sure to include a check here.
@@ -131,18 +153,26 @@ export class ExternalApiFeature implements IPowerShellExtensionClient {
             architecture: string;
         }
     */
-    public async getPowerShellVersionDetails(uuid = ""): Promise<IExternalPowerShellDetails> {
+    public async getPowerShellVersionDetails(
+        uuid = "",
+    ): Promise<IExternalPowerShellDetails> {
         const extension = this.getRegisteredExtension(uuid);
-        this.logger.writeVerbose(`Extension '${extension.id}' called 'getPowerShellVersionDetails'.`);
+        this.logger.writeDebug(
+            `Extension '${extension.id}' called 'getPowerShellVersionDetails'.`,
+        );
 
         await this.sessionManager.waitUntilStarted();
-        const versionDetails = this.sessionManager.getPowerShellVersionDetails();
+        const versionDetails =
+            this.sessionManager.getPowerShellVersionDetails();
 
         return {
-            exePath: this.sessionManager.PowerShellExeDetails?.exePath ?? "unknown",
+            exePath:
+                this.sessionManager.PowerShellExeDetails?.exePath ?? "unknown",
             version: versionDetails?.version ?? "unknown",
-            displayName: this.sessionManager.PowerShellExeDetails?.displayName ?? "unknown", // comes from the Session Menu
-            architecture: versionDetails?.architecture ?? "unknown"
+            displayName:
+                this.sessionManager.PowerShellExeDetails?.displayName ??
+                "unknown", // comes from the Session Menu
+            architecture: versionDetails?.architecture ?? "unknown",
         };
     }
     /*
@@ -161,14 +191,20 @@ export class ExternalApiFeature implements IPowerShellExtensionClient {
     */
     public async waitUntilStarted(uuid = ""): Promise<void> {
         const extension = this.getRegisteredExtension(uuid);
-        this.logger.writeVerbose(`Extension '${extension.id}' called 'waitUntilStarted'.`);
+        this.logger.writeDebug(
+            `Extension '${extension.id}' called 'waitUntilStarted'.`,
+        );
         await this.sessionManager.waitUntilStarted();
     }
 
     public getStorageUri(): vscode.Uri {
         // We have to override the scheme because it defaults to
         // 'vscode-userdata' which breaks UNC paths.
-        return this.extensionContext.globalStorageUri.with({ scheme: "file"});
+        return this.extensionContext.globalStorageUri.with({ scheme: "file" });
+    }
+
+    public getLogUri(): vscode.Uri {
+        return this.extensionContext.logUri.with({ scheme: "file" });
     }
 
     public dispose(): void {
diff --git a/src/features/GenerateBugReport.ts b/src/features/GenerateBugReport.ts
index 4ec7cec571..6539f978d9 100644
--- a/src/features/GenerateBugReport.ts
+++ b/src/features/GenerateBugReport.ts
@@ -8,21 +8,30 @@ import { SessionManager } from "../session";
 const issuesUrl = "https://github.com/PowerShell/vscode-powershell/issues/new?";
 
 export class GenerateBugReportFeature implements vscode.Disposable {
-
     private command: vscode.Disposable;
 
     constructor(private sessionManager: SessionManager) {
-        this.command = vscode.commands.registerCommand("PowerShell.GenerateBugReport", async () => {
-            const params = [
-                "labels=Issue-Bug",
-                "template=bug-report.yml",
-                "powershell-version=" + this.getRuntimeInfo(),
-                "vscode-version=" + vscode.version + "\n" + process.arch,
-                "extension-version=" + sessionManager.Publisher + "." + sessionManager.HostName + "@" + sessionManager.HostVersion,
-            ];
-            const url = vscode.Uri.parse(issuesUrl + encodeURIComponent(params.join("&")));
-            await vscode.env.openExternal(url);
-        });
+        this.command = vscode.commands.registerCommand(
+            "PowerShell.GenerateBugReport",
+            async () => {
+                const params = [
+                    "labels=Issue-Bug",
+                    "template=bug-report.yml",
+                    "powershell-version=" + this.getRuntimeInfo(),
+                    "vscode-version=" + vscode.version + "\n" + process.arch,
+                    "extension-version=" +
+                        sessionManager.Publisher +
+                        "." +
+                        sessionManager.HostName +
+                        "@" +
+                        sessionManager.HostVersion,
+                ];
+                const url = vscode.Uri.parse(
+                    issuesUrl + encodeURIComponent(params.join("&")),
+                );
+                await vscode.env.openExternal(url);
+            },
+        );
     }
 
     public dispose(): void {
@@ -35,7 +44,13 @@ export class GenerateBugReportFeature implements vscode.Disposable {
         }
         const child = child_process.spawnSync(
             this.sessionManager.PowerShellExeDetails.exePath,
-            ["-NoProfile", "-NoLogo", "-Command", "$PSVersionTable | Out-String"]);
+            [
+                "-NoProfile",
+                "-NoLogo",
+                "-Command",
+                "$PSVersionTable | Out-String",
+            ],
+        );
         // Replace semicolons as they'll cause the URI component to truncate
         return child.stdout.toString().trim().replace(";", ",");
     }
diff --git a/src/features/GetCommands.ts b/src/features/GetCommands.ts
index f85aad28f8..52d007532e 100644
--- a/src/features/GetCommands.ts
+++ b/src/features/GetCommands.ts
@@ -19,7 +19,9 @@ interface ICommand {
  * RequestType sent over to PSES.
  * Expects: ICommand to be returned
  */
-export const GetCommandRequestType = new RequestType0<ICommand[], void>("powerShell/getCommand");
+export const GetCommandRequestType = new RequestType0<ICommand[], void>(
+    "powerShell/getCommand",
+);
 
 /**
  * A PowerShell Command listing feature. Implements a treeview control.
@@ -32,14 +34,25 @@ export class GetCommandsFeature extends LanguageClientConsumer {
     constructor() {
         super();
         this.commands = [
-            vscode.commands.registerCommand("PowerShell.RefreshCommandsExplorer",
-                async () => { await this.CommandExplorerRefresh(); }),
-            vscode.commands.registerCommand("PowerShell.InsertCommand", async (item) => { await this.InsertCommand(item); })
+            vscode.commands.registerCommand(
+                "PowerShell.RefreshCommandsExplorer",
+                async () => {
+                    await this.CommandExplorerRefresh();
+                },
+            ),
+            vscode.commands.registerCommand(
+                "PowerShell.InsertCommand",
+                async (item) => {
+                    await this.InsertCommand(item);
+                },
+            ),
         ];
         this.commandsExplorerProvider = new CommandsExplorerProvider();
 
-        this.commandsExplorerTreeView = vscode.window.createTreeView<Command>("PowerShellCommands",
-            { treeDataProvider: this.commandsExplorerProvider });
+        this.commandsExplorerTreeView = vscode.window.createTreeView<Command>(
+            "PowerShellCommands",
+            { treeDataProvider: this.commandsExplorerProvider },
+        );
 
         // Refresh the command explorer when the view is visible
         this.commandsExplorerTreeView.onDidChangeVisibility(async (e) => {
@@ -57,7 +70,9 @@ export class GetCommandsFeature extends LanguageClientConsumer {
 
     public override onLanguageClientSet(_languageClient: LanguageClient): void {
         if (this.commandsExplorerTreeView.visible) {
-            void vscode.commands.executeCommand("PowerShell.RefreshCommandsExplorer");
+            void vscode.commands.executeCommand(
+                "PowerShell.RefreshCommandsExplorer",
+            );
         }
     }
 
@@ -65,13 +80,19 @@ export class GetCommandsFeature extends LanguageClientConsumer {
         const client = await LanguageClientConsumer.getLanguageClient();
         const result = await client.sendRequest(GetCommandRequestType);
         const exclusions = getSettings().sideBar.CommandExplorerExcludeFilter;
-        const excludeFilter = exclusions.map((filter: string) => filter.toLowerCase());
-        const filteredResult = result.filter((command) => (!excludeFilter.includes(command.moduleName.toLowerCase())));
-        this.commandsExplorerProvider.powerShellCommands = filteredResult.map(toCommand);
+        const excludeFilter = exclusions.map((filter: string) =>
+            filter.toLowerCase(),
+        );
+        const filteredResult = result.filter(
+            (command) =>
+                !excludeFilter.includes(command.moduleName.toLowerCase()),
+        );
+        this.commandsExplorerProvider.powerShellCommands =
+            filteredResult.map(toCommand);
         this.commandsExplorerProvider.refresh();
     }
 
-    private async InsertCommand(item: { Name: string; }): Promise<void> {
+    private async InsertCommand(item: { Name: string }): Promise<void> {
         const editor = vscode.window.activeTextEditor;
         if (editor === undefined) {
             return;
@@ -79,7 +100,12 @@ export class GetCommandsFeature extends LanguageClientConsumer {
 
         const sls = editor.selection.start;
         const sle = editor.selection.end;
-        const range = new vscode.Range(sls.line, sls.character, sle.line, sle.character);
+        const range = new vscode.Range(
+            sls.line,
+            sls.character,
+            sle.line,
+            sle.character,
+        );
         await editor.edit((editBuilder) => {
             editBuilder.replace(range, item.Name);
         });
@@ -89,7 +115,8 @@ export class GetCommandsFeature extends LanguageClientConsumer {
 class CommandsExplorerProvider implements vscode.TreeDataProvider<Command> {
     public readonly onDidChangeTreeData: vscode.Event<Command | undefined>;
     public powerShellCommands: Command[] = [];
-    private didChangeTreeData: vscode.EventEmitter<Command | undefined> = new vscode.EventEmitter<Command>();
+    private didChangeTreeData: vscode.EventEmitter<Command | undefined> =
+        new vscode.EventEmitter<Command>();
 
     constructor() {
         this.onDidChangeTreeData = this.didChangeTreeData.event;
@@ -125,7 +152,8 @@ class Command extends vscode.TreeItem {
         public readonly defaultParameterSet: string,
         public readonly ParameterSets: object,
         public readonly Parameters: object,
-        public override readonly collapsibleState = vscode.TreeItemCollapsibleState.None,
+        public override readonly collapsibleState = vscode
+            .TreeItemCollapsibleState.None,
     ) {
         super(Name, collapsibleState);
     }
diff --git a/src/features/HelpCompletion.ts b/src/features/HelpCompletion.ts
index a5dc47459d..bf439748d2 100644
--- a/src/features/HelpCompletion.ts
+++ b/src/features/HelpCompletion.ts
@@ -2,27 +2,37 @@
 // Licensed under the MIT License.
 
 import {
-    Disposable, EndOfLine, Range, SnippetString,
-    TextDocument, TextDocumentChangeEvent, window, workspace
+    Disposable,
+    EndOfLine,
+    Range,
+    SnippetString,
+    type TextDocument,
+    type TextDocumentChangeEvent,
+    window,
+    workspace,
 } from "vscode";
 import { RequestType } from "vscode-languageclient";
 import { LanguageClient } from "vscode-languageclient/node";
-import { Settings, CommentType, getSettings } from "../settings";
 import { LanguageClientConsumer } from "../languageClientConsumer";
+import { CommentType, getSettings, Settings } from "../settings";
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-interface ICommentHelpRequestArguments {
-}
+interface ICommentHelpRequestArguments {}
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
 interface ICommentHelpRequestResponse {
-    content: string[]
+    content: string[];
 }
 
-export const CommentHelpRequestType =
-    new RequestType<ICommentHelpRequestArguments, ICommentHelpRequestResponse, void>("powerShell/getCommentHelp");
+export const CommentHelpRequestType = new RequestType<
+    ICommentHelpRequestArguments,
+    ICommentHelpRequestResponse,
+    void
+>("powerShell/getCommentHelp");
 
-enum SearchState { Searching, Locked, Found }
+enum SearchState {
+    Searching,
+    Locked,
+    Found,
+}
 
 export class HelpCompletionFeature extends LanguageClientConsumer {
     private helpCompletionProvider: HelpCompletionProvider | undefined;
@@ -35,7 +45,9 @@ export class HelpCompletionFeature extends LanguageClientConsumer {
 
         if (this.settings.helpCompletion !== CommentType.Disabled) {
             this.helpCompletionProvider = new HelpCompletionProvider();
-            this.disposable = workspace.onDidChangeTextDocument(async (e) => { await this.onEvent(e); });
+            this.disposable = workspace.onDidChangeTextDocument(async (e) => {
+                await this.onEvent(e);
+            });
         }
     }
 
@@ -60,7 +72,8 @@ export class HelpCompletionFeature extends LanguageClientConsumer {
             this.helpCompletionProvider?.updateState(
                 changeEvent.document,
                 changeEvent.contentChanges[0].text,
-                changeEvent.contentChanges[0].range);
+                changeEvent.contentChanges[0].range,
+            );
 
             // TODO: Raise an event when trigger is found, and attach complete() to the event.
             if (this.helpCompletionProvider?.triggerFound) {
@@ -87,30 +100,37 @@ class TriggerFinder {
 
     public updateState(document: TextDocument, changeText: string): void {
         switch (this.state) {
-        case SearchState.Searching:
-            // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
-            if (changeText.length === 1 && changeText[0] === this.triggerCharacters[this.count]) {
-                this.state = SearchState.Locked;
-                this.document = document;
-                this.count++;
-            }
-            break;
-
-        case SearchState.Locked:
-            // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
-            if (document === this.document && changeText.length === 1 && changeText[0] === this.triggerCharacters[this.count]) {
-                this.count++;
-                if (this.count === this.triggerCharacters.length) {
-                    this.state = SearchState.Found;
+            case SearchState.Searching:
+                if (
+                    changeText.length === 1 &&
+                    // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
+                    changeText[0] === this.triggerCharacters[this.count]
+                ) {
+                    this.state = SearchState.Locked;
+                    this.document = document;
+                    this.count++;
                 }
-            } else {
-                this.reset();
-            }
-            break;
+                break;
+
+            case SearchState.Locked:
+                if (
+                    document === this.document &&
+                    changeText.length === 1 &&
+                    // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
+                    changeText[0] === this.triggerCharacters[this.count]
+                ) {
+                    this.count++;
+                    if (this.count === this.triggerCharacters.length) {
+                        this.state = SearchState.Found;
+                    }
+                } else {
+                    this.reset();
+                }
+                break;
 
-        default:
-            this.reset();
-            break;
+            default:
+                this.reset();
+                break;
         }
     }
 
@@ -136,10 +156,16 @@ class HelpCompletionProvider extends LanguageClientConsumer {
         return this.triggerFinderHelpComment.found;
     }
 
-    // eslint-disable-next-line @typescript-eslint/no-empty-function
-    public override onLanguageClientSet(_languageClient: LanguageClient): void {}
+    public override onLanguageClientSet(
+        _languageClient: LanguageClient,
+        // eslint-disable-next-line @typescript-eslint/no-empty-function
+    ): void {}
 
-    public updateState(document: TextDocument, changeText: string, changeRange: Range): void {
+    public updateState(
+        document: TextDocument,
+        changeText: string,
+        changeRange: Range,
+    ): void {
         this.lastDocument = document;
         this.lastChangeRange = changeRange;
         this.triggerFinderHelpComment.updateState(document, changeText);
@@ -150,7 +176,10 @@ class HelpCompletionProvider extends LanguageClientConsumer {
     }
 
     public async complete(): Promise<void> {
-        if (this.lastChangeRange === undefined || this.lastDocument === undefined) {
+        if (
+            this.lastChangeRange === undefined ||
+            this.lastDocument === undefined
+        ) {
             return;
         }
 
@@ -161,26 +190,31 @@ class HelpCompletionProvider extends LanguageClientConsumer {
         const result = await client.sendRequest(CommentHelpRequestType, {
             documentUri: doc.uri.toString(),
             triggerPosition: triggerStartPos,
-            blockComment: this.settings.helpCompletion === CommentType.BlockComment,
+            blockComment:
+                this.settings.helpCompletion === CommentType.BlockComment,
         });
 
         if (result.content.length === 0) {
             return;
         }
 
-        const replaceRange = new Range(triggerStartPos.translate(0, -1), triggerStartPos.translate(0, 1));
+        const replaceRange = new Range(
+            triggerStartPos.translate(0, -1),
+            triggerStartPos.translate(0, 1),
+        );
 
         // TODO: add indentation level to the help content
         // Trim leading whitespace (used by the rule for indentation) as VSCode takes care of the indentation.
         // Trim the last empty line and join the strings.
         const lines: string[] = result.content;
-        const text = lines
-            .map((x) => x.trimStart())
-            .join(this.getEOL(doc.eol));
+        const text = lines.map((x) => x.trimStart()).join(this.getEOL(doc.eol));
 
         const snippetString = new SnippetString(text);
 
-        await window.activeTextEditor?.insertSnippet(snippetString, replaceRange);
+        await window.activeTextEditor?.insertSnippet(
+            snippetString,
+            replaceRange,
+        );
     }
 
     private getEOL(eol: EndOfLine): string {
diff --git a/src/features/ISECompatibility.ts b/src/features/ISECompatibility.ts
index 8cb96711fa..747bb4f6f4 100644
--- a/src/features/ISECompatibility.ts
+++ b/src/features/ISECompatibility.ts
@@ -17,13 +17,29 @@ export class ISECompatibilityFeature implements vscode.Disposable {
     public static settings: ISetting[] = [
         { path: "debug", name: "openDebug", value: "neverOpen" },
         { path: "editor", name: "tabCompletion", value: "on" },
-        { path: "powershell.integratedConsole", name: "focusConsoleOnExecute", value: false },
+        {
+            path: "powershell.integratedConsole",
+            name: "focusConsoleOnExecute",
+            value: false,
+        },
         { path: "files", name: "defaultLanguage", value: "powershell" },
         { path: "workbench", name: "colorTheme", value: "PowerShell ISE" },
-        { path: "editor", name: "wordSeparators", value: "`~!@#%^&*()-=+[{]}\\|;:'\",.<>/?" },
-        { path: "powershell.buttons", name: "showPanelMovementButtons", value: true },
+        {
+            path: "editor",
+            name: "wordSeparators",
+            value: "`~!@#%^&*()-=+[{]}\\|;:'\",.<>/?",
+        },
+        {
+            path: "powershell.buttons",
+            name: "showPanelMovementButtons",
+            value: true,
+        },
         { path: "powershell.codeFolding", name: "showLastLine", value: false },
-        { path: "powershell.sideBar", name: "CommandExplorerVisibility", value: true }
+        {
+            path: "powershell.sideBar",
+            name: "CommandExplorerVisibility",
+            value: true,
+        },
     ];
 
     private commands: vscode.Disposable[] = [];
@@ -31,12 +47,33 @@ export class ISECompatibilityFeature implements vscode.Disposable {
     private originalSettings: Record<string, boolean | string | undefined> = {};
 
     constructor() {
-        const testSetting = ISECompatibilityFeature.settings[ISECompatibilityFeature.settings.length - 1];
-        this.iseModeEnabled = vscode.workspace.getConfiguration(testSetting.path).get(testSetting.name) === testSetting.value;
+        const testSetting =
+            ISECompatibilityFeature.settings[
+                ISECompatibilityFeature.settings.length - 1
+            ];
+        this.iseModeEnabled =
+            vscode.workspace
+                .getConfiguration(testSetting.path)
+                .get(testSetting.name) === testSetting.value;
         this.commands = [
-            vscode.commands.registerCommand("PowerShell.EnableISEMode", async () => { await this.EnableISEMode(); }),
-            vscode.commands.registerCommand("PowerShell.DisableISEMode", async () => { await this.DisableISEMode(); }),
-            vscode.commands.registerCommand("PowerShell.ToggleISEMode", async () => { await this.ToggleISEMode(); })
+            vscode.commands.registerCommand(
+                "PowerShell.EnableISEMode",
+                async () => {
+                    await this.EnableISEMode();
+                },
+            ),
+            vscode.commands.registerCommand(
+                "PowerShell.DisableISEMode",
+                async () => {
+                    await this.DisableISEMode();
+                },
+            ),
+            vscode.commands.registerCommand(
+                "PowerShell.ToggleISEMode",
+                async () => {
+                    await this.ToggleISEMode();
+                },
+            ),
         ];
     }
 
@@ -50,8 +87,11 @@ export class ISECompatibilityFeature implements vscode.Disposable {
         this.iseModeEnabled = true;
         for (const iseSetting of ISECompatibilityFeature.settings) {
             try {
-                const config = vscode.workspace.getConfiguration(iseSetting.path);
-                this.originalSettings[iseSetting.path + iseSetting.name] = config.get(iseSetting.name);
+                const config = vscode.workspace.getConfiguration(
+                    iseSetting.path,
+                );
+                this.originalSettings[iseSetting.path + iseSetting.name] =
+                    config.get(iseSetting.name);
                 await config.update(iseSetting.name, iseSetting.value, true);
             } catch {
                 // The `update` call can fail if the setting doesn't exist. This
@@ -63,7 +103,9 @@ export class ISECompatibilityFeature implements vscode.Disposable {
         }
 
         // Show the PowerShell view container which has the Command Explorer view
-        await vscode.commands.executeCommand("workbench.view.extension.PowerShell");
+        await vscode.commands.executeCommand(
+            "workbench.view.extension.PowerShell",
+        );
     }
 
     private async DisableISEMode(): Promise<void> {
@@ -72,7 +114,11 @@ export class ISECompatibilityFeature implements vscode.Disposable {
             const config = vscode.workspace.getConfiguration(iseSetting.path);
             const currently = config.get(iseSetting.name);
             if (currently === iseSetting.value) {
-                await config.update(iseSetting.name, this.originalSettings[iseSetting.path + iseSetting.name], true);
+                await config.update(
+                    iseSetting.name,
+                    this.originalSettings[iseSetting.path + iseSetting.name],
+                    true,
+                );
             }
         }
     }
diff --git a/src/features/OpenInISE.ts b/src/features/OpenInISE.ts
index ffc6993c1b..808ee59db7 100644
--- a/src/features/OpenInISE.ts
+++ b/src/features/OpenInISE.ts
@@ -8,26 +8,29 @@ export class OpenInISEFeature implements vscode.Disposable {
     private command: vscode.Disposable;
 
     constructor() {
-        this.command = vscode.commands.registerCommand("PowerShell.OpenInISE", () => {
-            const editor = vscode.window.activeTextEditor;
-            if (editor === undefined) {
-                return;
-            }
-
-            const document = editor.document;
-            const uri = document.uri;
-            let ISEPath = process.env.windir ?? "C:\\Windows";
-
-            if (process.env.PROCESSOR_ARCHITEW6432 !== undefined) {
-                ISEPath += "\\Sysnative";
-            } else {
-                ISEPath += "\\System32";
-            }
-
-            ISEPath += "\\WindowsPowerShell\\v1.0\\powershell_ise.exe";
-
-            ChildProcess.exec(`${ISEPath} -File "${uri.fsPath}"`).unref();
-        });
+        this.command = vscode.commands.registerCommand(
+            "PowerShell.OpenInISE",
+            () => {
+                const editor = vscode.window.activeTextEditor;
+                if (editor === undefined) {
+                    return;
+                }
+
+                const document = editor.document;
+                const uri = document.uri;
+                let ISEPath = process.env.windir ?? "C:\\Windows";
+
+                if (process.env.PROCESSOR_ARCHITEW6432 !== undefined) {
+                    ISEPath += "\\Sysnative";
+                } else {
+                    ISEPath += "\\System32";
+                }
+
+                ISEPath += "\\WindowsPowerShell\\v1.0\\powershell_ise.exe";
+
+                ChildProcess.exec(`${ISEPath} -File "${uri.fsPath}"`).unref();
+            },
+        );
     }
 
     public dispose(): void {
diff --git a/src/features/PesterTests.ts b/src/features/PesterTests.ts
index f5bd839c94..486bcd8aab 100644
--- a/src/features/PesterTests.ts
+++ b/src/features/PesterTests.ts
@@ -2,10 +2,10 @@
 // Licensed under the MIT License.
 
 import * as path from "path";
-import vscode = require("vscode");
-import { ILogger } from "../logging";
+import type { ILogger } from "../logging";
 import { SessionManager } from "../session";
-import { getSettings, getChosenWorkspace } from "../settings";
+import { getChosenWorkspace, getSettings } from "../settings";
+import vscode = require("vscode");
 import utils = require("../utils");
 
 enum LaunchType {
@@ -17,29 +17,56 @@ export class PesterTestsFeature implements vscode.Disposable {
     private commands: vscode.Disposable[];
     private invokePesterStubScriptPath: string;
 
-    constructor(private sessionManager: SessionManager, private logger: ILogger) {
-        this.invokePesterStubScriptPath = path.resolve(__dirname, "../modules/PowerShellEditorServices/InvokePesterStub.ps1");
+    constructor(
+        private sessionManager: SessionManager,
+        private logger: ILogger,
+    ) {
+        this.invokePesterStubScriptPath = path.resolve(
+            __dirname,
+            "../modules/PowerShellEditorServices/InvokePesterStub.ps1",
+        );
         this.commands = [
             // File context-menu command - Run Pester Tests
             vscode.commands.registerCommand(
                 "PowerShell.RunPesterTestsFromFile",
                 (fileUri?) => {
-                    return this.launchAllTestsInActiveEditor(LaunchType.Run, fileUri);
-                }),
+                    return this.launchAllTestsInActiveEditor(
+                        LaunchType.Run,
+                        fileUri,
+                    );
+                },
+            ),
 
             // File context-menu command - Debug Pester Tests
             vscode.commands.registerCommand(
                 "PowerShell.DebugPesterTestsFromFile",
                 (fileUri?) => {
-                    return this.launchAllTestsInActiveEditor(LaunchType.Debug, fileUri);
-                }),
+                    return this.launchAllTestsInActiveEditor(
+                        LaunchType.Debug,
+                        fileUri,
+                    );
+                },
+            ),
 
             // This command is provided for usage by PowerShellEditorServices (PSES) only
             vscode.commands.registerCommand(
                 "PowerShell.RunPesterTests",
-                (uriString, runInDebugger, describeBlockName?, describeBlockLineNumber?, outputPath?) => {
-                    return this.launchTests(vscode.Uri.parse(uriString), runInDebugger, describeBlockName, describeBlockLineNumber, outputPath);
-                })
+                (
+                    uriString,
+                    runInDebugger,
+                    describeBlockName?,
+                    describeBlockLineNumber?,
+                    outputPath?,
+                ) => {
+                    return this.launchTests(
+                        vscode.Uri.parse(uriString),
+                        runInDebugger,
+                        describeBlockName,
+                        describeBlockLineNumber,
+                        outputPath,
+                    );
+                },
+            ),
         ];
     }
 
@@ -51,11 +78,9 @@ export class PesterTestsFeature implements vscode.Disposable {
 
     private async launchAllTestsInActiveEditor(
         launchType: LaunchType,
-        fileUri?: vscode.Uri): Promise<boolean> {
-
-        if (fileUri === undefined) {
-            fileUri = vscode.window.activeTextEditor?.document.uri;
-        }
+        fileUri?: vscode.Uri,
+    ): Promise<boolean> {
+        fileUri ??= vscode.window.activeTextEditor?.document.uri;
 
         if (fileUri === undefined) {
             return false;
@@ -70,10 +95,16 @@ export class PesterTestsFeature implements vscode.Disposable {
         runInDebugger: boolean,
         describeBlockName?: string,
         describeBlockLineNumber?: number,
-        outputPath?: string): Promise<boolean> {
-
+        outputPath?: string,
+    ): Promise<boolean> {
         const launchType = runInDebugger ? LaunchType.Debug : LaunchType.Run;
-        const launchConfig = this.createLaunchConfig(fileUri, launchType, describeBlockName, describeBlockLineNumber, outputPath);
+        const launchConfig = this.createLaunchConfig(
+            fileUri,
+            launchType,
+            describeBlockName,
+            describeBlockLineNumber,
+            outputPath,
+        );
         return this.launch(launchConfig);
     }
 
@@ -82,8 +113,8 @@ export class PesterTestsFeature implements vscode.Disposable {
         launchType: LaunchType,
         testName?: string,
         lineNum?: number,
-        outputPath?: string): vscode.DebugConfiguration {
-
+        outputPath?: string,
+    ): vscode.DebugConfiguration {
         const settings = getSettings();
         const launchConfig = {
             request: "launch",
@@ -95,14 +126,18 @@ export class PesterTestsFeature implements vscode.Disposable {
                 `'${utils.escapeSingleQuotes(fileUri.fsPath)}'`,
             ],
             internalConsoleOptions: "neverOpen",
-            noDebug: (launchType === LaunchType.Run),
-            createTemporaryIntegratedConsole: settings.debugging.createTemporaryIntegratedConsole
+            noDebug: launchType === LaunchType.Run,
+            createTemporaryIntegratedConsole:
+                settings.debugging.createTemporaryIntegratedConsole,
         };
 
         if (lineNum) {
             launchConfig.args.push("-LineNumber", `${lineNum}`);
         } else if (testName) {
-            launchConfig.args.push("-TestName", `'${utils.escapeSingleQuotes(testName)}'`);
+            launchConfig.args.push(
+                "-TestName",
+                `'${utils.escapeSingleQuotes(testName)}'`,
+            );
         } else {
             launchConfig.args.push("-All");
         }
@@ -112,10 +147,15 @@ export class PesterTestsFeature implements vscode.Disposable {
         }
 
         if (launchType === LaunchType.Debug) {
-            launchConfig.args.push("-Output", `'${settings.pester.debugOutputVerbosity}'`);
-        }
-        else {
-            launchConfig.args.push("-Output", `'${settings.pester.outputVerbosity}'`);
+            launchConfig.args.push(
+                "-Output",
+                `'${settings.pester.debugOutputVerbosity}'`,
+            );
+        } else {
+            launchConfig.args.push(
+                "-Output",
+                `'${settings.pester.outputVerbosity}'`,
+            );
         }
 
         if (outputPath) {
@@ -125,14 +165,21 @@ export class PesterTestsFeature implements vscode.Disposable {
         return launchConfig;
     }
 
-    private async launch(launchConfig: vscode.DebugConfiguration): Promise<boolean> {
+    private async launch(
+        launchConfig: vscode.DebugConfiguration,
+    ): Promise<boolean> {
         // Create or show the interactive console
         // TODO: #367 Check if "newSession" mode is configured
         this.sessionManager.showDebugTerminal(true);
 
         // Ensure the necessary script exists (for testing). The debugger will
         // start regardless, but we also pass its success along.
-        return await utils.checkIfFileExists(this.invokePesterStubScriptPath)
-            && vscode.debug.startDebugging(await getChosenWorkspace(this.logger), launchConfig);
+        return (
+            (await utils.checkIfFileExists(this.invokePesterStubScriptPath)) &&
+            vscode.debug.startDebugging(
+                await getChosenWorkspace(this.logger),
+                launchConfig,
+            )
+        );
     }
 }
diff --git a/src/features/RemoteFiles.ts b/src/features/RemoteFiles.ts
index 765b6d99a6..46164b5de4 100644
--- a/src/features/RemoteFiles.ts
+++ b/src/features/RemoteFiles.ts
@@ -4,9 +4,12 @@
 import os = require("os");
 import path = require("path");
 import vscode = require("vscode");
-import { NotificationType, TextDocumentIdentifier } from "vscode-languageclient";
-import { LanguageClientConsumer } from "../languageClientConsumer";
+import {
+    NotificationType,
+    TextDocumentIdentifier,
+} from "vscode-languageclient";
 import type { LanguageClient } from "vscode-languageclient/node";
+import { LanguageClientConsumer } from "../languageClientConsumer";
 
 // NOTE: The following two DidSaveTextDocument* types will
 // be removed when #593 gets fixed.
@@ -19,8 +22,7 @@ export interface IDidSaveTextDocumentParams {
 }
 
 export const DidSaveTextDocumentNotificationType =
-    new NotificationType<IDidSaveTextDocumentParams>(
-        "textDocument/didSave");
+    new NotificationType<IDidSaveTextDocumentParams>("textDocument/didSave");
 
 export class RemoteFilesFeature extends LanguageClientConsumer {
     private command: vscode.Disposable;
@@ -30,9 +32,9 @@ export class RemoteFilesFeature extends LanguageClientConsumer {
         super();
         // Get the common PowerShell Editor Services temporary file path
         // so that remote files from previous sessions can be closed.
-        this.tempSessionPathPrefix =
-            path.join(os.tmpdir(), "PSES-")
-                .toLowerCase();
+        this.tempSessionPathPrefix = path
+            .join(os.tmpdir(), "PSES-")
+            .toLowerCase();
 
         // At startup, close any lingering temporary remote files
         this.closeRemoteFiles();
@@ -43,14 +45,19 @@ export class RemoteFilesFeature extends LanguageClientConsumer {
                 await client.sendNotification(
                     DidSaveTextDocumentNotificationType,
                     {
-                        textDocument: TextDocumentIdentifier.create(doc.uri.toString()),
-                    });
+                        textDocument: TextDocumentIdentifier.create(
+                            doc.uri.toString(),
+                        ),
+                    },
+                );
             }
         });
     }
 
-    // eslint-disable-next-line @typescript-eslint/no-empty-function
-    public override onLanguageClientSet(_languageClient: LanguageClient): void {}
+    public override onLanguageClientSet(
+        _languageClient: LanguageClient,
+        // eslint-disable-next-line @typescript-eslint/no-empty-function
+    ): void {}
 
     public dispose(): void {
         this.command.dispose();
@@ -59,12 +66,15 @@ export class RemoteFilesFeature extends LanguageClientConsumer {
     }
 
     private isDocumentRemote(doc: vscode.TextDocument): boolean {
-        return doc.fileName.toLowerCase().startsWith(this.tempSessionPathPrefix);
+        return doc.fileName
+            .toLowerCase()
+            .startsWith(this.tempSessionPathPrefix);
     }
 
     private closeRemoteFiles(): void {
-        const remoteDocuments =
-            vscode.workspace.textDocuments.filter((doc) => this.isDocumentRemote(doc));
+        const remoteDocuments = vscode.workspace.textDocuments.filter((doc) =>
+            this.isDocumentRemote(doc),
+        );
 
         async function innerCloseFiles(): Promise<void> {
             const doc = remoteDocuments.pop();
@@ -73,7 +83,9 @@ export class RemoteFilesFeature extends LanguageClientConsumer {
             }
 
             await vscode.window.showTextDocument(doc);
-            await vscode.commands.executeCommand("workbench.action.closeActiveEditor");
+            await vscode.commands.executeCommand(
+                "workbench.action.closeActiveEditor",
+            );
             await innerCloseFiles();
         }
 
diff --git a/src/features/ShowHelp.ts b/src/features/ShowHelp.ts
index 6e73050924..6af843e53b 100644
--- a/src/features/ShowHelp.ts
+++ b/src/features/ShowHelp.ts
@@ -3,12 +3,10 @@
 
 import vscode = require("vscode");
 import { NotificationType } from "vscode-languageclient";
-import { LanguageClientConsumer } from "../languageClientConsumer";
 import type { LanguageClient } from "vscode-languageclient/node";
+import { LanguageClientConsumer } from "../languageClientConsumer";
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-interface IShowHelpNotificationArguments {
-}
+interface IShowHelpNotificationArguments {}
 
 export const ShowHelpNotificationType =
     new NotificationType<IShowHelpNotificationArguments>("powerShell/showHelp");
@@ -18,33 +16,42 @@ export class ShowHelpFeature extends LanguageClientConsumer {
 
     constructor() {
         super();
-        this.command = vscode.commands.registerCommand("PowerShell.ShowHelp", async (item?) => {
-            if (!item?.Name) {
-
-                const editor = vscode.window.activeTextEditor;
-                if (editor === undefined) {
-                    return;
+        this.command = vscode.commands.registerCommand(
+            "PowerShell.ShowHelp",
+            async (item?) => {
+                if (!item?.Name) {
+                    const editor = vscode.window.activeTextEditor;
+                    if (editor === undefined) {
+                        return;
+                    }
+
+                    const selection = editor.selection;
+                    const doc = editor.document;
+                    const cwr = doc.getWordRangeAtPosition(selection.active);
+                    const text = doc.getText(cwr);
+
+                    const client =
+                        await LanguageClientConsumer.getLanguageClient();
+                    await client.sendNotification(ShowHelpNotificationType, {
+                        text,
+                    });
+                } else {
+                    const client =
+                        await LanguageClientConsumer.getLanguageClient();
+                    await client.sendNotification(ShowHelpNotificationType, {
+                        text: item.Name,
+                    });
                 }
-
-                const selection = editor.selection;
-                const doc = editor.document;
-                const cwr = doc.getWordRangeAtPosition(selection.active);
-                const text = doc.getText(cwr);
-
-                const client = await LanguageClientConsumer.getLanguageClient();
-                await client.sendNotification(ShowHelpNotificationType, { text });
-            } else {
-                const client = await LanguageClientConsumer.getLanguageClient();
-                await client.sendNotification(ShowHelpNotificationType, { text: item.Name });
-            }
-        });
+            },
+        );
     }
 
-    // eslint-disable-next-line @typescript-eslint/no-empty-function
-    public override onLanguageClientSet(_languageClient: LanguageClient): void {}
+    public override onLanguageClientSet(
+        _languageClient: LanguageClient,
+        // eslint-disable-next-line @typescript-eslint/no-empty-function
+    ): void {}
 
     public dispose(): void {
         this.command.dispose();
     }
-
 }
diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts
index 01c31eb385..17edea4770 100644
--- a/src/features/UpdatePowerShell.ts
+++ b/src/features/UpdatePowerShell.ts
@@ -1,12 +1,11 @@
 // Copyright (c) Microsoft Corporation.
 // Licensed under the MIT License.
 
-import fetch from "node-fetch";
 import { SemVer } from "semver";
 import vscode = require("vscode");
 
-import { ILogger } from "../logging";
-import { IPowerShellVersionDetails } from "../session";
+import type { ILogger } from "../logging";
+import type { IPowerShellVersionDetails } from "../session";
 import { changeSetting, Settings } from "../settings";
 
 interface IUpdateMessageItem extends vscode.MessageItem {
@@ -19,8 +18,10 @@ interface IUpdateMessageItem extends vscode.MessageItem {
 export class UpdatePowerShell {
     private static LTSBuildInfoURL = "https://aka.ms/pwsh-buildinfo-lts";
     private static StableBuildInfoURL = "https://aka.ms/pwsh-buildinfo-stable";
-    private static PreviewBuildInfoURL = "https://aka.ms/pwsh-buildinfo-preview";
-    private static GitHubWebReleaseURL = "https://github.com/PowerShell/PowerShell/releases/tag/";
+    private static PreviewBuildInfoURL =
+        "https://aka.ms/pwsh-buildinfo-preview";
+    private static GitHubWebReleaseURL =
+        "https://github.com/PowerShell/PowerShell/releases/tag/";
     private static promptOptions: IUpdateMessageItem[] = [
         {
             id: 0,
@@ -40,7 +41,8 @@ export class UpdatePowerShell {
     constructor(
         private sessionSettings: Settings,
         private logger: ILogger,
-        versionDetails: IPowerShellVersionDetails) {
+        versionDetails: IPowerShellVersionDetails,
+    ) {
         // We use the commit field as it's like
         // '7.3.0-preview.3-508-g07175ae0ff8eb7306fe0b0fc7d...' which translates
         // to SemVer. The version handler in PSES handles Windows PowerShell and
@@ -51,20 +53,26 @@ export class UpdatePowerShell {
     private shouldCheckForUpdate(): boolean {
         // Respect user setting.
         if (!this.sessionSettings.promptToUpdatePowerShell) {
-            this.logger.writeVerbose("Setting 'promptToUpdatePowerShell' was false.");
+            this.logger.writeDebug(
+                "Setting 'promptToUpdatePowerShell' was false.",
+            );
             return false;
         }
 
         // Respect environment configuration.
         if (process.env.POWERSHELL_UPDATECHECK?.toLowerCase() === "off") {
-            this.logger.writeVerbose("Environment variable 'POWERSHELL_UPDATECHECK' was 'Off'.");
+            this.logger.writeDebug(
+                "Environment variable 'POWERSHELL_UPDATECHECK' was 'Off'.",
+            );
             return false;
         }
 
         // Skip prompting when using Windows PowerShell for now.
         if (this.localVersion.compare("6.0.0") === -1) {
             // TODO: Maybe we should announce PowerShell Core?
-            this.logger.writeVerbose("Not prompting to update Windows PowerShell.");
+            this.logger.writeDebug(
+                "Not prompting to update Windows PowerShell.",
+            );
             return false;
         }
 
@@ -78,13 +86,15 @@ export class UpdatePowerShell {
 
             // Skip if PowerShell is self-built, that is, this contains a commit hash.
             if (commit.length >= 40) {
-                this.logger.writeVerbose("Not prompting to update development build.");
+                this.logger.writeDebug(
+                    "Not prompting to update development build.",
+                );
                 return false;
             }
 
             // Skip if preview is a daily build.
             if (daily.toLowerCase().startsWith("daily")) {
-                this.logger.writeVerbose("Not prompting to update daily build.");
+                this.logger.writeDebug("Not prompting to update daily build.");
                 return false;
             }
         }
@@ -106,7 +116,9 @@ export class UpdatePowerShell {
         //     "ReleaseTag": "v7.2.7"
         // }
         const data = await response.json();
-        this.logger.writeVerbose(`Received from '${url}':\n${JSON.stringify(data, undefined, 2)}`);
+        this.logger.writeDebug(
+            `Received from '${url}':\n${JSON.stringify(data, undefined, 2)}`,
+        );
         return data.ReleaseTag;
     }
 
@@ -115,27 +127,33 @@ export class UpdatePowerShell {
             return undefined;
         }
 
-        this.logger.writeVerbose("Checking for PowerShell update...");
+        this.logger.writeDebug("Checking for PowerShell update...");
         const tags: string[] = [];
         if (process.env.POWERSHELL_UPDATECHECK?.toLowerCase() === "lts") {
             // Only check for update to LTS.
-            this.logger.writeVerbose("Checking for LTS update...");
-            const tag = await this.getRemoteVersion(UpdatePowerShell.LTSBuildInfoURL);
+            this.logger.writeDebug("Checking for LTS update...");
+            const tag = await this.getRemoteVersion(
+                UpdatePowerShell.LTSBuildInfoURL,
+            );
             if (tag != undefined) {
                 tags.push(tag);
             }
         } else {
             // Check for update to stable.
-            this.logger.writeVerbose("Checking for stable update...");
-            const tag = await this.getRemoteVersion(UpdatePowerShell.StableBuildInfoURL);
+            this.logger.writeDebug("Checking for stable update...");
+            const tag = await this.getRemoteVersion(
+                UpdatePowerShell.StableBuildInfoURL,
+            );
             if (tag != undefined) {
                 tags.push(tag);
             }
 
             // Also check for a preview update.
             if (this.localVersion.prerelease.length > 0) {
-                this.logger.writeVerbose("Checking for preview update...");
-                const tag = await this.getRemoteVersion(UpdatePowerShell.PreviewBuildInfoURL);
+                this.logger.writeDebug("Checking for preview update...");
+                const tag = await this.getRemoteVersion(
+                    UpdatePowerShell.PreviewBuildInfoURL,
+                );
                 if (tag != undefined) {
                     tags.push(tag);
                 }
@@ -161,46 +179,60 @@ export class UpdatePowerShell {
             }
         } catch (err) {
             // Best effort. This probably failed to fetch the data from GitHub.
-            this.logger.writeWarning(err instanceof Error ? err.message : "unknown");
+            this.logger.writeWarning(
+                err instanceof Error ? err.message : "unknown",
+            );
         }
     }
 
     private async openReleaseInBrowser(tag: string): Promise<void> {
-        const url = vscode.Uri.parse(UpdatePowerShell.GitHubWebReleaseURL + tag);
+        const url = vscode.Uri.parse(
+            UpdatePowerShell.GitHubWebReleaseURL + tag,
+        );
         await vscode.env.openExternal(url);
     }
 
     private async promptToUpdate(tag: string): Promise<void> {
         const releaseVersion = new SemVer(tag);
-        this.logger.write(`Prompting to update PowerShell v${this.localVersion.version} to v${releaseVersion.version}.`);
+        this.logger.write(
+            `Prompting to update PowerShell v${this.localVersion.version} to v${releaseVersion.version}.`,
+        );
         const result = await vscode.window.showInformationMessage(
             `PowerShell v${this.localVersion.version} is out-of-date.
              The latest version is v${releaseVersion.version}.
              Would you like to open the GitHub release in your browser?`,
-            ...UpdatePowerShell.promptOptions);
+            ...UpdatePowerShell.promptOptions,
+        );
 
         // If the user cancels the notification.
         if (!result) {
-            this.logger.writeVerbose("User canceled PowerShell update prompt.");
+            this.logger.writeDebug("User canceled PowerShell update prompt.");
             return;
         }
 
-        this.logger.writeVerbose(`User said '${UpdatePowerShell.promptOptions[result.id].title}'.`);
+        this.logger.writeDebug(
+            `User said '${UpdatePowerShell.promptOptions[result.id].title}'.`,
+        );
 
         switch (result.id) {
-        // Yes
-        case 0:
-            await this.openReleaseInBrowser(tag);
-            break;
+            // Yes
+            case 0:
+                await this.openReleaseInBrowser(tag);
+                break;
             // Not Now
-        case 1:
-            break;
+            case 1:
+                break;
             // Don't Show Again
-        case 2:
-            await changeSetting("promptToUpdatePowerShell", false, true, this.logger);
-            break;
-        default:
-            break;
+            case 2:
+                await changeSetting(
+                    "promptToUpdatePowerShell",
+                    false,
+                    true,
+                    this.logger,
+                );
+                break;
+            default:
+                break;
         }
     }
 }
diff --git a/src/languageClientConsumer.ts b/src/languageClientConsumer.ts
index 3106d86cc4..e161f5a34e 100644
--- a/src/languageClientConsumer.ts
+++ b/src/languageClientConsumer.ts
@@ -14,7 +14,9 @@ export abstract class LanguageClientConsumer {
 
     // This is called in the session manager when the client is started (so we
     // can wait for that). It's what actually resolves the promise.
-    public static onLanguageClientStarted(languageClient: LanguageClient): void {
+    public static onLanguageClientStarted(
+        languageClient: LanguageClient,
+    ): void {
         // It should have been created earlier, but if not, create and resolve it.
         this.languageClientPromise ??= Promise.resolve(languageClient);
         this.getLanguageClientResolve?.(languageClient);
@@ -34,7 +36,8 @@ export abstract class LanguageClientConsumer {
         LanguageClientConsumer.languageClientPromise?.catch(() => {
             LanguageClientConsumer.languageClientPromise = undefined;
         });
-        LanguageClientConsumer.languageClientPromise ??= LanguageClientConsumer.createLanguageClientPromise();
+        LanguageClientConsumer.languageClientPromise ??=
+            LanguageClientConsumer.createLanguageClientPromise();
         return LanguageClientConsumer.languageClientPromise;
     }
 
@@ -45,22 +48,29 @@ export abstract class LanguageClientConsumer {
             {
                 location: ProgressLocation.Notification,
                 title: "Please wait, starting PowerShell Extension Terminal...",
-                cancellable: true
+                cancellable: true,
             },
             (_progress, token) => {
                 token.onCancellationRequested(() => {
-                    void window.showErrorMessage("Cancelled PowerShell Extension Terminal start-up.");
+                    void window.showErrorMessage(
+                        "Cancelled PowerShell Extension Terminal start-up.",
+                    );
                 });
 
                 // The real promise!
-                return new Promise<LanguageClient>(
-                    (resolve, reject) => {
-                        // Store the resolve function to be called in resetLanguageClient.
-                        LanguageClientConsumer.getLanguageClientResolve = resolve;
-                        // Reject the promise if the operation is cancelled.
-                        token.onCancellationRequested(() => { reject(new Error("Cancelled PowerShell Extension Terminal start-up.")); });
-                    }
-                );
-            });
+                return new Promise<LanguageClient>((resolve, reject) => {
+                    // Store the resolve function to be called in resetLanguageClient.
+                    LanguageClientConsumer.getLanguageClientResolve = resolve;
+                    // Reject the promise if the operation is cancelled.
+                    token.onCancellationRequested(() => {
+                        reject(
+                            new Error(
+                                "Cancelled PowerShell Extension Terminal start-up.",
+                            ),
+                        );
+                    });
+                });
+            },
+        );
     }
 }
diff --git a/src/logging.ts b/src/logging.ts
index a7176c08ef..4a9d9fa54d 100644
--- a/src/logging.ts
+++ b/src/logging.ts
@@ -1,84 +1,60 @@
 // Copyright (c) Microsoft Corporation.
 // Licensed under the MIT License.
 
-import utils = require("./utils");
-import os = require("os");
-import vscode = require("vscode");
-
-// NOTE: This is not a string enum because the order is used for comparison.
-export enum LogLevel {
-    Diagnostic,
-    Verbose,
-    Normal,
-    Warning,
-    Error,
-    None,
-}
+import { LogLevel, window, type Event, type LogOutputChannel } from "vscode";
 
 /** Interface for logging operations. New features should use this interface for the "type" of logger.
  *  This will allow for easy mocking of the logger during unit tests.
  */
 export interface ILogger {
-    logDirectoryPath: vscode.Uri;
-    updateLogLevel(logLevelName: string): void;
     write(message: string, ...additionalMessages: string[]): void;
-    writeAndShowInformation(message: string, ...additionalMessages: string[]): Promise<void>;
-    writeDiagnostic(message: string, ...additionalMessages: string[]): void;
-    writeVerbose(message: string, ...additionalMessages: string[]): void;
+    writeAndShowInformation(
+        message: string,
+        ...additionalMessages: string[]
+    ): Promise<void>;
+    writeTrace(message: string, ...additionalMessages: string[]): void;
+    writeDebug(message: string, ...additionalMessages: string[]): void;
     writeWarning(message: string, ...additionalMessages: string[]): void;
-    writeAndShowWarning(message: string, ...additionalMessages: string[]): Promise<void>;
+    writeAndShowWarning(
+        message: string,
+        ...additionalMessages: string[]
+    ): Promise<void>;
     writeError(message: string, ...additionalMessages: string[]): void;
-    writeAndShowError(message: string, ...additionalMessages: string[]): Promise<void>;
+    writeAndShowError(
+        message: string,
+        ...additionalMessages: string[]
+    ): Promise<void>;
     writeAndShowErrorWithActions(
         message: string,
-        actions: { prompt: string; action: (() => Promise<void>) | undefined }[]): Promise<void>;
+        actions: {
+            prompt: string;
+            action: (() => Promise<void>) | undefined;
+        }[],
+    ): Promise<void>;
 }
 
 export class Logger implements ILogger {
-    public logDirectoryPath: vscode.Uri; // The folder for all the logs
-    private logLevel: LogLevel;
-    private commands: vscode.Disposable[];
-    private logChannel: vscode.OutputChannel;
-    private logFilePath: vscode.Uri; // The client's logs
-    private logDirectoryCreated = false;
-    private writingLog = false;
-
-    constructor(logLevelName: string, globalStorageUri: vscode.Uri) {
-        this.logLevel = Logger.logLevelNameToValue(logLevelName);
-        this.logChannel = vscode.window.createOutputChannel("PowerShell Extension Logs");
-        // We have to override the scheme because it defaults to
-        // 'vscode-userdata' which breaks UNC paths.
-        this.logDirectoryPath = vscode.Uri.joinPath(
-            globalStorageUri.with({ scheme: "file" }),
-            "logs",
-            `${Math.floor(Date.now() / 1000)}-${vscode.env.sessionId}`);
-        this.logFilePath = vscode.Uri.joinPath(this.logDirectoryPath, "vscode-powershell.log");
-
-        // Early logging of the log paths for debugging.
-        if (LogLevel.Diagnostic >= this.logLevel) {
-            const uriMessage = Logger.timestampMessage(`Log file path: '${this.logFilePath}'`, LogLevel.Verbose);
-            this.logChannel.appendLine(uriMessage);
-        }
-
-        this.commands = [
-            vscode.commands.registerCommand(
-                "PowerShell.ShowLogs",
-                () => { this.showLogPanel(); }),
+    // Log output channel handles all the verbosity management so we don't have to.
+    private logChannel: LogOutputChannel;
+    public get logLevel(): LogLevel {
+        return this.logChannel.logLevel;
+    }
 
-            vscode.commands.registerCommand(
-                "PowerShell.OpenLogFolder",
-                async () => { await this.openLogFolder(); }),
-        ];
+    constructor(logChannel?: LogOutputChannel) {
+        this.logChannel =
+            logChannel ??
+            window.createOutputChannel("PowerShell", { log: true });
     }
 
     public dispose(): void {
         this.logChannel.dispose();
-        for (const command of this.commands) {
-            command.dispose();
-        }
     }
 
-    private writeAtLevel(logLevel: LogLevel, message: string, ...additionalMessages: string[]): void {
+    private writeAtLevel(
+        logLevel: LogLevel,
+        message: string,
+        ...additionalMessages: string[]
+    ): void {
         if (logLevel >= this.logLevel) {
             void this.writeLine(message, logLevel);
 
@@ -89,34 +65,47 @@ export class Logger implements ILogger {
     }
 
     public write(message: string, ...additionalMessages: string[]): void {
-        this.writeAtLevel(LogLevel.Normal, message, ...additionalMessages);
+        this.writeAtLevel(LogLevel.Info, message, ...additionalMessages);
     }
 
-    public async writeAndShowInformation(message: string, ...additionalMessages: string[]): Promise<void> {
+    public async writeAndShowInformation(
+        message: string,
+        ...additionalMessages: string[]
+    ): Promise<void> {
         this.write(message, ...additionalMessages);
 
-        const selection = await vscode.window.showInformationMessage(message, "Show Logs", "Okay");
+        const selection = await window.showInformationMessage(
+            message,
+            "Show Logs",
+            "Okay",
+        );
         if (selection === "Show Logs") {
             this.showLogPanel();
         }
     }
 
-    public writeDiagnostic(message: string, ...additionalMessages: string[]): void {
-        this.writeAtLevel(LogLevel.Diagnostic, message, ...additionalMessages);
+    public writeTrace(message: string, ...additionalMessages: string[]): void {
+        this.writeAtLevel(LogLevel.Trace, message, ...additionalMessages);
     }
 
-    public writeVerbose(message: string, ...additionalMessages: string[]): void {
-        this.writeAtLevel(LogLevel.Verbose, message, ...additionalMessages);
+    public writeDebug(message: string, ...additionalMessages: string[]): void {
+        this.writeAtLevel(LogLevel.Debug, message, ...additionalMessages);
     }
 
-    public writeWarning(message: string, ...additionalMessages: string[]): void {
+    public writeWarning(
+        message: string,
+        ...additionalMessages: string[]
+    ): void {
         this.writeAtLevel(LogLevel.Warning, message, ...additionalMessages);
     }
 
-    public async writeAndShowWarning(message: string, ...additionalMessages: string[]): Promise<void> {
+    public async writeAndShowWarning(
+        message: string,
+        ...additionalMessages: string[]
+    ): Promise<void> {
         this.writeWarning(message, ...additionalMessages);
 
-        const selection = await vscode.window.showWarningMessage(message, "Show Logs");
+        const selection = await window.showWarningMessage(message, "Show Logs");
         if (selection !== undefined) {
             this.showLogPanel();
         }
@@ -126,10 +115,13 @@ export class Logger implements ILogger {
         this.writeAtLevel(LogLevel.Error, message, ...additionalMessages);
     }
 
-    public async writeAndShowError(message: string, ...additionalMessages: string[]): Promise<void> {
+    public async writeAndShowError(
+        message: string,
+        ...additionalMessages: string[]
+    ): Promise<void> {
         this.writeError(message, ...additionalMessages);
 
-        const choice = await vscode.window.showErrorMessage(message, "Show Logs");
+        const choice = await window.showErrorMessage(message, "Show Logs");
         if (choice !== undefined) {
             this.showLogPanel();
         }
@@ -137,20 +129,29 @@ export class Logger implements ILogger {
 
     public async writeAndShowErrorWithActions(
         message: string,
-        actions: { prompt: string; action: (() => Promise<void>) | undefined }[]): Promise<void> {
+        actions: {
+            prompt: string;
+            action: (() => Promise<void>) | undefined;
+        }[],
+    ): Promise<void> {
         this.writeError(message);
 
         const fullActions = [
             ...actions,
-            { prompt: "Show Logs", action: (): void => { this.showLogPanel(); } },
+            {
+                prompt: "Show Logs",
+                action: (): void => {
+                    this.showLogPanel();
+                },
+            },
         ];
 
         const actionKeys: string[] = fullActions.map((action) => action.prompt);
 
-        const choice = await vscode.window.showErrorMessage(message, ...actionKeys);
+        const choice = await window.showErrorMessage(message, ...actionKeys);
         if (choice) {
             for (const action of fullActions) {
-                if (choice === action.prompt && action.action !== undefined ) {
+                if (choice === action.prompt && action.action !== undefined) {
                     await action.action();
                     return;
                 }
@@ -158,70 +159,208 @@ export class Logger implements ILogger {
         }
     }
 
-    // TODO: Make the enum smarter about strings so this goes away.
-    private static logLevelNameToValue(logLevelName: string): LogLevel {
-        switch (logLevelName.trim().toLowerCase()) {
-        case "diagnostic": return LogLevel.Diagnostic;
-        case "verbose": return LogLevel.Verbose;
-        case "normal": return LogLevel.Normal;
-        case "warning": return LogLevel.Warning;
-        case "error": return LogLevel.Error;
-        case "none": return LogLevel.None;
-        default: return LogLevel.Normal;
-        }
+    public showLogPanel(): void {
+        this.logChannel.show();
     }
 
-    public updateLogLevel(logLevelName: string): void {
-        this.logLevel = Logger.logLevelNameToValue(logLevelName);
+    private async writeLine(
+        message: string,
+        level: LogLevel = LogLevel.Info,
+    ): Promise<void> {
+        return new Promise<void>((resolve) => {
+            switch (level) {
+                case LogLevel.Off:
+                    break;
+                case LogLevel.Trace:
+                    this.logChannel.trace(message);
+                    break;
+                case LogLevel.Debug:
+                    this.logChannel.debug(message);
+                    break;
+                case LogLevel.Info:
+                    this.logChannel.info(message);
+                    break;
+                case LogLevel.Warning:
+                    this.logChannel.warn(message);
+                    break;
+                case LogLevel.Error:
+                    this.logChannel.error(message);
+                    break;
+                default:
+                    this.logChannel.appendLine(message);
+                    break;
+            }
+            resolve();
+        });
     }
+}
 
-    private showLogPanel(): void {
-        this.logChannel.show();
+/** Parses logs received via the legacy OutputChannel to LogOutputChannel with proper severity.
+ *
+ * HACK: This is for legacy compatability and can be removed when https://github.com/microsoft/vscode-languageserver-node/issues/1116 is merged and replaced with a normal LogOutputChannel. We don't use a middleware here because any direct logging calls like client.warn() and server-initiated messages would not be captured by middleware.
+ */
+export class LanguageClientOutputChannelAdapter implements LogOutputChannel {
+    private _channel: LogOutputChannel | undefined;
+    private get channel(): LogOutputChannel {
+        this._channel ??= window.createOutputChannel(this.channelName, {
+            log: true,
+        });
+        return this._channel;
     }
 
-    private async openLogFolder(): Promise<void> {
-        if (this.logDirectoryCreated) {
-            // Open the folder in VS Code since there isn't an easy way to
-            // open the folder in the platform's file browser
-            await vscode.commands.executeCommand("vscode.openFolder", this.logDirectoryPath, true);
-        } else {
-            void this.writeAndShowError("Cannot open PowerShell log directory as it does not exist!");
+    /**
+     * Creates an instance of the logging class.
+     *
+     * @param channelName - The name of the output channel.
+     * @param parser - A function that parses a log message and returns a tuple containing the parsed message and its log level, or undefined if the log should be filtered.
+     */
+    constructor(
+        private channelName: string,
+        private parser: (
+            message: string,
+        ) =>
+            | [string, LogLevel]
+            | undefined = LanguageClientOutputChannelAdapter.omnisharpLspParser.bind(
+            this,
+        ),
+    ) {}
+
+    public appendLine(message: string): void {
+        this.append(message);
+    }
+
+    public append(message: string): void {
+        const parseResult = this.parser(message);
+        if (parseResult !== undefined) {
+            this.sendLogMessage(...parseResult);
         }
     }
 
-    private static timestampMessage(message: string, level: LogLevel): string {
-        const now = new Date();
-        return `${now.toLocaleDateString()} ${now.toLocaleTimeString()} [${LogLevel[level].toUpperCase()}] - ${message}${os.EOL}`;
+    /** Converts from Omnisharp logs since middleware for LogMessage does not currently exist **/
+    public static omnisharpLspParser(message: string): [string, LogLevel] {
+        const logLevelMatch =
+            /^\[(?<level>Trace|Debug|Info|Warn|Error) +- \d+:\d+:\d+ [AP]M\] (?<message>.+)/.exec(
+                message,
+            );
+        const logLevel: LogLevel = logLevelMatch?.groups?.level
+            ? LogLevel[logLevelMatch.groups.level as keyof typeof LogLevel]
+            : LogLevel.Info;
+        const logMessage = logLevelMatch?.groups?.message ?? message;
+
+        return [logMessage, logLevel];
     }
 
-    // TODO: Should we await this function above?
-    private async writeLine(message: string, level: LogLevel = LogLevel.Normal): Promise<void> {
-        const timestampedMessage = Logger.timestampMessage(message, level);
-        this.logChannel.appendLine(timestampedMessage);
-        if (this.logLevel !== LogLevel.None) {
-            // A simple lock because this function isn't re-entrant.
-            while (this.writingLog) {
-                await utils.sleep(300);
-            }
-            try {
-                this.writingLog = true;
-                if (!this.logDirectoryCreated) {
-                    this.writeVerbose(`Creating log directory at: '${this.logDirectoryPath}'`);
-                    await vscode.workspace.fs.createDirectory(this.logDirectoryPath);
-                    this.logDirectoryCreated = true;
-                }
-                let log = new Uint8Array();
-                if (await utils.checkIfFileExists(this.logFilePath)) {
-                    log = await vscode.workspace.fs.readFile(this.logFilePath);
-                }
-                await vscode.workspace.fs.writeFile(
-                    this.logFilePath,
-                    Buffer.concat([log, Buffer.from(timestampedMessage)]));
-            } catch (err) {
-                console.log(`Error writing to vscode-powershell log file: ${err}`);
-            } finally {
-                this.writingLog = false;
-            }
+    protected sendLogMessage(message: string, level: LogLevel): void {
+        switch (level) {
+            case LogLevel.Trace:
+                this.channel.trace(message);
+                break;
+            case LogLevel.Debug:
+                this.channel.debug(message);
+                break;
+            case LogLevel.Info:
+                this.channel.info(message);
+                break;
+            case LogLevel.Warning:
+                this.channel.warn(message);
+                break;
+            case LogLevel.Error:
+                this.channel.error(message);
+                break;
+            default:
+                this.channel.error("!UNKNOWN LOG LEVEL!: " + message);
+                break;
         }
     }
+
+    // #region Passthru Implementation
+    public get name(): string {
+        // prevents the window from being created unless we get a log request
+        return this.channelName;
+    }
+    public get logLevel(): LogLevel {
+        return this.channel.logLevel;
+    }
+    replace(value: string): void {
+        this.channel.replace(value);
+    }
+    show(_column?: undefined, preserveFocus?: boolean): void {
+        this.channel.show(preserveFocus);
+    }
+    public get onDidChangeLogLevel(): Event<LogLevel> {
+        return this.channel.onDidChangeLogLevel;
+    }
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    public trace(message: string, ...args: any[]): void {
+        this.channel.trace(message, ...args);
+    }
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    public debug(message: string, ...args: any[]): void {
+        this.channel.debug(message, ...args);
+    }
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    public info(message: string, ...args: any[]): void {
+        this.channel.info(message, ...args);
+    }
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    public warn(message: string, ...args: any[]): void {
+        this.channel.warn(message, ...args);
+    }
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    public error(message: string, ...args: any[]): void {
+        this.channel.error(message, ...args);
+    }
+    public clear(): void {
+        this.channel.clear();
+    }
+    public hide(): void {
+        this.channel.hide();
+    }
+    public dispose(): void {
+        this.channel.dispose();
+    }
+    // #endregion
+}
+
+/** Special parsing for PowerShell Editor Services LSP messages since the LogLevel cannot be read due to vscode
+ * LanguageClient Limitations (https://github.com/microsoft/vscode-languageserver-node/issues/1116)
+ */
+export function PsesParser(message: string): [string, LogLevel] {
+    const logLevelMatch =
+        /^<(?<level>Trace|Debug|Info|Warning|Error)>(?<message>.+)/.exec(
+            message,
+        );
+    const logLevel: LogLevel = logLevelMatch?.groups?.level
+        ? LogLevel[logLevelMatch.groups.level as keyof typeof LogLevel]
+        : LogLevel.Info;
+    const logMessage = logLevelMatch?.groups?.message ?? message;
+
+    return ["[PSES] " + logMessage, logLevel];
+}
+
+/** Lsp Trace Parser that does some additional parsing and formatting to make it look nicer */
+export function LspTraceParser(message: string): [string, LogLevel] {
+    let [parsedMessage, level] =
+        LanguageClientOutputChannelAdapter.omnisharpLspParser(message);
+    if (parsedMessage.startsWith("Sending ")) {
+        parsedMessage = parsedMessage.replace("Sending", "➡️");
+        level = LogLevel.Debug;
+    }
+    if (parsedMessage.startsWith("Received ")) {
+        parsedMessage = parsedMessage.replace("Received", "⬅️");
+        level = LogLevel.Debug;
+    }
+    if (
+        parsedMessage.startsWith("Params:") ||
+        parsedMessage.startsWith("Result:")
+    ) {
+        level = LogLevel.Trace;
+    }
+
+    // These are PSES messages that get logged to the output channel anyways so we drop these to trace for easy noise filtering
+    if (parsedMessage.startsWith("⬅️ notification 'window/logMessage'")) {
+        level = LogLevel.Trace;
+    }
+
+    return [parsedMessage.trimEnd(), level];
 }
diff --git a/src/platform.ts b/src/platform.ts
index 5e63dca6bd..76ca5992ed 100644
--- a/src/platform.ts
+++ b/src/platform.ts
@@ -4,15 +4,16 @@
 import * as os from "os";
 import * as path from "path";
 import * as process from "process";
-import vscode = require("vscode");
-import { integer } from "vscode-languageserver-protocol";
-import { ILogger } from "./logging";
-import { changeSetting, getSettings, PowerShellAdditionalExePathSettings } from "./settings";
 import untildify from "untildify";
-
-// This uses require so we can rewire it in unit tests!
-// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-var-requires
-const utils = require("./utils");
+import { integer } from "vscode-languageserver-protocol";
+import type { ILogger } from "./logging";
+import {
+    changeSetting,
+    getSettings,
+    type PowerShellAdditionalExePathSettings,
+} from "./settings";
+import * as utils from "./utils";
+import vscode = require("vscode");
 
 const WindowsPowerShell64BitLabel = "Windows PowerShell (x64)";
 const WindowsPowerShell32BitLabel = "Windows PowerShell (x86)";
@@ -26,6 +27,10 @@ const SnapPreviewExePath = "/snap/bin/pwsh-preview";
 const MacOSExePath = "/usr/local/bin/pwsh";
 const MacOSPreviewExePath = "/usr/local/bin/pwsh-preview";
 
+const MacOSHomebrewExePath = "/opt/homebrew/bin/pwsh";
+const MacOSHomebrewLTSExePath = "/opt/homebrew/bin/pwsh-lts";
+const MacOSHomebrewPreviewExePath = "/opt/homebrew/bin/pwsh-preview";
+
 export enum OperatingSystem {
     Unknown,
     Windows,
@@ -56,11 +61,12 @@ export function getPlatformDetails(): IPlatformDetails {
         operatingSystem = OperatingSystem.Linux;
     }
 
-    const isProcess64Bit = (process.arch === "x64" || process.arch === "arm64");
+    const isProcess64Bit = process.arch === "x64" || process.arch === "arm64";
 
     return {
         operatingSystem,
-        isOS64Bit: isProcess64Bit || (process.env.PROCESSOR_ARCHITEW6432 !== undefined),
+        isOS64Bit:
+            isProcess64Bit || process.env.PROCESSOR_ARCHITEW6432 !== undefined,
         isProcess64Bit,
     };
 }
@@ -88,12 +94,15 @@ export class PowerShellExeFinder {
         private platformDetails: IPlatformDetails,
         // Additional configured PowerShells
         private additionalPowerShellExes: PowerShellAdditionalExePathSettings,
-        private logger: ILogger) { }
+        private logger?: ILogger,
+    ) {}
 
     /**
      * Returns the first available PowerShell executable found in the search order.
      */
-    public async getFirstAvailablePowerShellInstallation(): Promise<IPowerShellExeDetails | undefined> {
+    public async getFirstAvailablePowerShellInstallation(): Promise<
+        IPowerShellExeDetails | undefined
+    > {
         for await (const pwsh of this.enumeratePowerShellInstallations()) {
             return pwsh;
         }
@@ -103,7 +112,9 @@ export class PowerShellExeFinder {
     /**
      * Get an array of all PowerShell executables found when searching for PowerShell installations.
      */
-    public async getAllAvailablePowerShellInstallations(): Promise<IPowerShellExeDetails[]> {
+    public async getAllAvailablePowerShellInstallations(): Promise<
+        IPowerShellExeDetails[]
+    > {
         const array: IPowerShellExeDetails[] = [];
         for await (const pwsh of this.enumeratePowerShellInstallations()) {
             array.push(pwsh);
@@ -115,7 +126,9 @@ export class PowerShellExeFinder {
      * Fixes PowerShell paths when Windows PowerShell is set to the non-native bitness.
      * @param configuredPowerShellPath the PowerShell path configured by the user.
      */
-    public fixWindowsPowerShellPath(configuredPowerShellPath: string): string | undefined {
+    public fixWindowsPowerShellPath(
+        configuredPowerShellPath: string,
+    ): string | undefined {
         const altWinPS = this.findWinPS({ useAlternateBitness: true });
 
         if (!altWinPS) {
@@ -123,7 +136,8 @@ export class PowerShellExeFinder {
         }
 
         const lowerAltWinPSPath = altWinPS.exePath.toLocaleLowerCase();
-        const lowerConfiguredPath = configuredPowerShellPath.toLocaleLowerCase();
+        const lowerConfiguredPath =
+            configuredPowerShellPath.toLocaleLowerCase();
 
         if (lowerConfiguredPath === lowerAltWinPSPath) {
             return this.findWinPS()?.exePath;
@@ -141,24 +155,32 @@ export class PowerShellExeFinder {
     public async *enumeratePowerShellInstallations(): AsyncIterable<IPowerShellExeDetails> {
         // Get the default PowerShell installations first
         for await (const defaultPwsh of this.enumerateDefaultPowerShellInstallations()) {
-            if (defaultPwsh && await defaultPwsh.exists()) {
+            if (defaultPwsh && (await defaultPwsh.exists())) {
                 yield defaultPwsh;
             }
         }
 
         // Also show any additionally configured PowerShells
         // These may be duplicates of the default installations, but given a different name.
-        for (const additionalPwsh of this.enumerateAdditionalPowerShellInstallations()) {
+        for await (const additionalPwsh of this.enumerateAdditionalPowerShellInstallations()) {
             if (await additionalPwsh.exists()) {
                 yield additionalPwsh;
             } else if (!additionalPwsh.suppressWarning) {
                 const message = `Additional PowerShell '${additionalPwsh.displayName}' not found at '${additionalPwsh.exePath}'!`;
-                this.logger.writeWarning(message);
+                this.logger?.writeWarning(message);
 
                 if (!getSettings().suppressAdditionalExeNotFoundWarning) {
-                    const selection = await vscode.window.showWarningMessage(message, "Don't Show Again");
+                    const selection = await vscode.window.showWarningMessage(
+                        message,
+                        "Don't Show Again",
+                    );
                     if (selection !== undefined) {
-                        await changeSetting("suppressAdditionalExeNotFoundWarning", true, true, this.logger);
+                        await changeSetting(
+                            "suppressAdditionalExeNotFoundWarning",
+                            true,
+                            true,
+                            this.logger,
+                        );
                     }
                 }
             }
@@ -169,25 +191,34 @@ export class PowerShellExeFinder {
      * Iterates through all the possible well-known PowerShell installations on a machine.
      * Returned values may not exist, but come with an .exists property
      * which will check whether the executable exists.
+     * TODO: We really need to define the order in which we search for stable/LTS/preview/daily
      */
-    private async *enumerateDefaultPowerShellInstallations(): AsyncIterable<IPossiblePowerShellExe | undefined> {
+    private async *enumerateDefaultPowerShellInstallations(): AsyncIterable<
+        IPossiblePowerShellExe | undefined
+    > {
         // Find PSCore stable first
         yield this.findPSCoreStable();
 
         switch (this.platformDetails.operatingSystem) {
-        case OperatingSystem.Linux:
-            // On Linux, find the snap
-            yield this.findPSCoreStableSnap();
-            break;
-
-        case OperatingSystem.Windows:
-            // Windows may have a 32-bit pwsh.exe
-            yield this.findPSCoreWindowsInstallation({ useAlternateBitness: true });
-
-            // Also look for the MSIX/UWP installation
-            yield await this.findPSCoreMsix();
-
-            break;
+            case OperatingSystem.Linux:
+                // On Linux, find the snap
+                yield this.findPSCoreStableSnap();
+                break;
+
+            case OperatingSystem.Windows:
+                // Windows may have a 32-bit pwsh.exe
+                yield this.findPSCoreWindowsInstallation({
+                    useAlternateBitness: true,
+                });
+                // Also look for the MSIX/UWP installation
+                yield await this.findPSCoreMsix();
+                break;
+
+            case OperatingSystem.MacOS:
+                // On MacOS, find the Homebrew installations
+                yield this.findPSCoreHomebrewStable();
+                yield this.findPSCoreHomebrewLTS();
+                break;
         }
 
         // Look for the .NET global tool
@@ -199,27 +230,35 @@ export class PowerShellExeFinder {
         yield this.findPSCorePreview();
 
         switch (this.platformDetails.operatingSystem) {
-        // On Linux, there might be a preview snap
-        case OperatingSystem.Linux:
-            yield this.findPSCorePreviewSnap();
-            break;
+            // On Linux, there might be a preview snap
+            case OperatingSystem.Linux:
+                yield this.findPSCorePreviewSnap();
+                break;
 
-        case OperatingSystem.Windows:
-            // Find a preview MSIX
-            yield this.findPSCoreMsix({ findPreview: true });
+            case OperatingSystem.Windows:
+                // Find a preview MSIX
+                yield this.findPSCoreMsix({ findPreview: true });
 
-            // Look for pwsh-preview with the opposite bitness
-            yield this.findPSCoreWindowsInstallation({ useAlternateBitness: true, findPreview: true });
+                // Look for pwsh-preview with the opposite bitness
+                yield this.findPSCoreWindowsInstallation({
+                    useAlternateBitness: true,
+                    findPreview: true,
+                });
 
-            // Finally, get Windows PowerShell
+                // Finally, get Windows PowerShell
 
-            // Get the natural Windows PowerShell for the process bitness
-            yield this.findWinPS();
+                // Get the natural Windows PowerShell for the process bitness
+                yield this.findWinPS();
 
-            // Get the alternate bitness Windows PowerShell
-            yield this.findWinPS({ useAlternateBitness: true });
+                // Get the alternate bitness Windows PowerShell
+                yield this.findWinPS({ useAlternateBitness: true });
 
-            break;
+                break;
+
+            case OperatingSystem.MacOS:
+                // On MacOS, find the Homebrew preview
+                yield this.findPSCoreHomebrewPreview();
+                break;
         }
 
         // Look for PSCore daily
@@ -230,178 +269,322 @@ export class PowerShellExeFinder {
      * Iterates through the configured additional PowerShell executable locations,
      * without checking for their existence.
      */
-    private *enumerateAdditionalPowerShellInstallations(): Iterable<IPossiblePowerShellExe> {
+    public async *enumerateAdditionalPowerShellInstallations(): AsyncIterable<IPossiblePowerShellExe> {
         for (const versionName in this.additionalPowerShellExes) {
-            if (Object.prototype.hasOwnProperty.call(this.additionalPowerShellExes, versionName)) {
-                let exePath: string | undefined = utils.stripQuotePair(this.additionalPowerShellExes[versionName]);
+            if (
+                Object.prototype.hasOwnProperty.call(
+                    this.additionalPowerShellExes,
+                    versionName,
+                )
+            ) {
+                let exePath: string | undefined = utils.stripQuotePair(
+                    this.additionalPowerShellExes[versionName],
+                );
                 if (!exePath) {
                     continue;
                 }
 
                 exePath = untildify(exePath);
+                const args: [string, undefined, boolean, boolean] =
+                    // Must be a tuple type and is suppressing the warning
+                    [versionName, undefined, true, true];
 
-                // Always search for what the user gave us first
-                yield new PossiblePowerShellExe(exePath, versionName);
+                // Always search for what the user gave us first, but with the warning
+                // suppressed so we can display it after all possibilities are exhausted
+                let pwsh = new PossiblePowerShellExe(exePath, ...args);
+                if (await pwsh.exists()) {
+                    yield pwsh;
+                    continue;
+                }
 
                 // Also search for `pwsh[.exe]` and `powershell[.exe]` if missing
-                const args: [string, undefined, boolean, boolean]
-                    // Must be a tuple type and is suppressing the warning
-                    = [versionName, undefined, true, true];
-
-                // Handle Windows where '.exe' and 'powershell' are things
-                if (this.platformDetails.operatingSystem === OperatingSystem.Windows) {
-                    if (!exePath.endsWith("pwsh.exe") && !exePath.endsWith("powershell.exe")) {
-                        if (exePath.endsWith("pwsh") || exePath.endsWith("powershell")) {
+                if (
+                    this.platformDetails.operatingSystem ===
+                    OperatingSystem.Windows
+                ) {
+                    // Handle Windows where '.exe' and 'powershell' are things
+                    if (
+                        !exePath.endsWith("pwsh.exe") &&
+                        !exePath.endsWith("powershell.exe")
+                    ) {
+                        if (
+                            exePath.endsWith("pwsh") ||
+                            exePath.endsWith("powershell")
+                        ) {
                             // Add extension if that was missing
-                            yield new PossiblePowerShellExe(exePath + ".exe", ...args);
+                            pwsh = new PossiblePowerShellExe(
+                                exePath + ".exe",
+                                ...args,
+                            );
+                            if (await pwsh.exists()) {
+                                yield pwsh;
+                                continue;
+                            }
                         }
                         // Also add full exe names (this isn't an else just in case
                         // the folder was named "pwsh" or "powershell")
-                        yield new PossiblePowerShellExe(path.join(exePath, "pwsh.exe"), ...args);
-                        yield new PossiblePowerShellExe(path.join(exePath, "powershell.exe"), ...args);
+                        pwsh = new PossiblePowerShellExe(
+                            path.join(exePath, "pwsh.exe"),
+                            ...args,
+                        );
+                        if (await pwsh.exists()) {
+                            yield pwsh;
+                            continue;
+                        }
+                        pwsh = new PossiblePowerShellExe(
+                            path.join(exePath, "powershell.exe"),
+                            ...args,
+                        );
+                        if (await pwsh.exists()) {
+                            yield pwsh;
+                            continue;
+                        }
+                    }
+                } else if (!exePath.endsWith("pwsh")) {
+                    // Always just 'pwsh' on non-Windows
+                    pwsh = new PossiblePowerShellExe(
+                        path.join(exePath, "pwsh"),
+                        ...args,
+                    );
+                    if (await pwsh.exists()) {
+                        yield pwsh;
+                        continue;
                     }
-                } else if (!exePath.endsWith("pwsh")) { // Always just 'pwsh' on non-Windows
-                    yield new PossiblePowerShellExe(path.join(exePath, "pwsh"), ...args);
                 }
+
+                // If we're still being iterated over, no permutation of the given path existed so yield an object with the warning unsuppressed
+                yield new PossiblePowerShellExe(
+                    exePath,
+                    versionName,
+                    false,
+                    undefined,
+                    false,
+                );
             }
         }
     }
 
-    private async findPSCoreStable(): Promise<IPossiblePowerShellExe | undefined> {
+    private async findPSCoreStable(): Promise<
+        IPossiblePowerShellExe | undefined
+    > {
         switch (this.platformDetails.operatingSystem) {
-        case OperatingSystem.Linux:
-            return new PossiblePowerShellExe(LinuxExePath, "PowerShell");
+            case OperatingSystem.Linux:
+                return new PossiblePowerShellExe(LinuxExePath, "PowerShell");
 
-        case OperatingSystem.MacOS:
-            return new PossiblePowerShellExe(MacOSExePath, "PowerShell");
+            case OperatingSystem.MacOS:
+                return new PossiblePowerShellExe(MacOSExePath, "PowerShell");
 
-        case OperatingSystem.Windows:
-            return await this.findPSCoreWindowsInstallation();
+            case OperatingSystem.Windows:
+                return await this.findPSCoreWindowsInstallation();
 
-        case OperatingSystem.Unknown:
-            return undefined;
+            case OperatingSystem.Unknown:
+                return undefined;
         }
     }
 
-    private async findPSCorePreview(): Promise<IPossiblePowerShellExe | undefined> {
+    private async findPSCorePreview(): Promise<
+        IPossiblePowerShellExe | undefined
+    > {
         switch (this.platformDetails.operatingSystem) {
-        case OperatingSystem.Linux:
-            return new PossiblePowerShellExe(LinuxPreviewExePath, "PowerShell Preview");
-
-        case OperatingSystem.MacOS:
-            return new PossiblePowerShellExe(MacOSPreviewExePath, "PowerShell Preview");
-
-        case OperatingSystem.Windows:
-            return await this.findPSCoreWindowsInstallation({ findPreview: true });
-
-        case OperatingSystem.Unknown:
-            return undefined;
+            case OperatingSystem.Linux:
+                return new PossiblePowerShellExe(
+                    LinuxPreviewExePath,
+                    "PowerShell Preview",
+                );
+
+            case OperatingSystem.MacOS:
+                return new PossiblePowerShellExe(
+                    MacOSPreviewExePath,
+                    "PowerShell Preview",
+                );
+
+            case OperatingSystem.Windows:
+                return await this.findPSCoreWindowsInstallation({
+                    findPreview: true,
+                });
+
+            case OperatingSystem.Unknown:
+                return undefined;
         }
     }
 
     /**
-    * If the daily was installed via 'https://aka.ms/install-powershell.ps1', then
-    * this is the default installation location:
-    *
-    * if ($IsWinEnv) {
-    *     $Destination = "$env:LOCALAPPDATA\Microsoft\powershell"
-    * } else {
-    *     $Destination = "~/.powershell"
-    * }
-    *
-    * if ($Daily) {
-    *     $Destination = "${Destination}-daily"
-    * }
-    */
+     * If the daily was installed via 'https://aka.ms/install-powershell.ps1', then
+     * this is the default installation location:
+     *
+     * if ($IsWinEnv) {
+     *     $Destination = "$env:LOCALAPPDATA\Microsoft\powershell"
+     * } else {
+     *     $Destination = "~/.powershell"
+     * }
+     *
+     * if ($Daily) {
+     *     $Destination = "${Destination}-daily"
+     * }
+     *
+     * TODO: Remove this after the daily is officially no longer supported.
+     */
     private findPSCoreDaily(): IPossiblePowerShellExe | undefined {
         switch (this.platformDetails.operatingSystem) {
-        case OperatingSystem.Linux:
-        case OperatingSystem.MacOS: {
-            const exePath = path.join(os.homedir(), ".powershell-daily", "pwsh");
-            return new PossiblePowerShellExe(exePath, "PowerShell Daily");
-        }
+            case OperatingSystem.Linux:
+            case OperatingSystem.MacOS: {
+                const exePath = path.join(
+                    os.homedir(),
+                    ".powershell-daily",
+                    "pwsh",
+                );
+                return new PossiblePowerShellExe(exePath, "PowerShell Daily");
+            }
 
-        case OperatingSystem.Windows: {
-            // We can't proceed if there's no LOCALAPPDATA path
-            if (!process.env.LOCALAPPDATA) {
-                return undefined;
+            case OperatingSystem.Windows: {
+                // We can't proceed if there's no LOCALAPPDATA path
+                if (!process.env.LOCALAPPDATA) {
+                    return undefined;
+                }
+                const exePath = path.join(
+                    process.env.LOCALAPPDATA,
+                    "Microsoft",
+                    "powershell-daily",
+                    "pwsh.exe",
+                );
+                return new PossiblePowerShellExe(exePath, "PowerShell Daily");
             }
-            const exePath = path.join(process.env.LOCALAPPDATA, "Microsoft", "powershell-daily", "pwsh.exe");
-            return new PossiblePowerShellExe(exePath, "PowerShell Daily");
-        }
 
-        case OperatingSystem.Unknown:
-            return undefined;
+            case OperatingSystem.Unknown:
+                return undefined;
         }
     }
 
-    private findPSCoreDotnetGlobalTool(): IPossiblePowerShellExe {
-        const exeName: string = this.platformDetails.operatingSystem === OperatingSystem.Windows
-            ? "pwsh.exe"
-            : "pwsh";
+    // The Homebrew installations of PowerShell on Apple Silicon are no longer in the default PATH.
+    private findPSCoreHomebrewStable(): IPossiblePowerShellExe {
+        return new PossiblePowerShellExe(
+            MacOSHomebrewExePath,
+            "PowerShell (Homebrew)",
+        );
+    }
+
+    private findPSCoreHomebrewLTS(): IPossiblePowerShellExe {
+        return new PossiblePowerShellExe(
+            MacOSHomebrewLTSExePath,
+            "PowerShell LTS (Homebrew)",
+        );
+    }
 
-        const dotnetGlobalToolExePath: string = path.join(os.homedir(), ".dotnet", "tools", exeName);
+    private findPSCoreHomebrewPreview(): IPossiblePowerShellExe {
+        return new PossiblePowerShellExe(
+            MacOSHomebrewPreviewExePath,
+            "PowerShell Preview (Homebrew)",
+        );
+    }
+
+    private findPSCoreDotnetGlobalTool(): IPossiblePowerShellExe {
+        const exeName: string =
+            this.platformDetails.operatingSystem === OperatingSystem.Windows
+                ? "pwsh.exe"
+                : "pwsh";
+
+        const dotnetGlobalToolExePath: string = path.join(
+            os.homedir(),
+            ".dotnet",
+            "tools",
+            exeName,
+        );
 
         // The dotnet installed version of PowerShell does not support proper argument parsing, and so it fails with our multi-line startup banner.
-        return new PossiblePowerShellExe(dotnetGlobalToolExePath, ".NET Core PowerShell Global Tool", undefined, false);
+        return new PossiblePowerShellExe(
+            dotnetGlobalToolExePath,
+            ".NET Core PowerShell Global Tool",
+            undefined,
+            false,
+        );
     }
 
-    private async findPSCoreMsix({ findPreview }: { findPreview?: boolean } = {}): Promise<IPossiblePowerShellExe | undefined> {
+    private async findPSCoreMsix({
+        findPreview,
+    }: { findPreview?: boolean } = {}): Promise<
+        IPossiblePowerShellExe | undefined
+    > {
         // We can't proceed if there's no LOCALAPPDATA path
         if (!process.env.LOCALAPPDATA) {
             return undefined;
         }
 
         // Find the base directory for MSIX application exe shortcuts
-        const msixAppDir = path.join(process.env.LOCALAPPDATA, "Microsoft", "WindowsApps");
+        const msixAppDir = path.join(
+            process.env.LOCALAPPDATA,
+            "Microsoft",
+            "WindowsApps",
+        );
 
-        if (!await utils.checkIfDirectoryExists(msixAppDir)) {
+        if (!(await utils.checkIfDirectoryExists(msixAppDir))) {
             return undefined;
         }
 
         // Define whether we're looking for the preview or the stable
         const { pwshMsixDirRegex, pwshMsixName } = findPreview
-            ? { pwshMsixDirRegex: PowerShellExeFinder.PwshPreviewMsixRegex, pwshMsixName: "PowerShell Preview (Store)" }
-            : { pwshMsixDirRegex: PowerShellExeFinder.PwshMsixRegex, pwshMsixName: "PowerShell (Store)" };
+            ? {
+                  pwshMsixDirRegex: PowerShellExeFinder.PwshPreviewMsixRegex,
+                  pwshMsixName: "PowerShell Preview (Store)",
+              }
+            : {
+                  pwshMsixDirRegex: PowerShellExeFinder.PwshMsixRegex,
+                  pwshMsixName: "PowerShell (Store)",
+              };
 
         // We should find only one such application, so return on the first one
         for (const name of await utils.readDirectory(msixAppDir)) {
             if (pwshMsixDirRegex.test(name)) {
-                return new PossiblePowerShellExe(path.join(msixAppDir, name, "pwsh.exe"), pwshMsixName);
+                return new PossiblePowerShellExe(
+                    path.join(msixAppDir, name, "pwsh.exe"),
+                    pwshMsixName,
+                );
             }
         }
 
         return undefined;
     }
 
+    // TODO: Are snaps still a thing?
     private findPSCoreStableSnap(): IPossiblePowerShellExe {
         return new PossiblePowerShellExe(SnapExePath, "PowerShell Snap");
     }
 
     private findPSCorePreviewSnap(): IPossiblePowerShellExe {
-        return new PossiblePowerShellExe(SnapPreviewExePath, "PowerShell Preview Snap");
+        return new PossiblePowerShellExe(
+            SnapPreviewExePath,
+            "PowerShell Preview Snap",
+        );
     }
 
-    private async findPSCoreWindowsInstallation(
-        { useAlternateBitness = false, findPreview = false }:
-            { useAlternateBitness?: boolean; findPreview?: boolean } = {}): Promise<IPossiblePowerShellExe | undefined> {
-
-        const programFilesPath = this.getProgramFilesPath({ useAlternateBitness });
+    private async findPSCoreWindowsInstallation({
+        useAlternateBitness = false,
+        findPreview = false,
+    }: { useAlternateBitness?: boolean; findPreview?: boolean } = {}): Promise<
+        IPossiblePowerShellExe | undefined
+    > {
+        const programFilesPath = this.getProgramFilesPath({
+            useAlternateBitness,
+        });
 
         if (!programFilesPath) {
             return undefined;
         }
 
-        const powerShellInstallBaseDir = path.join(programFilesPath, "PowerShell");
+        const powerShellInstallBaseDir = path.join(
+            programFilesPath,
+            "PowerShell",
+        );
 
         // Ensure the base directory exists
-        if (!await utils.checkIfDirectoryExists(powerShellInstallBaseDir)) {
+        if (!(await utils.checkIfDirectoryExists(powerShellInstallBaseDir))) {
             return undefined;
         }
 
         let highestSeenVersion = -1;
         let pwshExePath: string | undefined;
-        for (const item of await utils.readDirectory(powerShellInstallBaseDir)) {
+        for (const item of await utils.readDirectory(
+            powerShellInstallBaseDir,
+        )) {
             let currentVersion = -1;
             if (findPreview) {
                 // We are looking for something like "7-preview"
@@ -439,8 +622,12 @@ export class PowerShellExeFinder {
             }
 
             // Now look for the file
-            const exePath = path.join(powerShellInstallBaseDir, item, "pwsh.exe");
-            if (!await utils.checkIfFileExists(exePath)) {
+            const exePath = path.join(
+                powerShellInstallBaseDir,
+                item,
+                "pwsh.exe",
+            );
+            if (!(await utils.checkIfFileExists(exePath))) {
                 continue;
             }
 
@@ -458,25 +645,40 @@ export class PowerShellExeFinder {
 
         const preview: string = findPreview ? " Preview" : "";
 
-        return new PossiblePowerShellExe(pwshExePath, `PowerShell${preview} ${bitness}`);
+        return new PossiblePowerShellExe(
+            pwshExePath,
+            `PowerShell${preview} ${bitness}`,
+        );
     }
 
-    private findWinPS({ useAlternateBitness = false }: { useAlternateBitness?: boolean } = {}): IPossiblePowerShellExe | undefined {
-
+    private findWinPS({
+        useAlternateBitness = false,
+    }: { useAlternateBitness?: boolean } = {}):
+        | IPossiblePowerShellExe
+        | undefined {
         // 32-bit OSes only have one WinPS on them
         if (!this.platformDetails.isOS64Bit && useAlternateBitness) {
             return undefined;
         }
 
-        let winPS = useAlternateBitness ? this.alternateBitnessWinPS : this.winPS;
+        let winPS = useAlternateBitness
+            ? this.alternateBitnessWinPS
+            : this.winPS;
         if (winPS === undefined) {
-            const systemFolderPath = this.getSystem32Path({ useAlternateBitness });
+            const systemFolderPath = this.getSystem32Path({
+                useAlternateBitness,
+            });
 
             if (!systemFolderPath) {
                 return undefined;
             }
 
-            const winPSPath = path.join(systemFolderPath, "WindowsPowerShell", "v1.0", "powershell.exe");
+            const winPSPath = path.join(
+                systemFolderPath,
+                "WindowsPowerShell",
+                "v1.0",
+                "powershell.exe",
+            );
 
             let displayName: string;
             if (this.platformDetails.isProcess64Bit) {
@@ -503,9 +705,9 @@ export class PowerShellExeFinder {
         return winPS;
     }
 
-    private getProgramFilesPath(
-        { useAlternateBitness = false }: { useAlternateBitness?: boolean } = {}): string | undefined {
-
+    private getProgramFilesPath({
+        useAlternateBitness = false,
+    }: { useAlternateBitness?: boolean } = {}): string | undefined {
         if (!useAlternateBitness) {
             // Just use the native system bitness
             return process.env.ProgramFiles;
@@ -525,7 +727,9 @@ export class PowerShellExeFinder {
         return undefined;
     }
 
-    private getSystem32Path({ useAlternateBitness = false }: { useAlternateBitness?: boolean } = {}): string | undefined {
+    private getSystem32Path({
+        useAlternateBitness = false,
+    }: { useAlternateBitness?: boolean } = {}): string | undefined {
         const windir = process.env.windir;
 
         if (!windir) {
@@ -552,15 +756,19 @@ export class PowerShellExeFinder {
     }
 }
 
-export function getWindowsSystemPowerShellPath(systemFolderName: string): string | undefined {
+export function getWindowsSystemPowerShellPath(
+    systemFolderName: string,
+): string | undefined {
     if (process.env.windir === undefined) {
         return undefined;
-    } else return path.join(
-        process.env.windir,
-        systemFolderName,
-        "WindowsPowerShell",
-        "v1.0",
-        "powershell.exe");
+    } else
+        return path.join(
+            process.env.windir,
+            systemFolderName,
+            "WindowsPowerShell",
+            "v1.0",
+            "powershell.exe",
+        );
 }
 
 interface IPossiblePowerShellExe extends IPowerShellExeDetails {
@@ -574,12 +782,11 @@ class PossiblePowerShellExe implements IPossiblePowerShellExe {
         public readonly displayName: string,
         private knownToExist?: boolean,
         public readonly supportsProperArguments = true,
-        public readonly suppressWarning = false) { }
+        public readonly suppressWarning = false,
+    ) {}
 
     public async exists(): Promise<boolean> {
-        if (this.knownToExist === undefined) {
-            this.knownToExist = await utils.checkIfFileExists(this.exePath);
-        }
+        this.knownToExist ??= await utils.checkIfFileExists(this.exePath);
         return this.knownToExist ?? false;
     }
 }
diff --git a/src/process.ts b/src/process.ts
index d363c8e2ee..75314d882c 100644
--- a/src/process.ts
+++ b/src/process.ts
@@ -4,16 +4,13 @@
 import cp = require("child_process");
 import path = require("path");
 import vscode = require("vscode");
-import { ILogger } from "./logging";
+import { promisify } from "util";
+import type { ILogger } from "./logging";
+import type { IEditorServicesSessionDetails } from "./session";
 import { Settings, validateCwdSetting } from "./settings";
 import utils = require("./utils");
-import { IEditorServicesSessionDetails } from "./session";
-import { promisify } from "util";
 
 export class PowerShellProcess {
-    // This is used to warn the user that the extension is taking longer than expected to startup.
-    private static warnUserThreshold = 30;
-
     private static title = "PowerShell Extension";
 
     public onExited: vscode.Event<void>;
@@ -23,6 +20,7 @@ export class PowerShellProcess {
     private consoleCloseSubscription?: vscode.Disposable;
 
     private pid?: number;
+    private pidUpdateEmitter?: vscode.EventEmitter<number | undefined>;
 
     constructor(
         public exePath: string,
@@ -30,28 +28,35 @@ export class PowerShellProcess {
         private isTemp: boolean,
         private shellIntegrationEnabled: boolean,
         private logger: ILogger,
+        private logDirectoryPath: vscode.Uri,
         private startPsesArgs: string,
         private sessionFilePath: vscode.Uri,
-        private sessionSettings: Settings) {
-
+        private sessionSettings: Settings,
+        private devMode = false,
+    ) {
         this.onExitedEmitter = new vscode.EventEmitter<void>();
         this.onExited = this.onExitedEmitter.event;
+        this.pidUpdateEmitter = new vscode.EventEmitter<number | undefined>();
     }
 
-    public async start(cancellationToken: vscode.CancellationToken): Promise<IEditorServicesSessionDetails | undefined> {
-        const psesModulePath =
-            path.resolve(
-                __dirname,
-                this.bundledModulesPath,
-                "PowerShellEditorServices/PowerShellEditorServices.psd1");
+    public async start(
+        cancellationToken: vscode.CancellationToken,
+    ): Promise<IEditorServicesSessionDetails | undefined> {
+        const psesModulePath = path.resolve(
+            __dirname,
+            this.bundledModulesPath,
+            "PowerShellEditorServices/PowerShellEditorServices.psd1",
+        );
 
         const featureFlags =
             this.sessionSettings.developer.featureFlags.length > 0
-                ? this.sessionSettings.developer.featureFlags.map((f) => `'${f}'`).join(", ")
+                ? this.sessionSettings.developer.featureFlags
+                      .map((f) => `'${f}'`)
+                      .join(", ")
                 : "";
 
         this.startPsesArgs +=
-            `-LogPath '${utils.escapeSingleQuotes(this.logger.logDirectoryPath.fsPath)}' ` +
+            `-LogPath '${utils.escapeSingleQuotes(this.logDirectoryPath.fsPath)}' ` +
             `-SessionDetailsPath '${utils.escapeSingleQuotes(this.sessionFilePath.fsPath)}' ` +
             `-FeatureFlags @(${featureFlags}) `;
 
@@ -62,8 +67,8 @@ export class PowerShellProcess {
         const powerShellArgs: string[] = [];
 
         const useLoginShell: boolean =
-            (utils.isMacOS && this.sessionSettings.startAsLoginShell.osx)
-            || (utils.isLinux && this.sessionSettings.startAsLoginShell.linux);
+            (utils.isMacOS && this.sessionSettings.startAsLoginShell.osx) ||
+            (utils.isLinux && this.sessionSettings.startAsLoginShell.linux);
 
         if (useLoginShell && this.isLoginShell(this.exePath)) {
             // This MUST be the first argument.
@@ -73,71 +78,100 @@ export class PowerShellProcess {
         powerShellArgs.push("-NoProfile");
 
         // Only add ExecutionPolicy param on Windows
-        if (utils.isWindows && this.sessionSettings.developer.setExecutionPolicy) {
+        if (
+            utils.isWindows &&
+            this.sessionSettings.developer.setExecutionPolicy
+        ) {
             powerShellArgs.push("-ExecutionPolicy", "Bypass");
         }
 
-        const startEditorServices = "Import-Module '" +
+        const startEditorServices =
+            "Import-Module '" +
             utils.escapeSingleQuotes(psesModulePath) +
-            "'; Start-EditorServices " + this.startPsesArgs;
+            "'; Start-EditorServices " +
+            this.startPsesArgs;
 
         // On Windows we unfortunately can't Base64 encode the startup command
         // because it annoys some poorly implemented anti-virus scanners.
         if (utils.isWindows) {
-            powerShellArgs.push(
-                "-Command",
-                startEditorServices);
+            powerShellArgs.push("-Command", startEditorServices);
         } else {
             // Otherwise use -EncodedCommand for better quote support.
-            this.logger.writeVerbose("Using Base64 -EncodedCommand but logging as -Command equivalent.");
+            this.logger.writeDebug(
+                "Using Base64 -EncodedCommand but logging as -Command equivalent.",
+            );
             powerShellArgs.push(
                 "-EncodedCommand",
-                Buffer.from(startEditorServices, "utf16le").toString("base64"));
+                Buffer.from(startEditorServices, "utf16le").toString("base64"),
+            );
         }
 
-        this.logger.writeVerbose(`Starting process: ${this.exePath} ${powerShellArgs.slice(0, -2).join(" ")} -Command ${startEditorServices}`);
+        this.logger.writeDebug(
+            `Starting process: ${this.exePath} ${powerShellArgs.slice(0, -2).join(" ")} -Command ${startEditorServices}`,
+        );
 
         // Make sure no old session file exists
         await this.deleteSessionFile(this.sessionFilePath);
 
         // When VS Code shell integration is enabled, the script expects certain
         // variables to be added to the environment.
-        let envMixin = undefined;
+        let envMixin = {};
         if (this.shellIntegrationEnabled) {
             envMixin = {
-                "VSCODE_INJECTION": "1",
+                VSCODE_INJECTION: "1",
                 // There is no great way to check if we are running stable VS
                 // Code. Since this is used to disable experimental features, we
                 // default to stable unless we're definitely running Insiders.
-                "VSCODE_STABLE": vscode.env.appName.includes("Insiders") ? "0" : "1",
+                VSCODE_STABLE: vscode.env.appName.includes("Insiders")
+                    ? "0"
+                    : "1",
                 // Maybe one day we can set VSCODE_NONCE...
             };
         }
 
+        // Enables Hot Reload in .NET for the attached process
+        // https://devblogs.microsoft.com/devops/net-enc-support-for-lambdas-and-other-improvements-in-visual-studio-2015/
+        if (this.devMode) {
+            (envMixin as Record<string, string>).COMPLUS_FORCEENC = "1";
+        }
+
         // Launch PowerShell in the integrated terminal
         const terminalOptions: vscode.TerminalOptions = {
-            name: this.isTemp ? `${PowerShellProcess.title} (TEMP)` : PowerShellProcess.title,
+            name: this.isTemp
+                ? `${PowerShellProcess.title} (TEMP)`
+                : PowerShellProcess.title,
             shellPath: this.exePath,
             shellArgs: powerShellArgs,
             cwd: await validateCwdSetting(this.logger),
             env: envMixin,
             iconPath: new vscode.ThemeIcon("terminal-powershell"),
             isTransient: true,
-            hideFromUser: this.sessionSettings.integratedConsole.startInBackground,
-            location: vscode.TerminalLocation[this.sessionSettings.integratedConsole.startLocation],
+            hideFromUser:
+                this.sessionSettings.integratedConsole.startInBackground,
+            location:
+                vscode.TerminalLocation[
+                    this.sessionSettings.integratedConsole.startLocation
+                ],
         };
 
         // Subscribe a log event for when the terminal closes (this fires for
         // all terminals and the event itself checks if it's our terminal). This
         // subscription should happen before we create the terminal so if it
         // fails immediately, the event fires.
-        this.consoleCloseSubscription = vscode.window.onDidCloseTerminal((terminal) => { this.onTerminalClose(terminal); });
+        this.consoleCloseSubscription = vscode.window.onDidCloseTerminal(
+            (terminal) => {
+                this.onTerminalClose(terminal);
+            },
+        );
         this.consoleTerminal = vscode.window.createTerminal(terminalOptions);
         this.pid = await this.getPid();
         this.logger.write(`PowerShell process started with PID: ${this.pid}`);
+        this.pidUpdateEmitter?.fire(this.pid);
 
-        if (this.sessionSettings.integratedConsole.showOnStartup
-            && !this.sessionSettings.integratedConsole.startInBackground) {
+        if (
+            this.sessionSettings.integratedConsole.showOnStartup &&
+            !this.sessionSettings.integratedConsole.startInBackground
+        ) {
             // We still need to run this to set the active terminal to the extension terminal.
             this.consoleTerminal.show(true);
         }
@@ -159,7 +193,12 @@ export class PowerShellProcess {
     // This function should only be used after a failure has occurred because it is slow!
     public async getVersionCli(): Promise<string> {
         const exec = promisify(cp.execFile);
-        const { stdout } = await exec(this.exePath, ["-NoProfile", "-NoLogo", "-Command", "$PSVersionTable.PSVersion.ToString()"]);
+        const { stdout } = await exec(this.exePath, [
+            "-NoProfile",
+            "-NoLogo",
+            "-Command",
+            "$PSVersionTable.PSVersion.ToString()",
+        ]);
         return stdout.trim();
     }
 
@@ -173,7 +212,9 @@ export class PowerShellProcess {
     }
 
     public dispose(): void {
-        this.logger.writeVerbose(`Disposing PowerShell process with PID: ${this.pid}`);
+        this.logger.writeDebug(
+            `Disposing PowerShell process with PID: ${this.pid}`,
+        );
 
         void this.deleteSessionFile(this.sessionFilePath);
 
@@ -185,6 +226,9 @@ export class PowerShellProcess {
 
         this.consoleCloseSubscription?.dispose();
         this.consoleCloseSubscription = undefined;
+
+        this.pidUpdateEmitter?.dispose();
+        this.pidUpdateEmitter = undefined;
     }
 
     public sendKeyPress(): void {
@@ -201,19 +245,30 @@ export class PowerShellProcess {
             // So we try to start PowerShell with -Login
             // If it exits successfully, we return true
             // If it exits unsuccessfully, node throws, we catch, and return false
-            cp.execFileSync(pwshPath, ["-Login", "-NoProfile", "-NoLogo", "-Command", "exit 0"]);
+            cp.execFileSync(pwshPath, [
+                "-Login",
+                "-NoProfile",
+                "-NoLogo",
+                "-Command",
+                "exit 0",
+            ]);
         } catch {
             return false;
         }
         return true;
     }
 
-    private async readSessionFile(sessionFilePath: vscode.Uri): Promise<IEditorServicesSessionDetails> {
-        const fileContents = await vscode.workspace.fs.readFile(sessionFilePath);
+    private async readSessionFile(
+        sessionFilePath: vscode.Uri,
+    ): Promise<IEditorServicesSessionDetails> {
+        const fileContents =
+            await vscode.workspace.fs.readFile(sessionFilePath);
         return JSON.parse(fileContents.toString());
     }
 
-    private async deleteSessionFile(sessionFilePath: vscode.Uri): Promise<void> {
+    private async deleteSessionFile(
+        sessionFilePath: vscode.Uri,
+    ): Promise<void> {
         try {
             await vscode.workspace.fs.delete(sessionFilePath);
         } catch {
@@ -221,15 +276,22 @@ export class PowerShellProcess {
         }
     }
 
-    private async waitForSessionFile(cancellationToken: vscode.CancellationToken): Promise<IEditorServicesSessionDetails | undefined> {
-        const numOfTries = this.sessionSettings.developer.waitForSessionFileTimeoutSeconds;
-        const warnAt = numOfTries - PowerShellProcess.warnUserThreshold;
+    private async waitForSessionFile(
+        cancellationToken: vscode.CancellationToken,
+    ): Promise<IEditorServicesSessionDetails | undefined> {
+        const numOfTries = // We sleep for 1/5 of a second each try
+            5 * this.sessionSettings.developer.waitForSessionFileTimeoutSeconds;
+        const warnAt = numOfTries - 5 * 30; // Warn at 30 seconds
 
         // Check every second.
-        this.logger.writeVerbose(`Waiting for session file: ${this.sessionFilePath}`);
+        this.logger.writeDebug(
+            `Waiting for session file: ${this.sessionFilePath}`,
+        );
         for (let i = numOfTries; i > 0; i--) {
             if (cancellationToken.isCancellationRequested) {
-                this.logger.writeWarning("Canceled while waiting for session file.");
+                this.logger.writeWarning(
+                    "Canceled while waiting for session file.",
+                );
                 return undefined;
             }
 
@@ -239,16 +301,18 @@ export class PowerShellProcess {
             }
 
             if (await utils.checkIfFileExists(this.sessionFilePath)) {
-                this.logger.writeVerbose("Session file found.");
+                this.logger.writeDebug("Session file found.");
                 return await this.readSessionFile(this.sessionFilePath);
             }
 
             if (warnAt === i) {
-                void this.logger.writeAndShowWarning("Loading the PowerShell extension is taking longer than expected. If you're using privilege enforcement software, this can affect start up performance.");
+                void this.logger.writeAndShowWarning(
+                    "Loading the PowerShell extension is taking longer than expected. If you're using privilege enforcement software, this can affect start up performance.",
+                );
             }
 
-            // Wait a bit and try again.
-            await utils.sleep(1000);
+            // Wait 1/5 of a second and try again
+            await utils.sleep(200);
         }
 
         this.logger.writeError("Timed out waiting for session file!");
@@ -260,7 +324,9 @@ export class PowerShellProcess {
             return;
         }
 
-        this.logger.writeWarning(`PowerShell process terminated or Extension Terminal was closed, PID: ${this.pid}`);
+        this.logger.writeWarning(
+            `PowerShell process terminated or Extension Terminal was closed, PID: ${this.pid}`,
+        );
         this.dispose();
     }
 }
diff --git a/src/session.ts b/src/session.ts
index 71164b4564..df8fd9fbe9 100644
--- a/src/session.ts
+++ b/src/session.ts
@@ -4,27 +4,52 @@
 import net = require("net");
 import path = require("path");
 import vscode = require("vscode");
-import TelemetryReporter, { TelemetryEventProperties, TelemetryEventMeasurements } from "@vscode/extension-telemetry";
+import TelemetryReporter, {
+    type TelemetryEventMeasurements,
+    type TelemetryEventProperties,
+} from "@vscode/extension-telemetry";
 import { Message } from "vscode-jsonrpc";
-import { ILogger } from "./logging";
+import {
+    type ILogger,
+    LanguageClientOutputChannelAdapter,
+    LspTraceParser,
+    PsesParser,
+} from "./logging";
 import { PowerShellProcess } from "./process";
-import { Settings, changeSetting, getSettings, getEffectiveConfigurationTarget, validateCwdSetting } from "./settings";
+import {
+    Settings,
+    changeSetting,
+    getEffectiveConfigurationTarget,
+    getSettings,
+    validateCwdSetting,
+} from "./settings";
 import utils = require("./utils");
 
 import {
-    CloseAction, CloseHandlerResult, DocumentSelector, ErrorAction, ErrorHandlerResult,
-    LanguageClientOptions, Middleware, NotificationType,
-    RequestType0, ResolveCodeLensSignature, RevealOutputChannelOn
+    CloseAction,
+    type CloseHandlerResult,
+    DocumentSelector,
+    ErrorAction,
+    type ErrorHandlerResult,
+    type LanguageClientOptions,
+    type Middleware,
+    NotificationType,
+    RequestType0,
+    type ResolveCodeLensSignature,
+    RevealOutputChannelOn,
 } from "vscode-languageclient";
-import { LanguageClient, StreamInfo } from "vscode-languageclient/node";
+import { LanguageClient, type StreamInfo } from "vscode-languageclient/node";
 
+import { SemVer, satisfies } from "semver";
 import { UpdatePowerShell } from "./features/UpdatePowerShell";
+import { LanguageClientConsumer } from "./languageClientConsumer";
 import {
-    getPlatformDetails, IPlatformDetails, IPowerShellExeDetails,
-    OperatingSystem, PowerShellExeFinder
+    type IPlatformDetails,
+    type IPowerShellExeDetails,
+    OperatingSystem,
+    PowerShellExeFinder,
+    getPlatformDetails,
 } from "./platform";
-import { LanguageClientConsumer } from "./languageClientConsumer";
-import { SemVer, satisfies } from "semver";
 
 enum SessionStatus {
     NotStarted = "Not Started",
@@ -58,17 +83,21 @@ export interface IPowerShellVersionDetails {
     architecture: string;
 }
 
-export type IReadSessionFileCallback = (details: IEditorServicesSessionDetails) => void;
+export type IReadSessionFileCallback = (
+    details: IEditorServicesSessionDetails,
+) => void;
 
-export const SendKeyPressNotificationType =
-    new NotificationType<void>("powerShell/sendKeyPress");
+export const SendKeyPressNotificationType = new NotificationType<void>(
+    "powerShell/sendKeyPress",
+);
 
 export const ExecutionBusyStatusNotificationType =
     new NotificationType<boolean>("powerShell/executionBusyStatus");
 
-export const PowerShellVersionRequestType =
-    new RequestType0<IPowerShellVersionDetails, void>(
-        "powerShell/getVersion");
+export const PowerShellVersionRequestType = new RequestType0<
+    IPowerShellVersionDetails,
+    void
+>("powerShell/getVersion");
 
 export class SessionManager implements Middleware {
     public HostName: string;
@@ -90,9 +119,12 @@ export class SessionManager implements Middleware {
     private sessionsFolder: vscode.Uri;
     private sessionStatus: SessionStatus = SessionStatus.NotStarted;
     private shellIntegrationEnabled = false;
-    private startCancellationTokenSource: vscode.CancellationTokenSource | undefined;
+    private startCancellationTokenSource:
+        | vscode.CancellationTokenSource
+        | undefined;
     private suppressRestartPrompt = false;
     private versionDetails: IPowerShellVersionDetails | undefined;
+    private traceLogLevelHandler?: vscode.Disposable;
 
     constructor(
         private extensionContext: vscode.ExtensionContext,
@@ -103,13 +135,16 @@ export class SessionManager implements Middleware {
         displayName: string,
         hostVersion: string,
         publisher: string,
-        private telemetryReporter: TelemetryReporter) {
-
+        private telemetryReporter: TelemetryReporter,
+    ) {
         // Create the language status item
         this.languageStatusItem = this.createStatusBarItem();
         // We have to override the scheme because it defaults to
         // 'vscode-userdata' which breaks UNC paths.
-        this.sessionsFolder = vscode.Uri.joinPath(extensionContext.globalStorageUri.with({ scheme: "file" }), "sessions");
+        this.sessionsFolder = vscode.Uri.joinPath(
+            extensionContext.globalStorageUri.with({ scheme: "file" }),
+            "sessions",
+        );
 
         this.platformDetails = getPlatformDetails();
         this.HostName = hostName;
@@ -118,12 +153,15 @@ export class SessionManager implements Middleware {
         this.Publisher = publisher;
 
         const osBitness = this.platformDetails.isOS64Bit ? "64-bit" : "32-bit";
-        const procBitness = this.platformDetails.isProcess64Bit ? "64-bit" : "32-bit";
+        const procBitness = this.platformDetails.isProcess64Bit
+            ? "64-bit"
+            : "32-bit";
 
         this.logger.write(
-            `Visual Studio Code: v${vscode.version} ${procBitness}`
-            + ` on ${OperatingSystem[this.platformDetails.operatingSystem]} ${osBitness}`,
-            `${this.DisplayName} Extension: v${this.HostVersion}`);
+            `Visual Studio Code: v${vscode.version} ${procBitness}` +
+                ` on ${OperatingSystem[this.platformDetails.operatingSystem]} ${osBitness}`,
+            `${this.DisplayName} Extension: v${this.HostVersion}`,
+        );
 
         // Fix the host version so that PowerShell can consume it.
         // This is needed when the extension uses a prerelease
@@ -151,38 +189,41 @@ export class SessionManager implements Middleware {
     // We've made this function idempotent, so it can used to ensure the session has started.
     public async start(): Promise<void> {
         switch (this.sessionStatus) {
-        case SessionStatus.NotStarted:
-            // Go ahead and start.
-            break;
-        case SessionStatus.Starting:
-            // A simple lock because this function isn't re-entrant.
-            this.logger.writeWarning("Re-entered 'start' so waiting...");
-            await this.waitWhileStarting();
-            return;
-        case SessionStatus.Running:
-            // We're started, just return.
-            this.logger.writeVerbose("Already started.");
-            return;
-        case SessionStatus.Busy:
-            // We're started but busy so notify and return.
-            // TODO: Make a proper notification for this and when IntelliSense is blocked.
-            this.logger.write("The Extension Terminal is currently busy, please wait for your task to finish!");
-            return;
-        case SessionStatus.Stopping:
-            // Wait until done stopping, then start.
-            this.logger.writeVerbose("Still stopping.");
-            await this.waitWhileStopping();
-            break;
-        case SessionStatus.Failed:
-            // Try to start again.
-            this.logger.writeVerbose("Previously failed, starting again.");
-            break;
+            case SessionStatus.NotStarted:
+                // Go ahead and start.
+                break;
+            case SessionStatus.Starting:
+                // A simple lock because this function isn't re-entrant.
+                this.logger.writeWarning("Re-entered 'start' so waiting...");
+                await this.waitWhileStarting();
+                return;
+            case SessionStatus.Running:
+                // We're started, just return.
+                this.logger.writeDebug("Already started.");
+                return;
+            case SessionStatus.Busy:
+                // We're started but busy so notify and return.
+                // TODO: Make a proper notification for this and when IntelliSense is blocked.
+                this.logger.write(
+                    "The Extension Terminal is currently busy, please wait for your task to finish!",
+                );
+                return;
+            case SessionStatus.Stopping:
+                // Wait until done stopping, then start.
+                this.logger.writeDebug("Still stopping.");
+                await this.waitWhileStopping();
+                break;
+            case SessionStatus.Failed:
+                // Try to start again.
+                this.logger.writeDebug("Previously failed, starting again.");
+                break;
         }
 
         // This status needs to be set immediately so the above check works
         this.setSessionStatus("Starting...", SessionStatus.Starting);
 
-        this.startCancellationTokenSource = new vscode.CancellationTokenSource();
+        this.startCancellationTokenSource =
+            new vscode.CancellationTokenSource();
         const cancellationToken = this.startCancellationTokenSource.token;
 
         // Create a folder for the session files.
@@ -192,31 +233,41 @@ export class SessionManager implements Middleware {
         await this.migrateWhitespaceAroundPipeSetting();
 
         // Update non-PowerShell settings.
-        this.shellIntegrationEnabled = vscode.workspace.getConfiguration("terminal.integrated.shellIntegration").get<boolean>("enabled") ?? false;
+        this.shellIntegrationEnabled =
+            vscode.workspace
+                .getConfiguration("terminal.integrated.shellIntegration")
+                .get<boolean>("enabled") ?? false;
 
         // Find the PowerShell executable to use for the server.
         this.PowerShellExeDetails = await this.findPowerShell();
 
         if (this.PowerShellExeDetails === undefined) {
-            const message = "Unable to find PowerShell!"
-                + " Do you have it installed?"
-                + " You can also configure custom installations"
-                + " with the 'powershell.powerShellAdditionalExePaths' setting.";
+            const message =
+                "Unable to find PowerShell!" +
+                " Do you have it installed?" +
+                " You can also configure custom installations" +
+                " with the 'powershell.powerShellAdditionalExePaths' setting.";
             void this.setSessionFailedGetPowerShell(message);
             return;
         }
 
         // Refresh the status with the found executable details.
         this.refreshSessionStatus();
-        this.logger.write(`Starting '${this.PowerShellExeDetails.displayName}' at: ${this.PowerShellExeDetails.exePath}`);
+        this.logger.write(
+            `Starting '${this.PowerShellExeDetails.displayName}' at: ${this.PowerShellExeDetails.exePath}`,
+        );
 
         // Start the server.
         this.languageServerProcess = await this.startLanguageServerProcess(
             this.PowerShellExeDetails,
-            cancellationToken);
+            cancellationToken,
+        );
 
         // Check that we got session details and that they had a "started" status.
-        if (this.sessionDetails === undefined || !this.sessionStarted(this.sessionDetails)) {
+        if (
+            this.sessionDetails === undefined ||
+            !this.sessionStarted(this.sessionDetails)
+        ) {
             if (!cancellationToken.isCancellationRequested) {
                 // If it failed but we didn't cancel it, handle the common reasons.
                 await this.handleFailedProcess(this.languageServerProcess);
@@ -227,20 +278,32 @@ export class SessionManager implements Middleware {
         }
 
         // If we got good session details from the server, try to connect to it.
-        this.languageClient = await this.startLanguageClient(this.sessionDetails);
+        this.languageClient = await this.startLanguageClient(
+            this.sessionDetails,
+        );
 
         if (this.languageClient.isRunning()) {
             this.versionDetails = await this.getVersionDetails();
             if (this.versionDetails === undefined) {
-                void this.setSessionFailedOpenBug("Unable to get version details!");
+                void this.setSessionFailedOpenBug(
+                    "Unable to get version details!",
+                );
                 return;
             }
 
-            this.logger.write(`Started PowerShell v${this.versionDetails.version}.`);
+            this.logger.write(
+                `Started PowerShell v${this.versionDetails.version}.`,
+            );
             this.setSessionRunningStatus(); // Yay, we made it!
 
+            await this.writePidIfInDevMode(this.languageServerProcess);
+
             // Fire and forget the updater.
-            const updater = new UpdatePowerShell(this.sessionSettings, this.logger, this.versionDetails);
+            const updater = new UpdatePowerShell(
+                this.sessionSettings,
+                this.logger,
+                this.versionDetails,
+            );
             void updater.checkForUpdate();
         } else {
             void this.setSessionFailedOpenBug("Never finished startup!");
@@ -256,10 +319,12 @@ export class SessionManager implements Middleware {
         try {
             // If the stop fails, so will the dispose, I think this is a bug in
             // the client library.
-            await this.languageClient?.stop(3000);
+            await this.languageClient?.stop(2000);
             await this.languageClient?.dispose();
         } catch (err) {
-            this.logger.writeError(`Error occurred while stopping language client:\n${err}`);
+            this.logger.writeError(
+                `Error occurred while stopping language client:\n${err}`,
+            );
         }
 
         this.languageClient = undefined;
@@ -277,6 +342,8 @@ export class SessionManager implements Middleware {
         this.startCancellationTokenSource?.dispose();
         this.startCancellationTokenSource = undefined;
         this.sessionDetails = undefined;
+        this.traceLogLevelHandler?.dispose();
+        this.traceLogLevelHandler = undefined;
 
         this.setSessionStatus("Not Started", SessionStatus.NotStarted);
     }
@@ -291,7 +358,9 @@ export class SessionManager implements Middleware {
         if (exeNameOverride) {
             // Reset the version and PowerShell details since we're launching a
             // new executable.
-            this.logger.writeVerbose(`Starting with executable overriden to: ${exeNameOverride}`);
+            this.logger.writeDebug(
+                `Starting with executable overriden to: ${exeNameOverride}`,
+            );
             this.sessionSettings.powerShellDefaultVersion = exeNameOverride;
             this.versionDetails = undefined;
             this.PowerShellExeDetails = undefined;
@@ -300,80 +369,136 @@ export class SessionManager implements Middleware {
         await this.start();
     }
 
+    /** In Development mode, write the PID to a file where the parent session can find it, to attach the dotnet debugger. */
+    private async writePidIfInDevMode(
+        pwshProcess: PowerShellProcess,
+    ): Promise<void> {
+        if (
+            this.extensionContext.extensionMode !==
+            vscode.ExtensionMode.Development
+        ) {
+            return;
+        }
+        const parentSessionId = process.env.VSCODE_PARENT_SESSION_ID;
+        const pidFilePath = vscode.Uri.joinPath(
+            this.sessionsFolder,
+            `PSES-${parentSessionId}.pid`,
+        );
+
+        if (parentSessionId === undefined) {
+            return;
+        }
+
+        const fs = vscode.workspace.fs;
+        const pid = (await pwshProcess.getPid())!.toString();
+        await fs.writeFile(pidFilePath, Buffer.from(pid));
+        const deletePidOnExit = pwshProcess.onExited(() => {
+            deletePidOnExit.dispose();
+            fs.delete(pidFilePath, { useTrash: false });
+            console.log(`Deleted PID file: ${pidFilePath}`);
+        });
+        this.registeredCommands.push(deletePidOnExit);
+        this.extensionContext.subscriptions.push(deletePidOnExit);
+    }
+
     public getSessionDetails(): IEditorServicesSessionDetails | undefined {
         // This is used by the debugger which should have already called `start`.
         if (this.sessionDetails === undefined) {
-            void this.logger.writeAndShowError("PowerShell session unavailable for debugging!");
+            void this.logger.writeAndShowError(
+                "PowerShell session unavailable for debugging!",
+            );
         }
         return this.sessionDetails;
     }
 
     public async getLanguageServerPid(): Promise<number | undefined> {
         if (this.languageServerProcess === undefined) {
-            void this.logger.writeAndShowError("PowerShell Extension Terminal unavailable!");
+            void this.logger.writeAndShowError(
+                "PowerShell Extension Terminal unavailable!",
+            );
         }
         return this.languageServerProcess?.getPid();
     }
 
-    public getPowerShellVersionDetails(): IPowerShellVersionDetails | undefined {
+    public getPowerShellVersionDetails():
+        | IPowerShellVersionDetails
+        | undefined {
         return this.versionDetails;
     }
 
     private getNewSessionFilePath(): vscode.Uri {
         const uniqueId: number = Math.floor(100000 + Math.random() * 900000);
-        return vscode.Uri.joinPath(this.sessionsFolder, `PSES-VSCode-${process.env.VSCODE_PID}-${uniqueId}.json`);
+        return vscode.Uri.joinPath(
+            this.sessionsFolder,
+            `PSES-VSCode-${process.env.VSCODE_PID}-${uniqueId}.json`,
+        );
     }
 
-    public setLanguageClientConsumers(languageClientConsumers: LanguageClientConsumer[]): void {
+    public setLanguageClientConsumers(
+        languageClientConsumers: LanguageClientConsumer[],
+    ): void {
         this.languageClientConsumers = languageClientConsumers;
     }
 
-    public async createDebugSessionProcess(settings: Settings): Promise<PowerShellProcess> {
+    public async createDebugSessionProcess(
+        settings: Settings,
+        powershellExeName?: string,
+    ): Promise<PowerShellProcess> {
         // NOTE: We only support one temporary Extension Terminal at a time. To
         // support more, we need to track each separately, and tie the session
         // for the event handler to the right process (and dispose of the event
         // handler when the process is disposed).
         this.debugSessionProcess?.dispose();
         this.debugEventHandler?.dispose();
-
         if (this.PowerShellExeDetails === undefined) {
-            return Promise.reject(new Error("Required PowerShellExeDetails undefined!"));
+            return Promise.reject(
+                new Error("Required PowerShellExeDetails undefined!"),
+            );
         }
 
+        const debugPowerShellExeDetails =
+            powershellExeName === undefined
+                ? this.PowerShellExeDetails
+                : ((await this.findPowerShell(powershellExeName)) ??
+                  this.PowerShellExeDetails);
+
         // TODO: It might not be totally necessary to update the session
         // settings here, but I don't want to accidentally change this behavior
         // just yet. Working on getting things to be more idempotent!
         this.sessionSettings = settings;
 
         const bundledModulesPath = await this.getBundledModulesPath();
-        this.debugSessionProcess =
-            new PowerShellProcess(
-                this.PowerShellExeDetails.exePath,
+        this.debugSessionProcess = new PowerShellProcess(
+            debugPowerShellExeDetails.exePath,
+            bundledModulesPath,
+            true,
+            false,
+            this.logger,
+            this.extensionContext.logUri,
+            this.getEditorServicesArgs(
                 bundledModulesPath,
-                true,
-                false,
-                this.logger,
-                this.getEditorServicesArgs(bundledModulesPath, this.PowerShellExeDetails) + "-DebugServiceOnly ",
-                this.getNewSessionFilePath(),
-                this.sessionSettings);
+                this.PowerShellExeDetails,
+            ) + "-DebugServiceOnly ",
+            this.getNewSessionFilePath(),
+            this.sessionSettings,
+        );
 
         // Similar to the regular Extension Terminal, we need to send a key
         // press to the process spawned for temporary Extension Terminals when
         // the server requests a cancellation os Console.ReadKey.
-        this.debugEventHandler = vscode.debug.onDidReceiveDebugSessionCustomEvent(
-            e => {
+        this.debugEventHandler =
+            vscode.debug.onDidReceiveDebugSessionCustomEvent((e) => {
                 if (e.event === "powerShell/sendKeyPress") {
                     this.debugSessionProcess?.sendKeyPress();
                 }
-            }
-        );
+            });
 
         return this.debugSessionProcess;
     }
 
     public async waitUntilStarted(): Promise<void> {
         while (this.sessionStatus !== SessionStatus.Running) {
-            await utils.sleep(300);
+            await utils.sleep(200);
         }
     }
 
@@ -381,31 +506,39 @@ export class SessionManager implements Middleware {
     public resolveCodeLens(
         codeLens: vscode.CodeLens,
         token: vscode.CancellationToken,
-        next: ResolveCodeLensSignature): vscode.ProviderResult<vscode.CodeLens> {
+        next: ResolveCodeLensSignature,
+    ): vscode.ProviderResult<vscode.CodeLens> {
         const resolvedCodeLens = next(codeLens, token);
-        const resolveFunc =
-            (codeLensToFix: vscode.CodeLens): vscode.CodeLens => {
-                if (codeLensToFix.command?.command === "editor.action.showReferences") {
-                    const oldArgs = codeLensToFix.command.arguments;
-                    if (oldArgs === undefined || oldArgs.length < 3) {
-                        this.logger.writeError("Code Lens arguments were malformed!");
-                        return codeLensToFix;
-                    }
-
-                    // Our JSON objects don't get handled correctly by
-                    // VS Code's built in editor.action.showReferences
-                    // command so we need to convert them into the
-                    // appropriate types to send them as command
-                    // arguments.
+        const resolveFunc = (
+            codeLensToFix: vscode.CodeLens,
+        ): vscode.CodeLens => {
+            if (
+                codeLensToFix.command?.command ===
+                "editor.action.showReferences"
+            ) {
+                const oldArgs = codeLensToFix.command.arguments;
+                if (oldArgs === undefined || oldArgs.length < 3) {
+                    this.logger.writeError(
+                        "Code Lens arguments were malformed!",
+                    );
+                    return codeLensToFix;
+                }
 
-                    codeLensToFix.command.arguments = [
-                        vscode.Uri.parse(oldArgs[0]),
-                        new vscode.Position(oldArgs[1].line, oldArgs[1].character),
-                        oldArgs[2].map((position: {
+                // Our JSON objects don't get handled correctly by
+                // VS Code's built in editor.action.showReferences
+                // command so we need to convert them into the
+                // appropriate types to send them as command
+                // arguments.
+
+                codeLensToFix.command.arguments = [
+                    vscode.Uri.parse(oldArgs[0]),
+                    new vscode.Position(oldArgs[1].line, oldArgs[1].character),
+                    oldArgs[2].map(
+                        (position: {
                             uri: string;
                             range: {
-                                start: { line: number; character: number; };
-                                end: { line: number; character: number; };
+                                start: { line: number; character: number };
+                                end: { line: number; character: number };
                             };
                         }) => {
                             return new vscode.Location(
@@ -414,18 +547,23 @@ export class SessionManager implements Middleware {
                                     position.range.start.line,
                                     position.range.start.character,
                                     position.range.end.line,
-                                    position.range.end.character));
-                        }),
-                    ];
-                }
+                                    position.range.end.character,
+                                ),
+                            );
+                        },
+                    ),
+                ];
+            }
 
-                return codeLensToFix;
-            };
+            return codeLensToFix;
+        };
 
         // TODO: This makes zero sense, but appears to be "working" and copied by others per https://github.com/microsoft/vscode-languageserver-node/issues/495. Thing is, ESLint says these conditionals are always truthy.
         // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
         if ((resolvedCodeLens as Thenable<vscode.CodeLens>).then) {
-            return (resolvedCodeLens as Thenable<vscode.CodeLens>).then(resolveFunc);
+            return (resolvedCodeLens as Thenable<vscode.CodeLens>).then(
+                resolveFunc,
+            );
             // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
         } else if (resolvedCodeLens as vscode.CodeLens) {
             return resolveFunc(resolvedCodeLens as vscode.CodeLens);
@@ -438,87 +576,199 @@ export class SessionManager implements Middleware {
     // codeFormatting.whitespaceAroundPipe to new setting
     // codeFormatting.addWhitespaceAroundPipe.
     private async migrateWhitespaceAroundPipeSetting(): Promise<void> {
-        const configuration = vscode.workspace.getConfiguration(utils.PowerShellLanguageId);
+        const configuration = vscode.workspace.getConfiguration(
+            utils.PowerShellLanguageId,
+        );
         const deprecatedSetting = "codeFormatting.whitespaceAroundPipe";
         const newSetting = "codeFormatting.addWhitespaceAroundPipe";
-        const configurationTargetOfNewSetting = getEffectiveConfigurationTarget(newSetting);
-        const configurationTargetOfOldSetting = getEffectiveConfigurationTarget(deprecatedSetting);
-        if (configurationTargetOfOldSetting !== undefined && configurationTargetOfNewSetting === undefined) {
-            this.logger.writeWarning("Deprecated setting: whitespaceAroundPipe");
-            const value = configuration.get(deprecatedSetting, configurationTargetOfOldSetting);
-            await changeSetting(newSetting, value, configurationTargetOfOldSetting, this.logger);
-            await changeSetting(deprecatedSetting, undefined, configurationTargetOfOldSetting, this.logger);
+        const configurationTargetOfNewSetting =
+            getEffectiveConfigurationTarget(newSetting);
+        const configurationTargetOfOldSetting =
+            getEffectiveConfigurationTarget(deprecatedSetting);
+        if (
+            configurationTargetOfOldSetting !== undefined &&
+            configurationTargetOfNewSetting === undefined
+        ) {
+            this.logger.writeWarning(
+                "Deprecated setting: whitespaceAroundPipe",
+            );
+            const value = configuration.get(
+                deprecatedSetting,
+                configurationTargetOfOldSetting,
+            );
+            await changeSetting(
+                newSetting,
+                value,
+                configurationTargetOfOldSetting,
+                this.logger,
+            );
+            await changeSetting(
+                deprecatedSetting,
+                undefined,
+                configurationTargetOfOldSetting,
+                this.logger,
+            );
         }
     }
 
-    private async onConfigurationUpdated(): Promise<void> {
+    /** There are some changes we cannot "hot" set, so these require a restart of the session */
+    private async restartOnCriticalConfigChange(
+        changeEvent: vscode.ConfigurationChangeEvent,
+    ): Promise<void> {
+        if (this.suppressRestartPrompt) {
+            return;
+        }
+        if (this.sessionStatus !== SessionStatus.Running) {
+            return;
+        }
+
+        // Restart not needed if shell integration is enabled but the shell is backgrounded.
         const settings = getSettings();
-        const shellIntegrationEnabled = vscode.workspace.getConfiguration("terminal.integrated.shellIntegration").get<boolean>("enabled");
-        this.logger.updateLogLevel(settings.developer.editorServicesLogLevel);
+        if (
+            changeEvent.affectsConfiguration(
+                "terminal.integrated.shellIntegration.enabled",
+            )
+        ) {
+            const shellIntegrationEnabled =
+                vscode.workspace
+                    .getConfiguration("terminal.integrated.shellIntegration")
+                    .get<boolean>("enabled") ?? false;
+            if (
+                shellIntegrationEnabled &&
+                !settings.integratedConsole.startInBackground
+            ) {
+                return this.restartWithPrompt();
+            }
+        }
+
+        // Early return if the change doesn't affect the PowerShell extension settings from this point forward
+        if (!changeEvent.affectsConfiguration("powershell")) {
+            return;
+        }
 
         // Detect any setting changes that would affect the session.
-        if (!this.suppressRestartPrompt
-            && this.sessionStatus === SessionStatus.Running
-            && ((shellIntegrationEnabled !== this.shellIntegrationEnabled
-                && !settings.integratedConsole.startInBackground)
-            || settings.cwd !== this.sessionSettings.cwd
-            || settings.powerShellDefaultVersion !== this.sessionSettings.powerShellDefaultVersion
-            || settings.developer.editorServicesLogLevel !== this.sessionSettings.developer.editorServicesLogLevel
-            || settings.developer.bundledModulesPath !== this.sessionSettings.developer.bundledModulesPath
-            || settings.developer.editorServicesWaitForDebugger !== this.sessionSettings.developer.editorServicesWaitForDebugger
-            || settings.developer.setExecutionPolicy !== this.sessionSettings.developer.setExecutionPolicy
-            || settings.integratedConsole.useLegacyReadLine !== this.sessionSettings.integratedConsole.useLegacyReadLine
-            || settings.integratedConsole.startInBackground !== this.sessionSettings.integratedConsole.startInBackground
-            || settings.integratedConsole.startLocation !== this.sessionSettings.integratedConsole.startLocation)) {
-
-            this.logger.writeVerbose("Settings changed, prompting to restart...");
-            const response = await vscode.window.showInformationMessage(
-                "The PowerShell runtime configuration has changed, would you like to start a new session?",
-                "Yes", "No");
-
-            if (response === "Yes") {
-                await this.restartSession();
+        const coldRestartSettingNames = [
+            "developer.traceLsp",
+            "developer.traceDap",
+            "developer.editorServicesLogLevel",
+        ];
+        for (const settingName of coldRestartSettingNames) {
+            if (
+                changeEvent.affectsConfiguration(
+                    "powershell" + "." + settingName,
+                )
+            ) {
+                return this.restartWithPrompt();
             }
         }
+
+        // TODO: Migrate these to affectsConfiguration style above
+        if (
+            settings.cwd !== this.sessionSettings.cwd ||
+            settings.powerShellDefaultVersion !==
+                this.sessionSettings.powerShellDefaultVersion ||
+            settings.developer.bundledModulesPath !==
+                this.sessionSettings.developer.bundledModulesPath ||
+            settings.developer.editorServicesWaitForDebugger !==
+                this.sessionSettings.developer.editorServicesWaitForDebugger ||
+            settings.developer.setExecutionPolicy !==
+                this.sessionSettings.developer.setExecutionPolicy ||
+            settings.integratedConsole.useLegacyReadLine !==
+                this.sessionSettings.integratedConsole.useLegacyReadLine ||
+            settings.integratedConsole.startInBackground !==
+                this.sessionSettings.integratedConsole.startInBackground ||
+            settings.integratedConsole.startLocation !==
+                this.sessionSettings.integratedConsole.startLocation
+        ) {
+            return this.restartWithPrompt();
+        }
+    }
+
+    private async restartWithPrompt(): Promise<void> {
+        this.logger.writeDebug("Settings changed, prompting to restart...");
+        const response = await vscode.window.showInformationMessage(
+            "The PowerShell runtime configuration has changed, would you like to start a new session?",
+            "Yes",
+            "No",
+        );
+
+        if (response === "Yes") {
+            await this.restartSession();
+        }
     }
 
     private registerCommands(): void {
         this.registeredCommands = [
-            vscode.commands.registerCommand("PowerShell.RestartSession", async () => { await this.restartSession(); }),
-            vscode.commands.registerCommand(this.ShowSessionMenuCommandName, async () => { await this.showSessionMenu(); }),
-            vscode.workspace.onDidChangeConfiguration(async () => { await this.onConfigurationUpdated(); }),
             vscode.commands.registerCommand(
-                "PowerShell.ShowSessionConsole", (isExecute?: boolean) => { this.showSessionTerminal(isExecute); })
+                "PowerShell.RestartSession",
+                async () => {
+                    await this.restartSession();
+                },
+            ),
+            vscode.commands.registerCommand(
+                this.ShowSessionMenuCommandName,
+                async () => {
+                    await this.showSessionMenu();
+                },
+            ),
+            vscode.workspace.onDidChangeConfiguration((e) =>
+                this.restartOnCriticalConfigChange(e),
+            ),
+            vscode.commands.registerCommand(
+                "PowerShell.ShowSessionConsole",
+                (isExecute?: boolean) => {
+                    this.showSessionTerminal(isExecute);
+                },
+            ),
         ];
     }
 
-    private async findPowerShell(): Promise<IPowerShellExeDetails | undefined> {
-        this.logger.writeVerbose("Finding PowerShell...");
+    private async findPowerShell(
+        wantedName?: string,
+    ): Promise<IPowerShellExeDetails | undefined> {
+        this.logger.writeDebug("Finding PowerShell...");
         const powershellExeFinder = new PowerShellExeFinder(
             this.platformDetails,
             this.sessionSettings.powerShellAdditionalExePaths,
-            this.logger);
+            this.logger,
+        );
 
         let foundPowerShell: IPowerShellExeDetails | undefined;
         try {
             let defaultPowerShell: IPowerShellExeDetails | undefined;
-            const wantedName = this.sessionSettings.powerShellDefaultVersion;
+            wantedName ??= this.sessionSettings.powerShellDefaultVersion;
             if (wantedName !== "") {
                 for await (const details of powershellExeFinder.enumeratePowerShellInstallations()) {
                     // Need to compare names case-insensitively, from https://stackoverflow.com/a/2140723
-                    if (wantedName.localeCompare(details.displayName, undefined, { sensitivity: "accent" }) === 0) {
+                    if (
+                        wantedName.localeCompare(
+                            details.displayName,
+                            undefined,
+                            { sensitivity: "accent" },
+                        ) === 0
+                    ) {
                         defaultPowerShell = details;
                         break;
                     }
                 }
             }
-            foundPowerShell = defaultPowerShell ?? await powershellExeFinder.getFirstAvailablePowerShellInstallation();
-            if (wantedName !== "" && defaultPowerShell === undefined && foundPowerShell !== undefined) {
-                void this.logger.writeAndShowWarning(`The 'powerShellDefaultVersion' setting was '${wantedName}' but this was not found!`
-                    + ` Instead using first available installation '${foundPowerShell.displayName}' at '${foundPowerShell.exePath}'!`);
+            foundPowerShell =
+                defaultPowerShell ??
+                (await powershellExeFinder.getFirstAvailablePowerShellInstallation());
+            if (
+                wantedName !== "" &&
+                defaultPowerShell === undefined &&
+                foundPowerShell !== undefined
+            ) {
+                void this.logger.writeAndShowWarning(
+                    `The 'powerShellDefaultVersion' setting was '${wantedName}' but this was not found!` +
+                        ` Instead using first available installation '${foundPowerShell.displayName}' at '${foundPowerShell.exePath}'!`,
+                );
             }
         } catch (err) {
-            this.logger.writeError(`Error occurred while searching for a PowerShell executable:\n${err}`);
+            this.logger.writeError(
+                `Error occurred while searching for a PowerShell executable:\n${err}`,
+            );
         }
 
         return foundPowerShell;
@@ -526,109 +776,152 @@ export class SessionManager implements Middleware {
 
     private async startLanguageServerProcess(
         powerShellExeDetails: IPowerShellExeDetails,
-        cancellationToken: vscode.CancellationToken): Promise<PowerShellProcess> {
-
+        cancellationToken: vscode.CancellationToken,
+    ): Promise<PowerShellProcess> {
         const bundledModulesPath = await this.getBundledModulesPath();
 
         // Dispose any stale terminals from previous killed sessions.
         PowerShellProcess.cleanUpTerminals();
-        const languageServerProcess =
-            new PowerShellProcess(
-                powerShellExeDetails.exePath,
+        const languageServerProcess = new PowerShellProcess(
+            powerShellExeDetails.exePath,
+            bundledModulesPath,
+            false,
+            this.shellIntegrationEnabled,
+            this.logger,
+            this.extensionContext.logUri,
+            this.getEditorServicesArgs(
                 bundledModulesPath,
-                false,
-                this.shellIntegrationEnabled,
-                this.logger,
-                this.getEditorServicesArgs(bundledModulesPath, powerShellExeDetails),
-                this.getNewSessionFilePath(),
-                this.sessionSettings);
-
-        languageServerProcess.onExited(
-            () => {
-                LanguageClientConsumer.onLanguageClientExited();
-
-                if (this.sessionStatus === SessionStatus.Running
-                    || this.sessionStatus === SessionStatus.Busy) {
-                    this.setSessionStatus("Session Exited!", SessionStatus.Failed);
-                    void this.promptForRestart();
-                }
-            });
+                powerShellExeDetails,
+            ),
+            this.getNewSessionFilePath(),
+            this.sessionSettings,
+            this.extensionContext.extensionMode ==
+                vscode.ExtensionMode.Development,
+        );
 
-        this.sessionDetails = await languageServerProcess.start(cancellationToken);
+        languageServerProcess.onExited(() => {
+            LanguageClientConsumer.onLanguageClientExited();
+
+            if (
+                this.sessionStatus === SessionStatus.Running ||
+                this.sessionStatus === SessionStatus.Busy
+            ) {
+                this.setSessionStatus("Session Exited!", SessionStatus.Failed);
+                void this.promptForRestart();
+            }
+        });
+
+        this.sessionDetails =
+            await languageServerProcess.start(cancellationToken);
 
         return languageServerProcess;
     }
 
     // The process failed to start, so check for common user errors (generally
     // out-of-support versions of PowerShell).
-    private async handleFailedProcess(powerShellProcess: PowerShellProcess): Promise<void> {
+    private async handleFailedProcess(
+        powerShellProcess: PowerShellProcess,
+    ): Promise<void> {
         const version = await powerShellProcess.getVersionCli();
         let shouldUpdate = true;
 
         if (satisfies(version, "<5.1.0")) {
-            void this.setSessionFailedGetPowerShell(`PowerShell v${version} is not supported, please update!`);
+            void this.setSessionFailedGetPowerShell(
+                `PowerShell v${version} is not supported, please update!`,
+            );
         } else if (satisfies(version, ">=5.1.0 <6.0.0")) {
-            void this.setSessionFailedGetPowerShell("It looks like you're trying to use Windows PowerShell, which is supported on a best-effort basis. Can you try PowerShell 7?");
-        } else if (satisfies(version, ">=6.0.0 <7.2.0")) {
-            void this.setSessionFailedGetPowerShell(`PowerShell v${version} has reached end-of-support, please update!`);
+            void this.setSessionFailedGetPowerShell(
+                "It looks like you're trying to use Windows PowerShell, which is supported on a best-effort basis. Can you try PowerShell 7?",
+            );
+        } else if (satisfies(version, ">=6.0.0 <7.4.0")) {
+            void this.setSessionFailedGetPowerShell(
+                `PowerShell v${version} has reached end-of-support, please update!`,
+            );
         } else {
             shouldUpdate = false;
-            void this.setSessionFailedOpenBug("PowerShell Language Server process didn't start!");
+            void this.setSessionFailedOpenBug(
+                "PowerShell Language Server process didn't start!",
+            );
         }
 
         if (shouldUpdate) {
             // Run the update notifier since it won't run later as we failed
             // to start, but we have enough details to do so now.
             const versionDetails: IPowerShellVersionDetails = {
-                "version": version,
-                "edition": "", // Unused by UpdatePowerShell
-                "commit": version, // Actually used by UpdatePowerShell
-                "architecture": process.arch // Best guess based off Code's architecture
+                version: version,
+                edition: "", // Unused by UpdatePowerShell
+                commit: version, // Actually used by UpdatePowerShell
+                architecture: process.arch, // Best guess based off Code's architecture
             };
-            const updater = new UpdatePowerShell(this.sessionSettings, this.logger, versionDetails);
+            const updater = new UpdatePowerShell(
+                this.sessionSettings,
+                this.logger,
+                versionDetails,
+            );
             void updater.checkForUpdate();
         }
     }
 
-    private sessionStarted(sessionDetails: IEditorServicesSessionDetails): boolean {
-        this.logger.writeVerbose(`Session details: ${JSON.stringify(sessionDetails, undefined, 2)}`);
-        if (sessionDetails.status === "started") { // Successful server start with a session file
+    private sessionStarted(
+        sessionDetails: IEditorServicesSessionDetails,
+    ): boolean {
+        this.logger.writeDebug(
+            `Session details: ${JSON.stringify(sessionDetails, undefined, 2)}`,
+        );
+        if (sessionDetails.status === "started") {
+            // Successful server start with a session file
             return true;
         }
-        if (sessionDetails.status === "failed") { // Server started but indicated it failed
+        if (sessionDetails.status === "failed") {
+            // Server started but indicated it failed
             if (sessionDetails.reason === "powerShellVersion") {
-                void this.setSessionFailedGetPowerShell(`PowerShell ${sessionDetails.powerShellVersion} is not supported, please update!`);
-            } else if (sessionDetails.reason === "dotNetVersion") { // Only applies to PowerShell 5.1
-                void this.setSessionFailedGetDotNet(".NET Framework is out-of-date, please install at least 4.8!");
+                void this.setSessionFailedGetPowerShell(
+                    `PowerShell ${sessionDetails.powerShellVersion} is not supported, please update!`,
+                );
+            } else if (sessionDetails.reason === "dotNetVersion") {
+                // Only applies to PowerShell 5.1
+                void this.setSessionFailedGetDotNet(
+                    ".NET Framework is out-of-date, please install at least 4.8!",
+                );
             } else {
-                void this.setSessionFailedOpenBug(`PowerShell could not be started for an unknown reason: ${sessionDetails.reason}`);
+                void this.setSessionFailedOpenBug(
+                    `PowerShell could not be started for an unknown reason: ${sessionDetails.reason}`,
+                );
             }
         } else {
-            void this.setSessionFailedOpenBug(`PowerShell could not be started with an unknown status: ${sessionDetails.status}, and reason: ${sessionDetails.reason}`);
+            void this.setSessionFailedOpenBug(
+                `PowerShell could not be started with an unknown status: ${sessionDetails.status}, and reason: ${sessionDetails.reason}`,
+            );
         }
         return false;
     }
 
-    private async startLanguageClient(sessionDetails: IEditorServicesSessionDetails): Promise<LanguageClient> {
-        this.logger.writeVerbose("Connecting to language service...");
+    private async startLanguageClient(
+        sessionDetails: IEditorServicesSessionDetails,
+    ): Promise<LanguageClient> {
+        this.logger.writeDebug("Connecting to language service...");
         const connectFunc = (): Promise<StreamInfo> => {
-            return new Promise<StreamInfo>(
-                (resolve, _reject) => {
-                    const socket = net.connect(sessionDetails.languageServicePipeName);
-                    socket.on(
-                        "connect",
-                        () => {
-                            this.logger.writeVerbose("Language service connected.");
-                            resolve({ writer: socket, reader: socket });
-                        });
+            return new Promise<StreamInfo>((resolve, _reject) => {
+                const socket = net.connect(
+                    sessionDetails.languageServicePipeName,
+                );
+                socket.on("connect", () => {
+                    this.logger.writeDebug("Language service connected.");
+                    resolve({ writer: socket, reader: socket });
                 });
+            });
         };
+
         const clientOptions: LanguageClientOptions = {
             documentSelector: this.documentSelector,
             synchronize: {
                 // TODO: This is deprecated and they should be pulled by the server.
                 // backend uses "files" and "search" to ignore references.
-                configurationSection: [utils.PowerShellLanguageId, "files", "search"],
+                configurationSection: [
+                    utils.PowerShellLanguageId,
+                    "files",
+                    "search",
+                ],
                 // TODO: fileEvents: vscode.workspace.createFileSystemWatcher('**/.eslintrc')
             },
             // NOTE: Some settings are only applicable on startup, so we send them during initialization.
@@ -638,30 +931,53 @@ export class SessionManager implements Middleware {
                 enableProfileLoading: this.sessionSettings.enableProfileLoading,
                 initialWorkingDirectory: await validateCwdSetting(this.logger),
                 shellIntegrationScript: this.shellIntegrationEnabled
-                    ? utils.ShellIntegrationScript : "",
+                    ? utils.ShellIntegrationScript
+                    : "",
             },
             errorHandler: {
                 // Override the default error handler to prevent it from
                 // closing the LanguageClient incorrectly when the socket
                 // hangs up (ECONNRESET errors).
-                error: (_error: Error, _message: Message, _count: number): ErrorHandlerResult => {
+                error: (
+                    _error: Error,
+                    _message: Message,
+                    _count: number,
+                ): ErrorHandlerResult => {
                     // TODO: Is there any error worth terminating on?
+                    this.logger.writeError(
+                        `${_error.name}: ${_error.message} ${_error.cause}`,
+                    );
                     return { action: ErrorAction.Continue };
                 },
                 closed: (): CloseHandlerResult => {
+                    this.logger.write("Language service connection closed.");
                     // We have our own restart experience
                     return {
                         action: CloseAction.DoNotRestart,
-                        message: "Connection to PowerShell Editor Services (the Extension Terminal) was closed. See below prompt to restart!"
+                        message:
+                            "Connection to PowerShell Editor Services (the Extension Terminal) was closed. See below prompt to restart!",
                     };
                 },
             },
-            revealOutputChannelOn: RevealOutputChannelOn.Never,
             middleware: this,
-            traceOutputChannel: vscode.window.createOutputChannel("PowerShell Trace - LSP", {log: true}),
+            traceOutputChannel: new LanguageClientOutputChannelAdapter(
+                "PowerShell: Trace LSP",
+                LspTraceParser,
+            ),
+            // This is named the same as the Client log to merge the logs, but will be handled and disposed separately.
+            outputChannel: new LanguageClientOutputChannelAdapter(
+                "PowerShell",
+                PsesParser,
+            ),
+            revealOutputChannelOn: RevealOutputChannelOn.Never,
         };
 
-        const languageClient = new LanguageClient("powershell", "PowerShell Editor Services Client", connectFunc, clientOptions);
+        const languageClient = new LanguageClient(
+            "powershell",
+            "PowerShell Editor Services Client",
+            connectFunc,
+            clientOptions,
+        );
 
         // This enables handling Semantic Highlighting messages in PowerShell Editor Services
         // TODO: We should only turn this on in preview.
@@ -670,9 +986,9 @@ export class SessionManager implements Middleware {
         // NOTE: We don't currently send any events from PSES, but may again in
         // the future so we're leaving this side wired up.
         languageClient.onTelemetry((event) => {
-            const eventName: string = event.eventName ? event.eventName : "PSESEvent";
+            const eventName: string = event.eventName ?? "PSESEvent";
             // eslint-disable-next-line @typescript-eslint/no-explicit-any
-            const data: any = event.data ? event.data : event;
+            const data: any = event.data ?? event;
             this.sendTelemetryEvent(eventName, data);
         });
 
@@ -688,16 +1004,19 @@ export class SessionManager implements Middleware {
             // Console.ReadKey, since it's not cancellable. On
             // "cancellation" the server asks us to send pretend to
             // press a key, thus mitigating all the quirk.
-            languageClient.onNotification(
-                SendKeyPressNotificationType,
-                () => { this.languageServerProcess?.sendKeyPress(); }),
+            languageClient.onNotification(SendKeyPressNotificationType, () => {
+                this.languageServerProcess?.sendKeyPress();
+            }),
 
             languageClient.onNotification(
                 ExecutionBusyStatusNotificationType,
                 (isBusy: boolean) => {
-                    if (isBusy) { this.setSessionBusyStatus(); }
-                    else { this.setSessionRunningStatus(); }
-                }
+                    if (isBusy) {
+                        this.setSessionBusyStatus();
+                    } else {
+                        this.setSessionRunningStatus();
+                    }
+                },
             ),
         ];
 
@@ -705,7 +1024,10 @@ export class SessionManager implements Middleware {
             await languageClient.start();
             LanguageClientConsumer.onLanguageClientStarted(languageClient);
         } catch (err) {
-            void this.setSessionFailedOpenBug("Language client failed to start: " + (err instanceof Error ? err.message : "unknown"));
+            void this.setSessionFailedOpenBug(
+                "Language client failed to start: " +
+                    (err instanceof Error ? err.message : "unknown"),
+            );
         }
 
         return languageClient;
@@ -715,8 +1037,14 @@ export class SessionManager implements Middleware {
         // Because the extension is always at `<root>/out/main.js`
         let bundledModulesPath = path.resolve(__dirname, "../modules");
 
-        if (this.extensionContext.extensionMode === vscode.ExtensionMode.Development) {
-            const devBundledModulesPath = path.resolve(__dirname, this.sessionSettings.developer.bundledModulesPath);
+        if (
+            this.extensionContext.extensionMode ===
+            vscode.ExtensionMode.Development
+        ) {
+            const devBundledModulesPath = path.resolve(
+                __dirname,
+                this.sessionSettings.developer.bundledModulesPath,
+            );
 
             // Make sure the module's bin path exists
             if (await utils.checkIfDirectoryExists(devBundledModulesPath)) {
@@ -724,14 +1052,18 @@ export class SessionManager implements Middleware {
             } else {
                 void this.logger.writeAndShowWarning(
                     "In development mode but PowerShellEditorServices dev module path cannot be " +
-                    `found (or has not been built yet): ${devBundledModulesPath}\n`);
+                        `found (or has not been built yet): ${devBundledModulesPath}\n`,
+                );
             }
         }
 
         return bundledModulesPath;
     }
 
-    private getEditorServicesArgs(bundledModulesPath: string, powerShellExeDetails: IPowerShellExeDetails): string {
+    private getEditorServicesArgs(
+        bundledModulesPath: string,
+        powerShellExeDetails: IPowerShellExeDetails,
+    ): string {
         let editorServicesArgs =
             "-HostName 'Visual Studio Code Host' " +
             "-HostProfileId 'Microsoft.VSCode' " +
@@ -741,7 +1073,10 @@ export class SessionManager implements Middleware {
 
         if (this.sessionSettings.integratedConsole.suppressStartupBanner) {
             editorServicesArgs += "-StartupBanner '' ";
-        } else if (utils.isWindows && !powerShellExeDetails.supportsProperArguments) {
+        } else if (
+            utils.isWindows &&
+            !powerShellExeDetails.supportsProperArguments
+        ) {
             // NOTE: On Windows we don't Base64 encode the startup command
             // because it annoys some poorly implemented anti-virus scanners.
             // Unfortunately this means that for some installs of PowerShell
@@ -759,28 +1094,40 @@ Type 'help' to get help.
         }
 
         // We guard this here too out of an abundance of precaution.
-        if (this.sessionSettings.developer.editorServicesWaitForDebugger
-            && this.extensionContext.extensionMode === vscode.ExtensionMode.Development) {
+        if (
+            this.sessionSettings.developer.editorServicesWaitForDebugger &&
+            this.extensionContext.extensionMode ===
+                vscode.ExtensionMode.Development
+        ) {
             editorServicesArgs += "-WaitForDebugger ";
         }
-
-        editorServicesArgs += `-LogLevel '${this.sessionSettings.developer.editorServicesLogLevel}' `;
+        const logLevel = vscode.workspace
+            .getConfiguration("powershell.developer")
+            .get<string>("editorServicesLogLevel");
+        editorServicesArgs += `-LogLevel '${logLevel}' `;
 
         return editorServicesArgs;
     }
 
-    private async getVersionDetails(): Promise<IPowerShellVersionDetails | undefined> {
+    private async getVersionDetails(): Promise<
+        IPowerShellVersionDetails | undefined
+    > {
         // Take one minute to get version details, otherwise cancel and fail.
         const timeout = new vscode.CancellationTokenSource();
-        setTimeout(() => { timeout.cancel(); }, 60 * 1000);
+        setTimeout(() => {
+            timeout.cancel();
+        }, 60 * 1000);
 
         const versionDetails = await this.languageClient?.sendRequest(
-            PowerShellVersionRequestType, timeout.token);
+            PowerShellVersionRequestType,
+            timeout.token,
+        );
 
         // This is pretty much the only telemetry event we care about.
         // TODO: We actually could send this earlier from PSES itself.
-        this.sendTelemetryEvent("powershellVersionCheck",
-            { powershellVersion: versionDetails?.version ?? "unknown" });
+        this.sendTelemetryEvent("powershellVersionCheck", {
+            powershellVersion: versionDetails?.version ?? "unknown",
+        });
 
         return versionDetails;
     }
@@ -791,30 +1138,45 @@ Type 'help' to get help.
             [
                 {
                     prompt: "Yes",
-                    action: async (): Promise<void> => { await this.restartSession(); }
+                    action: async (): Promise<void> => {
+                        await this.restartSession();
+                    },
                 },
                 {
                     prompt: "No",
-                    action: undefined
-                }
-            ]
+                    action: undefined,
+                },
+            ],
         );
     }
 
     private sendTelemetryEvent(
         eventName: string,
         properties?: TelemetryEventProperties,
-        measures?: TelemetryEventMeasurements): void {
-
-        if (this.extensionContext.extensionMode === vscode.ExtensionMode.Production) {
-            this.telemetryReporter.sendTelemetryEvent(eventName, properties, measures);
+        measures?: TelemetryEventMeasurements,
+    ): void {
+        if (
+            this.extensionContext.extensionMode ===
+            vscode.ExtensionMode.Production
+        ) {
+            this.telemetryReporter.sendTelemetryEvent(
+                eventName,
+                properties,
+                measures,
+            );
         }
     }
 
     private createStatusBarItem(): vscode.LanguageStatusItem {
         const statusTitle = "Show PowerShell Session Menu";
-        const languageStatusItem = vscode.languages.createLanguageStatusItem("powershell", this.documentSelector);
-        languageStatusItem.command = { title: statusTitle, command: this.ShowSessionMenuCommandName };
+        const languageStatusItem = vscode.languages.createLanguageStatusItem(
+            "powershell",
+            this.documentSelector,
+        );
+        languageStatusItem.command = {
+            title: statusTitle,
+            command: this.ShowSessionMenuCommandName,
+        };
         languageStatusItem.text = "$(terminal-powershell)";
         languageStatusItem.detail = "PowerShell";
         return languageStatusItem;
@@ -822,21 +1184,25 @@ Type 'help' to get help.
 
     private async waitWhileStarting(): Promise<void> {
         while (this.sessionStatus === SessionStatus.Starting) {
-            if (this.startCancellationTokenSource?.token.isCancellationRequested) {
+            if (
+                this.startCancellationTokenSource?.token.isCancellationRequested
+            ) {
                 return;
             }
-            await utils.sleep(300);
+            await utils.sleep(200);
         }
     }
 
     private async waitWhileStopping(): Promise<void> {
         while (this.sessionStatus === SessionStatus.Stopping) {
-            await utils.sleep(300);
+            await utils.sleep(200);
         }
     }
 
     private setSessionStatus(detail: string, status: SessionStatus): void {
-        this.logger.writeVerbose(`Session status changing from '${this.sessionStatus}' to '${status}'.`);
+        this.logger.writeDebug(
+            `Session status changing from '${this.sessionStatus}' to '${status}'.`,
+        );
         this.sessionStatus = status;
         this.languageStatusItem.text = "$(terminal-powershell)";
         this.languageStatusItem.detail = "PowerShell";
@@ -845,10 +1211,12 @@ Type 'help' to get help.
             const semver = new SemVer(this.versionDetails.version);
             this.languageStatusItem.text += ` ${semver.major}.${semver.minor}`;
             this.languageStatusItem.detail += ` ${this.versionDetails.commit} (${this.versionDetails.architecture.toLowerCase()})`;
-        } else if (this.PowerShellExeDetails?.displayName) { // When it hasn't started yet.
+        } else if (this.PowerShellExeDetails?.displayName) {
+            // When it hasn't started yet.
             this.languageStatusItem.text += ` ${this.PowerShellExeDetails.displayName}`;
             this.languageStatusItem.detail += ` at '${this.PowerShellExeDetails.exePath}'`;
-        } else if (this.sessionSettings.powerShellDefaultVersion) { // When it hasn't been found yet.
+        } else if (this.sessionSettings.powerShellDefaultVersion) {
+            // When it hasn't been found yet.
             this.languageStatusItem.text += ` ${this.sessionSettings.powerShellDefaultVersion}`;
             this.languageStatusItem.detail = `Looking for '${this.sessionSettings.powerShellDefaultVersion}'...`;
         }
@@ -858,24 +1226,28 @@ Type 'help' to get help.
         }
 
         switch (status) {
-        case SessionStatus.Running:
-        case SessionStatus.NotStarted:
-            this.languageStatusItem.busy = false;
-            this.languageStatusItem.severity = vscode.LanguageStatusSeverity.Information;
-            break;
-        case SessionStatus.Busy:
-            this.languageStatusItem.busy = true;
-            this.languageStatusItem.severity = vscode.LanguageStatusSeverity.Information;
-            break;
-        case SessionStatus.Starting:
-        case SessionStatus.Stopping:
-            this.languageStatusItem.busy = true;
-            this.languageStatusItem.severity = vscode.LanguageStatusSeverity.Warning;
-            break;
-        case SessionStatus.Failed:
-            this.languageStatusItem.busy = false;
-            this.languageStatusItem.severity = vscode.LanguageStatusSeverity.Error;
-            break;
+            case SessionStatus.Running:
+            case SessionStatus.NotStarted:
+                this.languageStatusItem.busy = false;
+                this.languageStatusItem.severity =
+                    vscode.LanguageStatusSeverity.Information;
+                break;
+            case SessionStatus.Busy:
+                this.languageStatusItem.busy = true;
+                this.languageStatusItem.severity =
+                    vscode.LanguageStatusSeverity.Information;
+                break;
+            case SessionStatus.Starting:
+            case SessionStatus.Stopping:
+                this.languageStatusItem.busy = true;
+                this.languageStatusItem.severity =
+                    vscode.LanguageStatusSeverity.Warning;
+                break;
+            case SessionStatus.Failed:
+                this.languageStatusItem.busy = false;
+                this.languageStatusItem.severity =
+                    vscode.LanguageStatusSeverity.Error;
+                break;
         }
     }
 
@@ -894,43 +1266,63 @@ Type 'help' to get help.
 
     private async setSessionFailedOpenBug(message: string): Promise<void> {
         this.setSessionStatus("Startup Error!", SessionStatus.Failed);
-        await this.logger.writeAndShowErrorWithActions(message, [{
-            prompt: "Open an Issue",
-            action: async (): Promise<void> => {
-                await vscode.commands.executeCommand("PowerShell.GenerateBugReport");
-            }
-        }]
-        );
+        await this.logger.writeAndShowErrorWithActions(message, [
+            {
+                prompt: "Open an Issue",
+                action: async (): Promise<void> => {
+                    await vscode.commands.executeCommand(
+                        "PowerShell.GenerateBugReport",
+                    );
+                },
+            },
+        ]);
     }
 
-    private async setSessionFailedGetPowerShell(message: string): Promise<void> {
+    private async setSessionFailedGetPowerShell(
+        message: string,
+    ): Promise<void> {
         this.setSessionStatus("Startup Error!", SessionStatus.Failed);
-        await this.logger.writeAndShowErrorWithActions(message, [{
-            prompt: "Open PowerShell Install Documentation",
-            action: async (): Promise<void> => {
-                await vscode.env.openExternal(
-                    vscode.Uri.parse("https://aka.ms/get-powershell-vscode"));
-            }
-        }]
-        );
+        await this.logger.writeAndShowErrorWithActions(message, [
+            {
+                prompt: "Open PowerShell Install Documentation",
+                action: async (): Promise<void> => {
+                    await vscode.env.openExternal(
+                        vscode.Uri.parse(
+                            "https://aka.ms/get-powershell-vscode",
+                        ),
+                    );
+                },
+            },
+        ]);
     }
 
     private async setSessionFailedGetDotNet(message: string): Promise<void> {
         this.setSessionStatus("Startup Error!", SessionStatus.Failed);
-        await this.logger.writeAndShowErrorWithActions(message, [{
-            prompt: "Open .NET Framework Documentation",
-            action: async (): Promise<void> => {
-                await vscode.env.openExternal(
-                    vscode.Uri.parse("https://dotnet.microsoft.com/en-us/download/dotnet-framework"));
-            }
-        }]
-        );
+        await this.logger.writeAndShowErrorWithActions(message, [
+            {
+                prompt: "Open .NET Framework Documentation",
+                action: async (): Promise<void> => {
+                    await vscode.env.openExternal(
+                        vscode.Uri.parse(
+                            "https://dotnet.microsoft.com/en-us/download/dotnet-framework",
+                        ),
+                    );
+                },
+            },
+        ]);
     }
 
-    private async changePowerShellDefaultVersion(exePath: IPowerShellExeDetails): Promise<void> {
+    private async changePowerShellDefaultVersion(
+        exePath: IPowerShellExeDetails,
+    ): Promise<void> {
         this.suppressRestartPrompt = true;
         try {
-            await changeSetting("powerShellDefaultVersion", exePath.displayName, true, this.logger);
+            await changeSetting(
+                "powerShellDefaultVersion",
+                exePath.displayName,
+                true,
+                this.logger,
+            );
         } finally {
             this.suppressRestartPrompt = false;
         }
@@ -945,15 +1337,26 @@ Type 'help' to get help.
     // Shows the temp debug terminal if it exists, otherwise the session terminal.
     public showDebugTerminal(isExecute?: boolean): void {
         if (this.debugSessionProcess) {
-            this.debugSessionProcess.showTerminal(isExecute && !this.sessionSettings.integratedConsole.focusConsoleOnExecute);
+            this.debugSessionProcess.showTerminal(
+                isExecute &&
+                    !this.sessionSettings.integratedConsole
+                        .focusConsoleOnExecute,
+            );
         } else {
-            this.languageServerProcess?.showTerminal(isExecute && !this.sessionSettings.integratedConsole.focusConsoleOnExecute);
+            this.languageServerProcess?.showTerminal(
+                isExecute &&
+                    !this.sessionSettings.integratedConsole
+                        .focusConsoleOnExecute,
+            );
         }
     }
 
     // Always shows the session terminal.
     private showSessionTerminal(isExecute?: boolean): void {
-        this.languageServerProcess?.showTerminal(isExecute && !this.sessionSettings.integratedConsole.focusConsoleOnExecute);
+        this.languageServerProcess?.showTerminal(
+            isExecute &&
+                !this.sessionSettings.integratedConsole.focusConsoleOnExecute,
+        );
     }
 
     private async showSessionMenu(): Promise<void> {
@@ -961,47 +1364,67 @@ Type 'help' to get help.
             this.platformDetails,
             // We don't pull from session settings because we want them fresh!
             getSettings().powerShellAdditionalExePaths,
-            this.logger);
-        const availablePowerShellExes = await powershellExeFinder.getAllAvailablePowerShellInstallations();
+            this.logger,
+        );
+        const availablePowerShellExes =
+            await powershellExeFinder.getAllAvailablePowerShellInstallations();
 
         const powerShellItems = availablePowerShellExes
-            .filter((item) => item.displayName !== this.PowerShellExeDetails?.displayName)
+            .filter(
+                (item) =>
+                    item.displayName !== this.PowerShellExeDetails?.displayName,
+            )
             .map((item) => {
                 return new SessionMenuItem(
                     `Switch to: ${item.displayName}`,
-                    async () => { await this.changePowerShellDefaultVersion(item); });
+                    async () => {
+                        await this.changePowerShellDefaultVersion(item);
+                    },
+                );
             });
 
         const menuItems: SessionMenuItem[] = [
             new SessionMenuItem(
                 `Current session: ${this.PowerShellExeDetails?.displayName ?? "Unknown"} (click to show logs)`,
-                async () => { await vscode.commands.executeCommand("PowerShell.ShowLogs"); }),
+                async () => {
+                    await vscode.commands.executeCommand("PowerShell.ShowLogs");
+                },
+            ),
 
             // Add all of the different PowerShell options
             ...powerShellItems,
 
-            new SessionMenuItem(
-                "Restart current session",
-                async () => {
-                    // We pass in the display name so we guarantee that the session
-                    // will be the same PowerShell.
-                    if (this.PowerShellExeDetails) {
-                        await this.restartSession(this.PowerShellExeDetails.displayName);
-                    } else {
-                        await this.restartSession();
-                    }
-                }),
+            new SessionMenuItem("Restart current session", async () => {
+                // We pass in the display name so we guarantee that the session
+                // will be the same PowerShell.
+                if (this.PowerShellExeDetails) {
+                    await this.restartSession(
+                        this.PowerShellExeDetails.displayName,
+                    );
+                } else {
+                    await this.restartSession();
+                }
+            }),
 
-            new SessionMenuItem(
-                "Open session logs folder",
-                async () => { await vscode.commands.executeCommand("PowerShell.OpenLogFolder"); }),
+            new SessionMenuItem("Open session logs folder", async () => {
+                await vscode.commands.executeCommand(
+                    "PowerShell.OpenLogFolder",
+                );
+            }),
 
             new SessionMenuItem(
                 "Modify list of additional PowerShell locations",
-                async () => { await vscode.commands.executeCommand("workbench.action.openSettings", "powerShellAdditionalExePaths"); }),
+                async () => {
+                    await vscode.commands.executeCommand(
+                        "workbench.action.openSettings",
+                        "powerShellAdditionalExePaths",
+                    );
+                },
+            ),
         ];
 
-        const selectedItem = await vscode.window.showQuickPick<SessionMenuItem>(menuItems);
+        const selectedItem =
+            await vscode.window.showQuickPick<SessionMenuItem>(menuItems);
         await selectedItem?.callback();
     }
 }
@@ -1011,7 +1434,8 @@ class SessionMenuItem implements vscode.QuickPickItem {
 
     constructor(
         public readonly label: string,
+
         // eslint-disable-next-line @typescript-eslint/no-empty-function
-        public readonly callback = async (): Promise<void> => { }) {
-    }
+        public readonly callback = async (): Promise<void> => {},
+    ) {}
 }
diff --git a/src/settings.ts b/src/settings.ts
index 9c2ef38452..9664c10cf1 100644
--- a/src/settings.ts
+++ b/src/settings.ts
@@ -4,8 +4,8 @@
 import vscode = require("vscode");
 import utils = require("./utils");
 import os = require("os");
-import { ILogger } from "./logging";
 import untildify from "untildify";
+import type { ILogger } from "./logging";
 import path = require("path");
 
 // TODO: Quite a few of these settings are unused in the client and instead
@@ -17,7 +17,7 @@ import path = require("path");
 // Perhaps we just get rid of this entirely?
 
 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
-class PartialSettings { }
+class PartialSettings {}
 
 export class Settings extends PartialSettings {
     powerShellAdditionalExePaths: PowerShellAdditionalExePathSettings = {};
@@ -36,7 +36,7 @@ export class Settings extends PartialSettings {
     sideBar = new SideBarSettings();
     pester = new PesterSettings();
     buttons = new ButtonSettings();
-    cwd = "";  // NOTE: use validateCwdSetting() instead of this directly!
+    cwd = ""; // NOTE: use validateCwdSetting() instead of this directly!
     enableReferencesCodeLens = true;
     analyzeOpenDocumentsOnly = false;
     // TODO: Add (deprecated) useX86Host (for testing)
@@ -56,15 +56,6 @@ export enum PipelineIndentationStyle {
     None = "None",
 }
 
-export enum LogLevel {
-    Diagnostic = "Diagnostic",
-    Verbose = "Verbose",
-    Normal = "Normal",
-    Warning = "Warning",
-    Error = "Error",
-    None = "None",
-}
-
 export enum CommentType {
     Disabled = "Disabled",
     BlockComment = "BlockComment",
@@ -73,12 +64,12 @@ export enum CommentType {
 
 export enum StartLocation {
     Editor = "Editor",
-    Panel = "Panel"
+    Panel = "Panel",
 }
 
-export enum ExecuteMode{
+export enum ExecuteMode {
     Call = "Call",
-    DotSource = "DotSource"
+    DotSource = "DotSource",
 }
 
 export type PowerShellAdditionalExePathSettings = Record<string, string>;
@@ -120,7 +111,6 @@ class DeveloperSettings extends PartialSettings {
     // From `<root>/out/main.js` we go to the directory before <root> and
     // then into the other repo.
     bundledModulesPath = "../../PowerShellEditorServices/module";
-    editorServicesLogLevel = LogLevel.Normal;
     editorServicesWaitForDebugger = false;
     setExecutionPolicy = true;
     waitForSessionFileTimeoutSeconds = 240;
@@ -162,7 +152,11 @@ class ButtonSettings extends PartialSettings {
 }
 
 // This is a recursive function which unpacks a WorkspaceConfiguration into our settings.
-function getSetting<TSetting>(key: string | undefined, value: TSetting, configuration: vscode.WorkspaceConfiguration): TSetting {
+function getSetting<TSetting>(
+    key: string | undefined,
+    value: TSetting,
+    configuration: vscode.WorkspaceConfiguration,
+): TSetting {
     // Base case where we're looking at a primitive type (or our special record).
     if (key !== undefined && !(value instanceof PartialSettings)) {
         return configuration.get<TSetting>(key, value);
@@ -185,18 +179,20 @@ export function getSettings(): Settings {
 }
 
 // Get the ConfigurationTarget (read: scope) of where the *effective* setting value comes from
-export function getEffectiveConfigurationTarget(settingName: string): vscode.ConfigurationTarget | undefined {
-    const configuration = vscode.workspace.getConfiguration(utils.PowerShellLanguageId);
+export function getEffectiveConfigurationTarget(
+    settingName: string,
+): vscode.ConfigurationTarget | undefined {
+    const configuration = vscode.workspace.getConfiguration(
+        utils.PowerShellLanguageId,
+    );
     const detail = configuration.inspect(settingName);
     if (detail === undefined) {
         return undefined;
     } else if (typeof detail.workspaceFolderValue !== "undefined") {
         return vscode.ConfigurationTarget.WorkspaceFolder;
-    }
-    else if (typeof detail.workspaceValue !== "undefined") {
+    } else if (typeof detail.workspaceValue !== "undefined") {
         return vscode.ConfigurationTarget.Workspace;
-    }
-    else if (typeof detail.globalValue !== "undefined") {
+    } else if (typeof detail.globalValue !== "undefined") {
         return vscode.ConfigurationTarget.Global;
     }
     return undefined;
@@ -207,12 +203,16 @@ export async function changeSetting(
     // eslint-disable-next-line @typescript-eslint/no-explicit-any
     newValue: any,
     configurationTarget: vscode.ConfigurationTarget | boolean | undefined,
-    logger: ILogger | undefined): Promise<void> {
-
-    logger?.writeVerbose(`Changing '${settingName}' at scope '${configurationTarget}' to '${newValue}'.`);
+    logger: ILogger | undefined,
+): Promise<void> {
+    logger?.writeDebug(
+        `Changing '${settingName}' at scope '${configurationTarget}' to '${newValue}'.`,
+    );
 
     try {
-        const configuration = vscode.workspace.getConfiguration(utils.PowerShellLanguageId);
+        const configuration = vscode.workspace.getConfiguration(
+            utils.PowerShellLanguageId,
+        );
         await configuration.update(settingName, newValue, configurationTarget);
     } catch (err) {
         logger?.writeError(`Failed to change setting: ${err}`);
@@ -222,14 +222,18 @@ export async function changeSetting(
 // We don't want to query the user more than once, so this is idempotent.
 let hasChosen = false;
 let chosenWorkspace: vscode.WorkspaceFolder | undefined = undefined;
-export async function getChosenWorkspace(logger: ILogger | undefined): Promise<vscode.WorkspaceFolder | undefined> {
+export async function getChosenWorkspace(
+    logger: ILogger | undefined,
+): Promise<vscode.WorkspaceFolder | undefined> {
     if (hasChosen) {
         return chosenWorkspace;
     }
 
     // If there is no workspace, or there is but it has no folders, fallback.
-    if (vscode.workspace.workspaceFolders === undefined
-        || vscode.workspace.workspaceFolders.length === 0) {
+    if (
+        vscode.workspace.workspaceFolders === undefined ||
+        vscode.workspace.workspaceFolders.length === 0
+    ) {
         chosenWorkspace = undefined;
         // If there is exactly one workspace folder, use that.
     } else if (vscode.workspace.workspaceFolders.length === 1) {
@@ -237,21 +241,31 @@ export async function getChosenWorkspace(logger: ILogger | undefined): Promise<v
         // If there is more than one workspace folder, prompt the user once.
     } else if (vscode.workspace.workspaceFolders.length > 1) {
         const options: vscode.WorkspaceFolderPickOptions = {
-            placeHolder: "Select a workspace folder to use for the PowerShell Extension.",
+            placeHolder:
+                "Select a workspace folder to use for the PowerShell Extension.",
         };
 
         chosenWorkspace = await vscode.window.showWorkspaceFolderPick(options);
 
-        logger?.writeVerbose(`User selected workspace: '${chosenWorkspace?.name}'`);
+        logger?.writeDebug(
+            `User selected workspace: '${chosenWorkspace?.name}'`,
+        );
         if (chosenWorkspace === undefined) {
             chosenWorkspace = vscode.workspace.workspaceFolders[0];
         } else {
             const response = await vscode.window.showInformationMessage(
                 `Would you like to save this choice by setting this workspace's 'powershell.cwd' value to '${chosenWorkspace.name}'?`,
-                "Yes", "No");
+                "Yes",
+                "No",
+            );
 
             if (response === "Yes") {
-                await changeSetting("cwd", chosenWorkspace.name, vscode.ConfigurationTarget.Workspace, logger);
+                await changeSetting(
+                    "cwd",
+                    chosenWorkspace.name,
+                    vscode.ConfigurationTarget.Workspace,
+                    logger,
+                );
             }
         }
     }
@@ -263,10 +277,15 @@ export async function getChosenWorkspace(logger: ILogger | undefined): Promise<v
     return chosenWorkspace;
 }
 
-export async function validateCwdSetting(logger: ILogger | undefined): Promise<string> {
-    let cwd = utils.stripQuotePair(
-        vscode.workspace.getConfiguration(utils.PowerShellLanguageId).get<string>("cwd"))
-        ?? "";
+export async function validateCwdSetting(
+    logger: ILogger | undefined,
+): Promise<string> {
+    let cwd =
+        utils.stripQuotePair(
+            vscode.workspace
+                .getConfiguration(utils.PowerShellLanguageId)
+                .get<string>("cwd"),
+        ) ?? "";
 
     // Replace ~ with home directory.
     cwd = untildify(cwd);
@@ -274,7 +293,7 @@ export async function validateCwdSetting(logger: ILogger | undefined): Promise<s
     // Use the cwd setting if it's absolute and exists. We don't use or resolve
     // relative paths here because it'll be relative to the Code process's cwd,
     // which is not what the user is expecting.
-    if (path.isAbsolute(cwd) && await utils.checkIfDirectoryExists(cwd)) {
+    if (path.isAbsolute(cwd) && (await utils.checkIfDirectoryExists(cwd))) {
         return cwd;
     }
 
@@ -296,7 +315,7 @@ export async function validateCwdSetting(logger: ILogger | undefined): Promise<s
     // Otherwise get a cwd from the workspace, if possible.
     const workspace = await getChosenWorkspace(logger);
     if (workspace === undefined) {
-        logger?.writeVerbose("Workspace was undefined, using homedir!");
+        logger?.writeDebug("Workspace was undefined, using homedir!");
         return os.homedir();
     }
 
@@ -316,3 +335,86 @@ export async function validateCwdSetting(logger: ILogger | undefined): Promise<s
     // If all else fails, use the home directory.
     return os.homedir();
 }
+
+/**
+ * Options for the `onSettingChange` function.
+ * @param scope the scope in which the vscode setting should be evaluated.
+ * @param run Indicates whether the function should be run now in addition to when settings change, or if it should be run only once and stop listening after a single change. If this is undefined, the function will be run only when the setting changes.
+ */
+interface onSettingChangeOptions {
+    scope?: vscode.ConfigurationScope;
+    run?: "now" | "once";
+}
+
+/**
+ * Invokes the specified action when a setting changes
+ * @param section the section of the vscode settings to evaluate. Defaults to `powershell`
+ * @param setting a string representation of the setting you wish to evaluate, e.g. `trace.server`
+ * @param action the action to take when the setting changes
+ * @param scope the scope in which the vscode setting should be evaluated.
+ * @returns a Disposable object that can be used to stop listening for changes with dispose()
+ * @example
+ * onSettingChange("powershell", "settingName", (newValue) => console.log(newValue));
+ */
+
+// Because we actually do use the constraint in the callback
+// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
+export function onSettingChange<T>(
+    section: string,
+    setting: string,
+    action: (newValue: T | undefined) => void,
+    options?: onSettingChangeOptions,
+): vscode.Disposable {
+    const settingPath = `${section}.${setting}`;
+    const disposable = vscode.workspace.onDidChangeConfiguration((e) => {
+        if (!e.affectsConfiguration(settingPath, options?.scope)) {
+            return;
+        }
+
+        doOnSettingsChange(section, setting, action, options?.scope);
+        if (options?.run === "once") {
+            disposable.dispose(); // Javascript black magic, referring to an outer reference before it exists
+        }
+    });
+    if (options?.run === "now") {
+        doOnSettingsChange(section, setting, action, options.scope);
+    }
+    return disposable;
+}
+
+/** Implementation is separate to avoid duplicate code for run now */
+
+// Because we actually do use the constraint in the callback
+// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
+function doOnSettingsChange<T>(
+    section: string,
+    setting: string,
+    action: (newValue: T | undefined) => void,
+    scope?: vscode.ConfigurationScope,
+): void {
+    const value = vscode.workspace
+        .getConfiguration(section, scope)
+        .get<T>(setting);
+    action(value);
+}
+
+/**
+ * Invokes the specified action when a PowerShell setting changes. Convenience function for `onSettingChange`
+ * @param setting a string representation of the setting you wish to evaluate, e.g. `trace.server`
+ * @param action the action to take when the setting changes
+ * @param scope the scope in which the vscode setting should be evaluated.n
+ * @returns a Disposable object that can be used to stop listening for changes
+ * @example
+ * onPowerShellSettingChange("settingName", (newValue) => console.log(newValue));
+ */
+
+// Because we actually do use the constraint in the callback
+// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
+export function onPowerShellSettingChange<T>(
+    setting: string,
+    action: (newValue: T | undefined) => void,
+    options?: onSettingChangeOptions,
+): vscode.Disposable {
+    const section = "powershell";
+    return onSettingChange(section, setting, action, options);
+}
diff --git a/src/utils.ts b/src/utils.ts
index 7ea266e9c7..a3236ebceb 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -4,17 +4,22 @@
 import os = require("os");
 import path = require("path");
 import vscode = require("vscode");
-import { satisfies } from "semver";
 
 export const PowerShellLanguageId = "powershell";
 
-// Path to the shell integration script in the VS Code installation
-// See https://github.com/microsoft/vscode/pull/227244
-const shellIntegrationMoved = satisfies(vscode.version, ">=1.94", { includePrerelease: true });
-export const ShellIntegrationScript = path.join(vscode.env.appRoot, "out", "vs", "workbench", "contrib", "terminal",
-    shellIntegrationMoved ? "common" : "browser",
-    shellIntegrationMoved ? "scripts" : "media",
-    "shellIntegration.ps1");
+// Path to the shell integration script in the VS Code installation.
+// See commit 21114288b if it moves again.
+export const ShellIntegrationScript = path.join(
+    vscode.env.appRoot,
+    "out",
+    "vs",
+    "workbench",
+    "contrib",
+    "terminal",
+    "common",
+    "scripts",
+    "shellIntegration.ps1",
+);
 
 export function escapeSingleQuotes(p: string): string {
     return p.replace(new RegExp("'", "g"), "''");
@@ -26,8 +31,10 @@ export function stripQuotePair(p: string | undefined): string | undefined {
     }
 
     // Remove matching surrounding quotes from p (without regex)
-    if (p.startsWith("'") && p.endsWith("'")
-        || p.startsWith("\"") && p.endsWith("\"")) {
+    if (
+        (p.startsWith("'") && p.endsWith("'")) ||
+        (p.startsWith('"') && p.endsWith('"'))
+    ) {
         return p.slice(1, -1);
     }
 
@@ -46,7 +53,10 @@ export function getPipePath(pipeName: string): string {
 
 // Check that the file or directory exists in an asynchronous manner that relies
 // solely on the VS Code API, not Node's fs library, ignoring symlinks.
-async function checkIfFileOrDirectoryExists(targetPath: string | vscode.Uri, type: vscode.FileType): Promise<boolean> {
+async function checkIfFileOrDirectoryExists(
+    targetPath: string | vscode.Uri,
+    type: vscode.FileType,
+): Promise<boolean> {
     if (targetPath === "") {
         return false;
     }
@@ -54,26 +64,37 @@ async function checkIfFileOrDirectoryExists(targetPath: string | vscode.Uri, typ
         const stat: vscode.FileStat = await vscode.workspace.fs.stat(
             targetPath instanceof vscode.Uri
                 ? targetPath
-                : vscode.Uri.file(targetPath));
+                : vscode.Uri.file(targetPath),
+        );
         return (stat.type & type) !== 0;
     } catch {
         return false;
     }
 }
 
-export async function checkIfFileExists(filePath: string | vscode.Uri): Promise<boolean> {
+export async function checkIfFileExists(
+    filePath: string | vscode.Uri,
+): Promise<boolean> {
     return await checkIfFileOrDirectoryExists(filePath, vscode.FileType.File);
 }
 
-export async function checkIfDirectoryExists(directoryPath: string | vscode.Uri): Promise<boolean> {
-    return await checkIfFileOrDirectoryExists(directoryPath, vscode.FileType.Directory);
+export async function checkIfDirectoryExists(
+    directoryPath: string | vscode.Uri,
+): Promise<boolean> {
+    return await checkIfFileOrDirectoryExists(
+        directoryPath,
+        vscode.FileType.Directory,
+    );
 }
 
-export async function readDirectory(directoryPath: string | vscode.Uri): Promise<string[]> {
+export async function readDirectory(
+    directoryPath: string | vscode.Uri,
+): Promise<string[]> {
     const items = await vscode.workspace.fs.readDirectory(
         directoryPath instanceof vscode.Uri
             ? directoryPath
-            : vscode.Uri.file(directoryPath));
+            : vscode.Uri.file(directoryPath),
+    );
     return items.map(([name, _type]) => name);
 }
 
@@ -83,7 +104,7 @@ export function getTimestampString(): string {
 }
 
 export function sleep(ms: number): Promise<void> {
-    return new Promise(resolve => setTimeout(resolve, ms));
+    return new Promise((resolve) => setTimeout(resolve, ms));
 }
 
 export const isMacOS: boolean = process.platform === "darwin";
diff --git a/test/OneBranch.code-workspace b/test/OneBranch.code-workspace
new file mode 100644
index 0000000000..d17440aded
--- /dev/null
+++ b/test/OneBranch.code-workspace
@@ -0,0 +1,18 @@
+{
+  // A simple test environment that suppresses some first start warnings we don't care about.
+  "folders": [
+    {
+      "path": "mocks",
+    },
+  ],
+  "settings": {
+    "git.openRepositoryInParentFolders": "never",
+    "csharp.suppressDotnetRestoreNotification": true,
+    "extensions.ignoreRecommendations": true,
+    // The settings tests account for this fix
+    "powershell.powerShellAdditionalExePaths": {
+      "OneBranch": "C:\\powershell-7\\pwsh.exe",
+    },
+    "powershell.powerShellDefaultVersion": "OneBranch",
+  },
+}
diff --git a/test/TestEnvironment.code-workspace b/test/TestEnvironment.code-workspace
index c204beb6d1..4915d16693 100644
--- a/test/TestEnvironment.code-workspace
+++ b/test/TestEnvironment.code-workspace
@@ -2,12 +2,12 @@
   // A simple test environment that suppresses some first start warnings we don't care about.
   "folders": [
     {
-      "path": "mocks"
-    }
+      "path": "mocks",
+    },
   ],
   "settings": {
     "git.openRepositoryInParentFolders": "never",
     "csharp.suppressDotnetRestoreNotification": true,
     "extensions.ignoreRecommendations": true,
-  }
+  },
 }
diff --git a/test/core/paths.test.ts b/test/core/paths.test.ts
index 15f60f5bd1..e68fc1a88b 100644
--- a/test/core/paths.test.ts
+++ b/test/core/paths.test.ts
@@ -3,23 +3,34 @@
 
 import assert from "assert";
 import * as vscode from "vscode";
-import { IPowerShellExtensionClient } from "../../src/features/ExternalApi";
+import type { IPowerShellExtensionClient } from "../../src/features/ExternalApi";
+import {
+    checkIfDirectoryExists,
+    checkIfFileExists,
+    ShellIntegrationScript,
+} from "../../src/utils";
 import utils = require("../utils");
-import { checkIfDirectoryExists, checkIfFileExists, ShellIntegrationScript } from "../../src/utils";
 
 describe("Path assumptions", function () {
     let globalStorageUri: vscode.Uri;
+    let logUri: vscode.Uri;
     before(async () => {
-        const extension: IPowerShellExtensionClient = await utils.ensureEditorServicesIsConnected();
+        const extension: IPowerShellExtensionClient =
+            await utils.ensureEditorServicesIsConnected();
         globalStorageUri = extension.getStorageUri();
+        logUri = extension.getLogUri();
     });
 
     it("Creates the session folder at the correct path", async function () {
-        assert(await checkIfDirectoryExists(vscode.Uri.joinPath(globalStorageUri, "sessions")));
+        assert(
+            await checkIfDirectoryExists(
+                vscode.Uri.joinPath(globalStorageUri, "sessions"),
+            ),
+        );
     });
 
     it("Creates the log folder at the correct path", async function () {
-        assert(await checkIfDirectoryExists(vscode.Uri.joinPath(globalStorageUri, "logs")));
+        assert(await checkIfDirectoryExists(logUri));
     });
 
     it("Finds the Terminal Shell Integration Script", async function () {
diff --git a/test/core/platform.test.ts b/test/core/platform.test.ts
index 853b550685..e6de6a5f3a 100644
--- a/test/core/platform.test.ts
+++ b/test/core/platform.test.ts
@@ -2,44 +2,12 @@
 // Licensed under the MIT License.
 
 import * as assert from "assert";
-import mockFS = require("mock-fs");
-import FileSystem = require("mock-fs/lib/filesystem");
 import * as os from "os";
 import * as path from "path";
-import rewire = require("rewire");
 import * as sinon from "sinon";
 import * as platform from "../../src/platform";
-import * as fs from "fs"; // NOTE: Necessary for mock-fs.
-import * as vscode from "vscode";
-import { stripQuotePair } from "../../src/utils";
-
-// We have to rewire the platform module so that mock-fs can be used, as it
-// overrides the fs module but not the vscode.workspace.fs module.
-const platformMock = rewire("../../src/platform");
-
-// eslint-disable-next-line @typescript-eslint/require-await
-async function fakeCheckIfFileOrDirectoryExists(targetPath: string | vscode.Uri): Promise<boolean> {
-    try {
-        fs.lstatSync(targetPath instanceof vscode.Uri ? targetPath.fsPath : targetPath);
-        return true;
-    } catch {
-        return false;
-    }
-}
-
-// eslint-disable-next-line @typescript-eslint/require-await
-async function fakeReadDirectory(targetPath: string | vscode.Uri): Promise<string[]> {
-    return fs.readdirSync(targetPath instanceof vscode.Uri ? targetPath.fsPath : targetPath);
-}
-
-const utilsMock = {
-    checkIfFileExists: fakeCheckIfFileOrDirectoryExists,
-    checkIfDirectoryExists: fakeCheckIfFileOrDirectoryExists,
-    readDirectory: fakeReadDirectory,
-    stripQuotePair: stripQuotePair
-};
-
-platformMock.__set__("utils", utilsMock);
+import mockFS = require("mock-fs");
+import FileSystem = require("mock-fs/lib/filesystem");
 
 /**
  * Describes a platform on which the PowerShell extension should work,
@@ -69,11 +37,21 @@ let additionalPowerShellExes: Record<string, string>;
 let successAdditionalTestCases: ITestPlatformSuccessCase[];
 
 if (process.platform === "win32") {
-    const msixAppDir = path.join(process.env.LOCALAPPDATA!, "Microsoft", "WindowsApps");
-    const pwshMsixPath = path.join(msixAppDir, "Microsoft.PowerShell_8wekyb3d8bbwe", "pwsh.exe");
-    const pwshPreviewMsixPath = path.join(msixAppDir, "Microsoft.PowerShellPreview_8wekyb3d8bbwe", "pwsh.exe");
-    const pwshDailyDir = path.join(process.env.LOCALAPPDATA!, "Microsoft", "powershell-daily");
-    const pwshDailyPath = path.join(pwshDailyDir, "pwsh.exe");
+    const msixAppDir = path.join(
+        process.env.LOCALAPPDATA!,
+        "Microsoft",
+        "WindowsApps",
+    );
+    const pwshMsixPath = path.join(
+        msixAppDir,
+        "Microsoft.PowerShell_8wekyb3d8bbwe",
+        "pwsh.exe",
+    );
+    const pwshPreviewMsixPath = path.join(
+        msixAppDir,
+        "Microsoft.PowerShellPreview_8wekyb3d8bbwe",
+        "pwsh.exe",
+    );
 
     successTestCases = [
         {
@@ -84,56 +62,55 @@ if (process.platform === "win32") {
                 isProcess64Bit: true,
             },
             environmentVars: {
-                "ProgramFiles": "C:\\Program Files",
+                ProgramFiles: "C:\\Program Files",
                 "ProgramFiles(x86)": "C:\\Program Files (x86)",
-                "windir": "C:\\WINDOWS",
+                windir: "C:\\WINDOWS",
             },
             expectedPowerShellSequence: [
                 {
                     exePath: "C:\\Program Files\\PowerShell\\6\\pwsh.exe",
                     displayName: "PowerShell (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "C:\\Program Files (x86)\\PowerShell\\6\\pwsh.exe",
                     displayName: "PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: pwshMsixPath,
                     displayName: "PowerShell (Store)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\Program Files\\PowerShell\\7-preview\\pwsh.exe",
+                    exePath:
+                        "C:\\Program Files\\PowerShell\\7-preview\\pwsh.exe",
                     displayName: "PowerShell Preview (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: pwshPreviewMsixPath,
                     displayName: "PowerShell Preview (Store)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\Program Files (x86)\\PowerShell\\7-preview\\pwsh.exe",
+                    exePath:
+                        "C:\\Program Files (x86)\\PowerShell\\7-preview\\pwsh.exe",
                     displayName: "PowerShell Preview (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
-                {
-                    exePath: pwshDailyPath,
-                    displayName: "PowerShell Daily",
-                    supportsProperArguments: true
-                }
             ],
             filesystem: {
                 "C:\\Program Files\\PowerShell": {
@@ -166,9 +143,6 @@ if (process.platform === "win32") {
                 "C:\\WINDOWS\\SysWOW64\\WindowsPowerShell\\v1.0": {
                     "powershell.exe": "",
                 },
-                [pwshDailyDir]: {
-                    "pwsh.exe": "",
-                }
             },
         },
         {
@@ -179,20 +153,22 @@ if (process.platform === "win32") {
                 isProcess64Bit: true,
             },
             environmentVars: {
-                "ProgramFiles": "C:\\Program Files",
+                ProgramFiles: "C:\\Program Files",
                 "ProgramFiles(x86)": "C:\\Program Files (x86)",
-                "windir": "C:\\WINDOWS",
+                windir: "C:\\WINDOWS",
             },
             expectedPowerShellSequence: [
                 {
-                    exePath: "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -212,50 +188,54 @@ if (process.platform === "win32") {
                 isProcess64Bit: false,
             },
             environmentVars: {
-                "ProgramFiles": "C:\\Program Files (x86)",
+                ProgramFiles: "C:\\Program Files (x86)",
                 "ProgramFiles(x86)": "C:\\Program Files (x86)",
-                "windir": "C:\\WINDOWS",
+                windir: "C:\\WINDOWS",
             },
             expectedPowerShellSequence: [
                 {
                     exePath: "C:\\Program Files (x86)\\PowerShell\\6\\pwsh.exe",
                     displayName: "PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "C:\\Program Files\\PowerShell\\6\\pwsh.exe",
                     displayName: "PowerShell (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: pwshMsixPath,
                     displayName: "PowerShell (Store)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\Program Files (x86)\\PowerShell\\7-preview\\pwsh.exe",
+                    exePath:
+                        "C:\\Program Files (x86)\\PowerShell\\7-preview\\pwsh.exe",
                     displayName: "PowerShell Preview (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: pwshPreviewMsixPath,
                     displayName: "PowerShell Preview (Store)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\Program Files\\PowerShell\\7-preview\\pwsh.exe",
+                    exePath:
+                        "C:\\Program Files\\PowerShell\\7-preview\\pwsh.exe",
                     displayName: "PowerShell Preview (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\Sysnative\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\Sysnative\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -299,20 +279,22 @@ if (process.platform === "win32") {
                 isProcess64Bit: false,
             },
             environmentVars: {
-                "ProgramFiles": "C:\\Program Files (x86)",
+                ProgramFiles: "C:\\Program Files (x86)",
                 "ProgramFiles(x86)": "C:\\Program Files (x86)",
-                "windir": "C:\\WINDOWS",
+                windir: "C:\\WINDOWS",
             },
             expectedPowerShellSequence: [
                 {
-                    exePath: "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\Sysnative\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\Sysnative\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -332,35 +314,37 @@ if (process.platform === "win32") {
                 isProcess64Bit: false,
             },
             environmentVars: {
-                "ProgramFiles": "C:\\Program Files (x86)",
+                ProgramFiles: "C:\\Program Files (x86)",
                 "ProgramFiles(x86)": "C:\\Program Files (x86)",
-                "windir": "C:\\WINDOWS",
+                windir: "C:\\WINDOWS",
             },
             expectedPowerShellSequence: [
                 {
                     exePath: "C:\\Program Files (x86)\\PowerShell\\6\\pwsh.exe",
                     displayName: "PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: pwshMsixPath,
                     displayName: "PowerShell (Store)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\Program Files (x86)\\PowerShell\\7-preview\\pwsh.exe",
+                    exePath:
+                        "C:\\Program Files (x86)\\PowerShell\\7-preview\\pwsh.exe",
                     displayName: "PowerShell Preview (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: pwshPreviewMsixPath,
                     displayName: "PowerShell Preview (Store)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -393,15 +377,16 @@ if (process.platform === "win32") {
                 isProcess64Bit: false,
             },
             environmentVars: {
-                "ProgramFiles": "C:\\Program Files (x86)",
+                ProgramFiles: "C:\\Program Files (x86)",
                 "ProgramFiles(x86)": "C:\\Program Files (x86)",
-                "windir": "C:\\WINDOWS",
+                windir: "C:\\WINDOWS",
             },
             expectedPowerShellSequence: [
                 {
-                    exePath: "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -418,27 +403,29 @@ if (process.platform === "win32") {
                 isProcess64Bit: true,
             },
             environmentVars: {
-                "USERNAME": "test",
-                "USERPROFILE": "C:\\Users\\test",
-                "ProgramFiles": "C:\\Program Files",
+                USERNAME: "test",
+                USERPROFILE: "C:\\Users\\test",
+                ProgramFiles: "C:\\Program Files",
                 "ProgramFiles(x86)": "C:\\Program Files (x86)",
-                "windir": "C:\\WINDOWS",
+                windir: "C:\\WINDOWS",
             },
             expectedPowerShellSequence: [
                 {
                     exePath: "C:\\Users\\test\\.dotnet\\tools\\pwsh.exe",
                     displayName: ".NET Core PowerShell Global Tool",
-                    supportsProperArguments: false
+                    supportsProperArguments: false,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x64)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "C:\\WINDOWS\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
+                    exePath:
+                        "C:\\WINDOWS\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
                     displayName: "Windows PowerShell (x86)",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -450,13 +437,13 @@ if (process.platform === "win32") {
     ];
 
     additionalPowerShellExes = {
-        "pwsh": "C:\\Users\\test\\pwsh\\pwsh.exe",
+        pwsh: "C:\\Users\\test\\pwsh\\pwsh.exe",
         "pwsh-tilde": "~\\pwsh\\pwsh.exe",
         "pwsh-no-exe": "C:\\Users\\test\\pwsh\\pwsh",
         "pwsh-folder": "C:\\Users\\test\\pwsh\\",
         "pwsh-folder-no-slash": "C:\\Users\\test\\pwsh",
         "pwsh-single-quotes": "'C:\\Users\\test\\pwsh\\pwsh.exe'",
-        "pwsh-double-quotes": "\"C:\\Users\\test\\pwsh\\pwsh.exe\"",
+        "pwsh-double-quotes": '"C:\\Users\\test\\pwsh\\pwsh.exe"',
     };
 
     successAdditionalTestCases = [
@@ -467,90 +454,58 @@ if (process.platform === "win32") {
                 isOS64Bit: true,
                 isProcess64Bit: true,
             },
-            environmentVars: {},
+            environmentVars: {
+                USERNAME: "test",
+                USERPROFILE: "C:\\Users\\test",
+            },
             expectedPowerShellSequence: [
                 {
                     exePath: "C:\\Users\\test\\pwsh\\pwsh.exe",
                     displayName: "pwsh",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: path.join(os.homedir(), "pwsh", "pwsh.exe"),
                     displayName: "pwsh-tilde",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh\\pwsh",
-                    displayName: "pwsh-no-exe",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "C:\\Users\\test\\pwsh\\pwsh.exe",
                     displayName: "pwsh-no-exe",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh\\pwsh\\pwsh.exe",
-                    displayName: "pwsh-no-exe",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh\\pwsh\\powershell.exe",
-                    displayName: "pwsh-no-exe",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh\\",
-                    displayName: "pwsh-folder",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "C:\\Users\\test\\pwsh\\pwsh.exe",
                     displayName: "pwsh-folder",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh\\powershell.exe",
-                    displayName: "pwsh-folder",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh",
-                    displayName: "pwsh-folder-no-slash",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh.exe",
-                    displayName: "pwsh-folder-no-slash",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "C:\\Users\\test\\pwsh\\pwsh.exe",
                     displayName: "pwsh-folder-no-slash",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "C:\\Users\\test\\pwsh\\powershell.exe",
-                    displayName: "pwsh-folder-no-slash",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "C:\\Users\\test\\pwsh\\pwsh.exe",
                     displayName: "pwsh-single-quotes",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "C:\\Users\\test\\pwsh\\pwsh.exe",
                     displayName: "pwsh-double-quotes",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
-            filesystem: {},
-        }
+            filesystem: {
+                "C:\\Users\\test\\pwsh": {
+                    "pwsh.exe": "",
+                },
+                [path.join(os.homedir(), "pwsh")]: {
+                    "pwsh.exe": "",
+                },
+            },
+        },
     ];
 } else {
-    const pwshDailyDir = path.join(os.homedir(), ".powershell-daily");
-
     successTestCases = [
         {
             name: "Linux (all installations)",
@@ -564,41 +519,33 @@ if (process.platform === "win32") {
                 {
                     exePath: "/usr/bin/pwsh",
                     displayName: "PowerShell",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "/snap/bin/pwsh",
                     displayName: "PowerShell Snap",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "/usr/bin/pwsh-preview",
                     displayName: "PowerShell Preview",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "/snap/bin/pwsh-preview",
                     displayName: "PowerShell Preview Snap",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
-                {
-                    exePath: path.join(pwshDailyDir, "pwsh"),
-                    displayName: "PowerShell Daily",
-                    supportsProperArguments: true
-                }
             ],
             filesystem: {
                 "/usr/bin": {
-                    "pwsh": "",
+                    pwsh: "",
                     "pwsh-preview": "",
                 },
                 "/snap/bin": {
-                    "pwsh": "",
+                    pwsh: "",
                     "pwsh-preview": "",
                 },
-                [pwshDailyDir]: {
-                    "pwsh": ""
-                }
             },
         },
         {
@@ -613,27 +560,39 @@ if (process.platform === "win32") {
                 {
                     exePath: "/usr/local/bin/pwsh",
                     displayName: "PowerShell",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
+                },
+                {
+                    exePath: "/opt/homebrew/bin/pwsh",
+                    displayName: "PowerShell (Homebrew)",
+                    supportsProperArguments: true,
+                },
+                {
+                    exePath: "/opt/homebrew/bin/pwsh-lts",
+                    displayName: "PowerShell LTS (Homebrew)",
+                    supportsProperArguments: true,
                 },
                 {
                     exePath: "/usr/local/bin/pwsh-preview",
                     displayName: "PowerShell Preview",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: path.join(pwshDailyDir, "pwsh"),
-                    displayName: "PowerShell Daily",
-                    supportsProperArguments: true
-                }
+                    exePath: "/opt/homebrew/bin/pwsh-preview",
+                    displayName: "PowerShell Preview (Homebrew)",
+                    supportsProperArguments: true,
+                },
             ],
             filesystem: {
                 "/usr/local/bin": {
-                    "pwsh": "",
+                    pwsh: "",
+                    "pwsh-preview": "",
+                },
+                "/opt/homebrew/bin/": {
+                    pwsh: "",
+                    "pwsh-lts": "",
                     "pwsh-preview": "",
                 },
-                [pwshDailyDir]: {
-                    "pwsh": ""
-                }
             },
         },
         {
@@ -648,7 +607,7 @@ if (process.platform === "win32") {
                 {
                     exePath: "/usr/bin/pwsh",
                     displayName: "PowerShell",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -669,7 +628,7 @@ if (process.platform === "win32") {
                 {
                     exePath: "/snap/bin/pwsh",
                     displayName: "PowerShell Snap",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -690,7 +649,7 @@ if (process.platform === "win32") {
                 {
                     exePath: "/usr/local/bin/pwsh",
                     displayName: "PowerShell",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
             filesystem: {
@@ -707,14 +666,14 @@ if (process.platform === "win32") {
                 isProcess64Bit: true,
             },
             environmentVars: {
-                "USER": "test",
-                "HOME": "/Users/test",
+                USER: "test",
+                HOME: "/Users/test",
             },
             expectedPowerShellSequence: [
                 {
                     exePath: "/Users/test/.dotnet/tools/pwsh",
                     displayName: ".NET Core PowerShell Global Tool",
-                    supportsProperArguments: false
+                    supportsProperArguments: false,
                 },
             ],
             filesystem: {
@@ -731,14 +690,14 @@ if (process.platform === "win32") {
                 isProcess64Bit: true,
             },
             environmentVars: {
-                "USER": "test",
-                "HOME": "/home/test",
+                USER: "test",
+                HOME: "/home/test",
             },
             expectedPowerShellSequence: [
                 {
                     exePath: "/home/test/.dotnet/tools/pwsh",
                     displayName: ".NET Core PowerShell Global Tool",
-                    supportsProperArguments: false
+                    supportsProperArguments: false,
                 },
             ],
             filesystem: {
@@ -750,67 +709,68 @@ if (process.platform === "win32") {
     ];
 
     additionalPowerShellExes = {
-        "pwsh": "/home/bin/pwsh",
+        pwsh: "/home/test/bin/pwsh",
         "pwsh-tilde": "~/bin/pwsh",
-        "pwsh-folder": "/home/bin/",
-        "pwsh-folder-no-slash": "/home/bin",
-        "pwsh-single-quotes": "'/home/bin/pwsh'",
-        "pwsh-double-quotes": "\"/home/bin/pwsh\"",
+        "pwsh-folder": "/home/test/bin/",
+        "pwsh-folder-no-slash": "/home/test/bin",
+        "pwsh-single-quotes": "'/home/test/bin/pwsh'",
+        "pwsh-double-quotes": '"/home/test/bin/pwsh"',
     };
 
     successAdditionalTestCases = [
-        {   // Also sufficient for macOS as the behavior is the same
-            name: "Linux (Additional PowerShell Executables)",
+        {
+            name: "Linux/macOS (Additional PowerShell Executables)",
             platformDetails: {
                 operatingSystem: platform.OperatingSystem.Linux,
                 isOS64Bit: true,
                 isProcess64Bit: true,
             },
-            environmentVars: {},
+            environmentVars: {
+                USER: "test",
+                HOME: "/home/test",
+            },
             expectedPowerShellSequence: [
                 {
-                    exePath: "/home/bin/pwsh",
+                    exePath: "/home/test/bin/pwsh",
                     displayName: "pwsh",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
+                    // untildify ignores the HOME mock so this is platform-dependent
                     exePath: path.join(os.homedir(), "bin", "pwsh"),
                     displayName: "pwsh-tilde",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "/home/bin/",
-                    displayName: "pwsh-folder",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "/home/bin/pwsh",
+                    exePath: "/home/test/bin/pwsh",
                     displayName: "pwsh-folder",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "/home/bin",
+                    exePath: "/home/test/bin/pwsh",
                     displayName: "pwsh-folder-no-slash",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "/home/bin/pwsh",
-                    displayName: "pwsh-folder-no-slash",
-                    supportsProperArguments: true
-                },
-                {
-                    exePath: "/home/bin/pwsh",
+                    exePath: "/home/test/bin/pwsh",
                     displayName: "pwsh-single-quotes",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
                 {
-                    exePath: "/home/bin/pwsh",
+                    exePath: "/home/test/bin/pwsh",
                     displayName: "pwsh-double-quotes",
-                    supportsProperArguments: true
+                    supportsProperArguments: true,
                 },
             ],
-            filesystem: {},
-        }
+            filesystem: {
+                "/home/test/bin": {
+                    pwsh: "",
+                },
+                [path.join(os.homedir(), "bin")]: {
+                    pwsh: "",
+                },
+            },
+        },
     ];
 }
 
@@ -841,82 +801,110 @@ function setupTestEnvironment(testPlatform: ITestPlatform): void {
     mockFS(testPlatform.filesystem);
 
     for (const envVar of Object.keys(testPlatform.environmentVars)) {
-        sinon.stub(process.env, envVar).value(testPlatform.environmentVars[envVar]);
+        sinon
+            .stub(process.env, envVar)
+            .value(testPlatform.environmentVars[envVar]);
     }
 }
 
 describe("Platform module", function () {
+    afterEach(function () {
+        mockFS.restore();
+    });
+
     it("Gets the correct platform details", function () {
-        const platformDetails: platform.IPlatformDetails = platformMock.getPlatformDetails();
+        const platformDetails: platform.IPlatformDetails =
+            platform.getPlatformDetails();
         switch (process.platform) {
-        case "darwin":
-            assert.strictEqual(
-                platformDetails.operatingSystem,
-                platform.OperatingSystem.MacOS,
-                "Platform details operating system should be MacOS");
-            assert.strictEqual(
-                platformDetails.isProcess64Bit,
-                true,
-                "VSCode on darwin should be 64-bit");
-            assert.strictEqual(
-                platformDetails.isOS64Bit,
-                true,
-                "Darwin is 64-bit only");
-            break;
+            case "darwin":
+                assert.strictEqual(
+                    platformDetails.operatingSystem,
+                    platform.OperatingSystem.MacOS,
+                    "Platform details operating system should be MacOS",
+                );
+                assert.strictEqual(
+                    platformDetails.isProcess64Bit,
+                    true,
+                    "VSCode on darwin should be 64-bit",
+                );
+                assert.strictEqual(
+                    platformDetails.isOS64Bit,
+                    true,
+                    "Darwin is 64-bit only",
+                );
+                break;
 
-        case "linux":
-            assert.strictEqual(
-                platformDetails.operatingSystem,
-                platform.OperatingSystem.Linux,
-                "Platform details operating system should be Linux");
-            assert.strictEqual(
-                platformDetails.isProcess64Bit,
-                true,
-                "Only 64-bit VSCode supported on Linux");
-            assert.strictEqual(
-                platformDetails.isOS64Bit,
-                true,
-                "Only 64-bit Linux supported by PowerShell");
-            return;
+            case "linux":
+                assert.strictEqual(
+                    platformDetails.operatingSystem,
+                    platform.OperatingSystem.Linux,
+                    "Platform details operating system should be Linux",
+                );
+                assert.strictEqual(
+                    platformDetails.isProcess64Bit,
+                    true,
+                    "Only 64-bit VSCode supported on Linux",
+                );
+                assert.strictEqual(
+                    platformDetails.isOS64Bit,
+                    true,
+                    "Only 64-bit Linux supported by PowerShell",
+                );
+                return;
 
-        case "win32":
-            assert.strictEqual(
-                platformDetails.operatingSystem,
-                platform.OperatingSystem.Windows,
-                "Platform details operating system should be Windows");
-            assert.strictEqual(
-                platformDetails.isProcess64Bit,
-                process.arch === "x64" || process.arch === "arm64",
-                "Windows process bitness should match process arch");
-            assert.strictEqual(
-                platformDetails.isOS64Bit,
-                !!(platformDetails.isProcess64Bit || process.env.ProgramW6432),
-                "Windows OS arch should match process bitness unless 64-bit env var set");
-            return;
+            case "win32":
+                assert.strictEqual(
+                    platformDetails.operatingSystem,
+                    platform.OperatingSystem.Windows,
+                    "Platform details operating system should be Windows",
+                );
+                assert.strictEqual(
+                    platformDetails.isProcess64Bit,
+                    process.arch === "x64" || process.arch === "arm64",
+                    "Windows process bitness should match process arch",
+                );
+                assert.strictEqual(
+                    platformDetails.isOS64Bit,
+                    !!(
+                        platformDetails.isProcess64Bit ||
+                        process.env.ProgramW6432
+                    ),
+                    "Windows OS arch should match process bitness unless 64-bit env var set",
+                );
+                return;
 
-        default:
-            assert.fail("This platform is unsupported");
+            default:
+                assert.fail("This platform is unsupported");
         }
     });
 
     describe("Default PowerShell installation", function () {
-        afterEach(function () {
-            sinon.restore();
-            mockFS.restore();
-        });
-
         for (const testPlatform of successTestCases) {
             it(`Finds it on ${testPlatform.name}`, async function () {
                 setupTestEnvironment(testPlatform);
 
-                const powerShellExeFinder = new platformMock.PowerShellExeFinder(testPlatform.platformDetails);
+                const powerShellExeFinder = new platform.PowerShellExeFinder(
+                    testPlatform.platformDetails,
+                    {},
+                );
 
-                const defaultPowerShell = await powerShellExeFinder.getFirstAvailablePowerShellInstallation();
-                const expectedPowerShell = testPlatform.expectedPowerShellSequence[0];
+                const defaultPowerShell =
+                    await powerShellExeFinder.getFirstAvailablePowerShellInstallation();
+                const expectedPowerShell =
+                    testPlatform.expectedPowerShellSequence[0];
 
-                assert.strictEqual(defaultPowerShell.exePath, expectedPowerShell.exePath);
-                assert.strictEqual(defaultPowerShell.displayName, expectedPowerShell.displayName);
-                assert.strictEqual(defaultPowerShell.supportsProperArguments, expectedPowerShell.supportsProperArguments);
+                assert.strictEqual(
+                    defaultPowerShell!.exePath,
+                    expectedPowerShell.exePath,
+                );
+                assert.strictEqual(
+                    defaultPowerShell!.displayName,
+                    expectedPowerShell.displayName,
+                );
+                assert.strictEqual(
+                    defaultPowerShell!.supportsProperArguments,
+                    expectedPowerShell.supportsProperArguments,
+                );
             });
         }
 
@@ -924,41 +912,59 @@ describe("Platform module", function () {
             it(`Fails gracefully on ${testPlatform.name}`, async function () {
                 setupTestEnvironment(testPlatform);
 
-                const powerShellExeFinder = new platformMock.PowerShellExeFinder(testPlatform.platformDetails);
+                const powerShellExeFinder = new platform.PowerShellExeFinder(
+                    testPlatform.platformDetails,
+                    {},
+                );
 
-                const defaultPowerShell = await powerShellExeFinder.getFirstAvailablePowerShellInstallation();
+                const defaultPowerShell =
+                    await powerShellExeFinder.getFirstAvailablePowerShellInstallation();
                 assert.strictEqual(defaultPowerShell, undefined);
             });
         }
     });
 
     describe("Expected PowerShell installation list", function () {
-        afterEach(function () {
-            sinon.restore();
-            mockFS.restore();
-        });
-
         for (const testPlatform of successTestCases) {
             it(`Finds them on ${testPlatform.name}`, async function () {
                 setupTestEnvironment(testPlatform);
 
-                const powerShellExeFinder = new platformMock.PowerShellExeFinder(testPlatform.platformDetails);
+                const powerShellExeFinder = new platform.PowerShellExeFinder(
+                    testPlatform.platformDetails,
+                    {},
+                );
 
-                const foundPowerShells = await powerShellExeFinder.getAllAvailablePowerShellInstallations();
+                const foundPowerShells =
+                    await powerShellExeFinder.getAllAvailablePowerShellInstallations();
 
-                for (let i = 0; i < testPlatform.expectedPowerShellSequence.length; i++) {
+                for (
+                    let i = 0;
+                    i < testPlatform.expectedPowerShellSequence.length;
+                    i++
+                ) {
                     const foundPowerShell = foundPowerShells[i];
-                    const expectedPowerShell = testPlatform.expectedPowerShellSequence[i];
+                    const expectedPowerShell =
+                        testPlatform.expectedPowerShellSequence[i];
 
-                    assert.strictEqual(foundPowerShell?.exePath, expectedPowerShell.exePath);
-                    assert.strictEqual(foundPowerShell?.displayName, expectedPowerShell.displayName);
-                    assert.strictEqual(foundPowerShell?.supportsProperArguments, expectedPowerShell.supportsProperArguments);
+                    assert.strictEqual(
+                        foundPowerShell.exePath,
+                        expectedPowerShell.exePath,
+                    );
+                    assert.strictEqual(
+                        foundPowerShell.displayName,
+                        expectedPowerShell.displayName,
+                    );
+                    assert.strictEqual(
+                        foundPowerShell.supportsProperArguments,
+                        expectedPowerShell.supportsProperArguments,
+                    );
                 }
 
                 assert.strictEqual(
                     foundPowerShells.length,
                     testPlatform.expectedPowerShellSequence.length,
-                    "Number of expected PowerShells found does not match");
+                    "Number of expected PowerShells found does not match",
+                );
             });
         }
 
@@ -966,23 +972,24 @@ describe("Platform module", function () {
             it(`Fails gracefully on ${testPlatform.name}`, async function () {
                 setupTestEnvironment(testPlatform);
 
-                const powerShellExeFinder = new platformMock.PowerShellExeFinder(testPlatform.platformDetails);
+                const powerShellExeFinder = new platform.PowerShellExeFinder(
+                    testPlatform.platformDetails,
+                    {},
+                );
 
-                const foundPowerShells = await powerShellExeFinder.getAllAvailablePowerShellInstallations();
+                const foundPowerShells =
+                    await powerShellExeFinder.getAllAvailablePowerShellInstallations();
                 assert.strictEqual(foundPowerShells.length, 0);
             });
         }
     });
 
     describe("Windows PowerShell path fix", function () {
-        afterEach(function () {
-            sinon.restore();
-            mockFS.restore();
-        });
-
-        for (const testPlatform of successTestCases
-            .filter((tp) => tp.platformDetails.operatingSystem === platform.OperatingSystem.Windows)) {
-
+        for (const testPlatform of successTestCases.filter(
+            (tp) =>
+                tp.platformDetails.operatingSystem ===
+                platform.OperatingSystem.Windows,
+        )) {
             it(`Corrects the Windows PowerShell path on ${testPlatform.name}`, function () {
                 setupTestEnvironment(testPlatform);
 
@@ -992,7 +999,8 @@ describe("Platform module", function () {
                         systemDir,
                         "WindowsPowerShell",
                         "v1.0",
-                        "powershell.exe");
+                        "powershell.exe",
+                    );
                 }
 
                 const winPSPath = getWinPSPath("System32");
@@ -1006,36 +1014,52 @@ describe("Platform module", function () {
                     altWinPSPath = null;
                 }
 
-                const powerShellExeFinder = new platformMock.PowerShellExeFinder(testPlatform.platformDetails);
+                const powerShellExeFinder = new platform.PowerShellExeFinder(
+                    testPlatform.platformDetails,
+                    {},
+                );
 
-                assert.strictEqual(powerShellExeFinder.fixWindowsPowerShellPath(winPSPath), winPSPath);
+                assert.strictEqual(
+                    powerShellExeFinder.fixWindowsPowerShellPath(winPSPath),
+                    winPSPath,
+                );
 
                 if (altWinPSPath) {
-                    assert.strictEqual(powerShellExeFinder.fixWindowsPowerShellPath(altWinPSPath), winPSPath);
+                    assert.strictEqual(
+                        powerShellExeFinder.fixWindowsPowerShellPath(
+                            altWinPSPath,
+                        ),
+                        winPSPath,
+                    );
                 }
             });
         }
     });
 
     describe("PowerShell executables from 'powerShellAdditionalExePaths' are found", function () {
-        afterEach(function () {
-            sinon.restore();
-            mockFS.restore();
-        });
-
         for (const testPlatform of successAdditionalTestCases) {
-            it(`Guesses for ${testPlatform.name}`, function () {
+            it(`Guesses for ${testPlatform.name}`, async function () {
                 setupTestEnvironment(testPlatform);
 
-                const powerShellExeFinder = new platformMock.PowerShellExeFinder(testPlatform.platformDetails, additionalPowerShellExes);
+                const powerShellExeFinder = new platform.PowerShellExeFinder(
+                    testPlatform.platformDetails,
+                    additionalPowerShellExes,
+                );
 
                 let i = 0;
-                for (const additionalPwsh of powerShellExeFinder.enumerateAdditionalPowerShellInstallations()) {
-                    const expectedPowerShell = testPlatform.expectedPowerShellSequence[i];
+                for await (const additionalPwsh of powerShellExeFinder.enumerateAdditionalPowerShellInstallations()) {
+                    const expectedPowerShell =
+                        testPlatform.expectedPowerShellSequence[i];
                     i++;
 
-                    assert.strictEqual(additionalPwsh.exePath, expectedPowerShell.exePath);
-                    assert.strictEqual(additionalPwsh.displayName, expectedPowerShell.displayName);
+                    assert.strictEqual(
+                        additionalPwsh.exePath,
+                        expectedPowerShell.exePath,
+                    );
+                    assert.strictEqual(
+                        additionalPwsh.displayName,
+                        expectedPowerShell.displayName,
+                    );
                 }
             });
         }
diff --git a/test/core/settings.test.ts b/test/core/settings.test.ts
index 306872a2dc..117035a390 100644
--- a/test/core/settings.test.ts
+++ b/test/core/settings.test.ts
@@ -2,22 +2,28 @@
 // Licensed under the MIT License.
 
 import * as assert from "assert";
+import { existsSync } from "fs";
 import * as os from "os";
+import path from "path";
 import * as vscode from "vscode";
 import {
-    Settings,
-    getSettings,
-    getEffectiveConfigurationTarget,
     changeSetting,
     CommentType,
-    validateCwdSetting
+    getEffectiveConfigurationTarget,
+    getSettings,
+    Settings,
+    validateCwdSetting,
 } from "../../src/settings";
-import path from "path";
 import { ensureEditorServicesIsConnected } from "../utils";
 
 describe("Settings E2E", function () {
     async function changeCwdSetting(cwd: string | undefined): Promise<void> {
-        await changeSetting("cwd", cwd, vscode.ConfigurationTarget.Workspace, undefined);
+        await changeSetting(
+            "cwd",
+            cwd,
+            vscode.ConfigurationTarget.Workspace,
+            undefined,
+        );
     }
 
     async function resetCwdSetting(): Promise<void> {
@@ -33,6 +39,12 @@ describe("Settings E2E", function () {
 
         it("Loads the correct defaults", function () {
             const testSettings = new Settings();
+            if (existsSync("C:\\powershell-7\\pwsh.exe")) {
+                testSettings.powerShellAdditionalExePaths = {
+                    OneBranch: "C:\\powershell-7\\pwsh.exe",
+                };
+                testSettings.powerShellDefaultVersion = "OneBranch";
+            }
             const actualSettings = getSettings();
             assert.deepStrictEqual(actualSettings, testSettings);
         });
@@ -40,20 +52,38 @@ describe("Settings E2E", function () {
 
     describe("The 'changeSetting' method", function () {
         it("Updates correctly", async function () {
-            await changeSetting("helpCompletion", CommentType.LineComment, vscode.ConfigurationTarget.Workspace, undefined);
-            assert.strictEqual(getSettings().helpCompletion, CommentType.LineComment);
+            await changeSetting(
+                "helpCompletion",
+                CommentType.LineComment,
+                vscode.ConfigurationTarget.Workspace,
+                undefined,
+            );
+            assert.strictEqual(
+                getSettings().helpCompletion,
+                CommentType.LineComment,
+            );
         });
     });
 
     describe("The 'getEffectiveConfigurationTarget' method'", function () {
         it("Works for 'Workspace' target", async function () {
-            await changeSetting("helpCompletion", CommentType.LineComment, vscode.ConfigurationTarget.Workspace, undefined);
+            await changeSetting(
+                "helpCompletion",
+                CommentType.LineComment,
+                vscode.ConfigurationTarget.Workspace,
+                undefined,
+            );
             const target = getEffectiveConfigurationTarget("helpCompletion");
             assert.strictEqual(target, vscode.ConfigurationTarget.Workspace);
         });
 
         it("Works for 'undefined' target", async function () {
-            await changeSetting("helpCompletion", undefined, vscode.ConfigurationTarget.Workspace, undefined);
+            await changeSetting(
+                "helpCompletion",
+                undefined,
+                vscode.ConfigurationTarget.Workspace,
+                undefined,
+            );
             const target = getEffectiveConfigurationTarget("helpCompletion");
             assert.strictEqual(target, undefined);
         });
@@ -85,7 +115,10 @@ describe("Settings E2E", function () {
 
         it("Uses the home folder for ~ (tilde)", async function () {
             await changeCwdSetting("~");
-            assert.strictEqual(await validateCwdSetting(undefined), os.homedir());
+            assert.strictEqual(
+                await validateCwdSetting(undefined),
+                os.homedir(),
+            );
         });
 
         it("Accepts relative paths", async function () {
diff --git a/test/features/DebugSession.test.ts b/test/features/DebugSession.test.ts
index e27ef85274..986fbd45f7 100644
--- a/test/features/DebugSession.test.ts
+++ b/test/features/DebugSession.test.ts
@@ -4,22 +4,54 @@
 import structuredClone from "@ungap/structured-clone"; //Polyfill for structuredClone which will be present in Node 17.
 import * as assert from "assert";
 import Sinon from "sinon";
-import { DebugAdapterNamedPipeServer, DebugConfiguration, DebugSession, Extension, ExtensionContext, Range, SourceBreakpoint, TextDocument, TextEditor, Uri, commands, debug, extensions, window, workspace } from "vscode";
+import {
+    DebugAdapterNamedPipeServer,
+    type DebugConfiguration,
+    type DebugSession,
+    type Extension,
+    type ExtensionContext,
+    Range,
+    SourceBreakpoint,
+    type TextDocument,
+    type TextEditor,
+    Uri,
+    commands,
+    debug,
+    extensions,
+    window,
+    workspace,
+} from "vscode";
 import { Disposable } from "vscode-languageserver-protocol";
-import { DebugConfig, DebugSessionFeature, DebugConfigurations } from "../../src/features/DebugSession";
-import { IPowerShellExtensionClient } from "../../src/features/ExternalApi";
+import {
+    DebugConfig,
+    DebugConfigurations,
+    DebugSessionFeature,
+} from "../../src/features/DebugSession";
+import type { IPowerShellExtensionClient } from "../../src/features/ExternalApi";
+import type { IPlatformDetails } from "../../src/platform";
 import * as platform from "../../src/platform";
-import { IPlatformDetails } from "../../src/platform";
-import { IEditorServicesSessionDetails, IPowerShellVersionDetails, SessionManager } from "../../src/session";
+import {
+    type IEditorServicesSessionDetails,
+    type IPowerShellVersionDetails,
+    SessionManager,
+} from "../../src/session";
 import * as utils from "../../src/utils";
-import { BuildBinaryModuleMock, WaitEvent, ensureEditorServicesIsConnected, stubInterface, testLogger } from "../utils";
+import {
+    BuildBinaryModuleMock,
+    WaitEvent,
+    ensureEditorServicesIsConnected,
+    stubInterface,
+    testLogger,
+} from "../utils";
 
 const TEST_NUMBER = 7357; // 7357 = TEST. Get it? :)
 
 let defaultDebugConfig: DebugConfiguration;
 beforeEach(() => {
     // This prevents state from creeping into the template between test runs
-    defaultDebugConfig = structuredClone(DebugConfigurations[DebugConfig.LaunchCurrentFile]);
+    defaultDebugConfig = structuredClone(
+        DebugConfigurations[DebugConfig.LaunchCurrentFile],
+    );
 });
 
 describe("DebugSessionFeature", () => {
@@ -32,10 +64,10 @@ describe("DebugSessionFeature", () => {
      */
     function createDebugSessionFeatureStub({
         context = stubInterface<ExtensionContext>({
-            subscriptions: Array<Disposable>() //Needed for constructor
+            subscriptions: Array<Disposable>(), //Needed for constructor
         }),
         sessionManager = Sinon.createStubInstance(SessionManager),
-        logger = testLogger
+        logger = testLogger,
     }): DebugSessionFeature {
         return new DebugSessionFeature(context, sessionManager, logger);
     }
@@ -45,15 +77,33 @@ describe("DebugSessionFeature", () => {
         document: stubInterface<TextDocument>({
             uri: Uri.parse("file:///fakeUntitled.ps1"),
             languageId: "powershell",
-            isUntitled: true
-        })
+            isUntitled: true,
+        }),
     });
 
     beforeEach(() => {
         // Because we recreate DebugSessionFeature constantly, we need to avoid registering the same commands over and over.
-        Sinon.stub(commands, "registerCommand").returns(Disposable.create(() => {"Stubbed";}));
-        registerProviderStub = Sinon.stub(debug, "registerDebugConfigurationProvider").returns(Disposable.create(() => {"Stubbed";}));
-        registerFactoryStub = Sinon.stub(debug, "registerDebugAdapterDescriptorFactory").returns(Disposable.create(() => {"Stubbed";}));
+        Sinon.stub(commands, "registerCommand").returns(
+            Disposable.create(() => {
+                "Stubbed";
+            }),
+        );
+        registerProviderStub = Sinon.stub(
+            debug,
+            "registerDebugConfigurationProvider",
+        ).returns(
+            Disposable.create(() => {
+                "Stubbed";
+            }),
+        );
+        registerFactoryStub = Sinon.stub(
+            debug,
+            "registerDebugAdapterDescriptorFactory",
+        ).returns(
+            Disposable.create(() => {
+                "Stubbed";
+            }),
+        );
     });
 
     afterEach(() => {
@@ -63,13 +113,23 @@ describe("DebugSessionFeature", () => {
     describe("Constructor", () => {
         it("Registers debug configuration provider and factory", () => {
             const context = stubInterface<ExtensionContext>({
-                subscriptions: Array<Disposable>()
+                subscriptions: Array<Disposable>(),
             });
 
-            createDebugSessionFeatureStub({context: context});
-            assert.ok(registerFactoryStub.calledOnce, "Debug adapter factory method called");
-            assert.ok(registerProviderStub.calledTwice, "Debug config provider registered for both Initial and Dynamic");
-            assert.equal(context.subscriptions.length, 4, "DebugSessionFeature disposables populated");
+            createDebugSessionFeatureStub({ context: context });
+            assert.ok(
+                registerFactoryStub.calledOnce,
+                "Debug adapter factory method called",
+            );
+            assert.ok(
+                registerProviderStub.calledTwice,
+                "Debug config provider registered for both Initial and Dynamic",
+            );
+            assert.equal(
+                context.subscriptions.length,
+                4,
+                "DebugSessionFeature disposables populated",
+            );
             // TODO: Validate the registration content, such as the language name
         });
     });
@@ -81,26 +141,38 @@ describe("DebugSessionFeature", () => {
             // Need to have an editor window "open" for this not to error out
             Sinon.stub(window, "activeTextEditor").value(untitledEditor);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfiguration(undefined, noRequestConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfiguration(undefined, noRequestConfig);
 
             assert.equal(actual!.current_document, true);
-            assert.equal(actual!.request, DebugConfigurations[DebugConfig.LaunchCurrentFile].request);
+            assert.equal(
+                actual!.request,
+                DebugConfigurations[DebugConfig.LaunchCurrentFile].request,
+            );
         });
 
         it("Errors if current file config was specified but no file is open in the editor", async () => {
             Sinon.stub(window, "activeTextEditor").value(undefined);
             const logger = Sinon.stub(testLogger);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfiguration(undefined, defaultDebugConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfiguration(undefined, defaultDebugConfig);
 
             assert.equal(actual!, undefined);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /you must first open a PowerShell script file/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /you must first open a PowerShell script file/,
+            );
         });
 
         it("Detects an untitled document", async () => {
             Sinon.stub(window, "activeTextEditor").value(untitledEditor);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfiguration(undefined, defaultDebugConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfiguration(undefined, defaultDebugConfig);
 
             assert.equal(actual!.untitled_document, true);
             assert.equal(actual!.script, "file:///fakeUntitled.ps1");
@@ -111,7 +183,12 @@ describe("DebugSessionFeature", () => {
         it("Sets internalConsoleOptions to neverOpen", async () => {
             Sinon.stub(window, "activeTextEditor").value(untitledEditor);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, defaultDebugConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                defaultDebugConfig,
+            );
 
             assert.equal(actual!.internalConsoleOptions, "neverOpen");
         });
@@ -120,19 +197,40 @@ describe("DebugSessionFeature", () => {
             invalidRequestConfig.request = "notAttachOrLaunch";
             const logger = Sinon.stub(testLogger);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, invalidRequestConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                invalidRequestConfig,
+            );
 
             assert.equal(actual, null);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /request type was invalid/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /request type was invalid/,
+            );
         });
 
         it("Uses createTemporaryIntegratedConsole config setting if not explicitly specified", async () => {
             Sinon.stub(window, "activeTextEditor").value(untitledEditor);
-            assert.equal(defaultDebugConfig.createTemporaryIntegratedConsole, undefined, "Default config should have no temp integrated console setting");
+            assert.equal(
+                defaultDebugConfig.createTemporaryIntegratedConsole,
+                undefined,
+                "Default config should have no temp integrated console setting",
+            );
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, defaultDebugConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                defaultDebugConfig,
+            );
 
-            assert.notEqual(actual!.createTemporaryIntegratedConsole, undefined, "createTemporaryIntegratedConsole should have received a value from the settings and no longer be undefined");
+            assert.notEqual(
+                actual!.createTemporaryIntegratedConsole,
+                undefined,
+                "createTemporaryIntegratedConsole should have received a value from the settings and no longer be undefined",
+            );
         });
 
         it("LaunchCurrentFile: Rejects non-Powershell language active editor", async () => {
@@ -140,21 +238,30 @@ describe("DebugSessionFeature", () => {
                 document: stubInterface<TextDocument>({
                     uri: Uri.parse("file:///fakeUntitled.ps1"),
                     languageId: "NotPowerShell",
-                    isUntitled: true
-                })
+                    isUntitled: true,
+                }),
             });
             const currentDocConfig: DebugConfiguration = defaultDebugConfig;
             currentDocConfig.current_document = true;
             Sinon.stub(window, "activeTextEditor").value(nonPSEditor);
             const logger = Sinon.stub(testLogger);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, currentDocConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                currentDocConfig,
+            );
 
             assert.equal(actual, undefined, "Debug session should end");
-            assert.match(logger.writeAndShowError.firstCall.args[0], /debugging this language mode/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /debugging this language mode/,
+            );
         });
 
-        it("LaunchScript: Rejects scripts without a powershell script extension", async () => {
+        // Skipped until we can fix the stub
+        it.skip("LaunchScript: Rejects scripts without a powershell script extension", async () => {
             const currentDocConfig: DebugConfiguration = defaultDebugConfig;
             currentDocConfig.current_document = true;
             currentDocConfig.script = "file:///notPowerShell.txt";
@@ -163,10 +270,19 @@ describe("DebugSessionFeature", () => {
             Sinon.stub(utils, "checkIfFileExists").resolves(true);
             const logger = Sinon.stub(testLogger);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, currentDocConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                currentDocConfig,
+            );
 
             assert.equal(actual, undefined);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /debugging this file type/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /debugging this file type/,
+            );
+            Sinon.restore();
         });
 
         it("Prevents debugging untitled files in a temp console", async () => {
@@ -176,13 +292,21 @@ describe("DebugSessionFeature", () => {
             Sinon.stub(window, "activeTextEditor").value(untitledEditor);
             const logger = Sinon.stub(testLogger);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, currentDocConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                currentDocConfig,
+            );
 
             assert.equal(actual, undefined);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /debugging untitled/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /debugging untitled/,
+            );
         });
 
-        it("Attach: Exits if session version details cannot be retrieved", async () =>  {
+        it("Attach: Exits if session version details cannot be retrieved", async () => {
             const attachConfig: DebugConfiguration = defaultDebugConfig;
             attachConfig.request = "attach";
             const logger = Sinon.stub(testLogger);
@@ -190,36 +314,49 @@ describe("DebugSessionFeature", () => {
             sessionManager.getPowerShellVersionDetails.returns(undefined);
 
             const actual = await createDebugSessionFeatureStub({
-                sessionManager: sessionManager
-            }).resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+                sessionManager: sessionManager,
+            }).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                attachConfig,
+            );
 
             assert.equal(actual, undefined);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /session version details were not found/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /session version details were not found/,
+            );
             assert.ok(sessionManager.getPowerShellVersionDetails.calledOnce);
         });
 
-        it("Attach: Prevents attach on non-windows if not PS7.0 or higher", async() => {
+        // Skipped until we can fix the stub
+        it.skip("Attach: Prevents attach on non-windows if not PS7.0 or higher", async () => {
             const attachConfig: DebugConfiguration = defaultDebugConfig;
             attachConfig.request = "attach";
             const logger = Sinon.stub(testLogger);
             const sessionManager = Sinon.createStubInstance(SessionManager, {});
             Sinon.stub(platform, "getPlatformDetails").returns(
                 stubInterface<IPlatformDetails>({
-                    operatingSystem: platform.OperatingSystem.MacOS
-                })
+                    operatingSystem: platform.OperatingSystem.MacOS,
+                }),
             );
             sessionManager.getPowerShellVersionDetails.returns(
                 stubInterface<IPowerShellVersionDetails>({
-                    version: "6.2.3"
-                })
+                    version: "6.2.3",
+                }),
             );
 
             const actual = await createDebugSessionFeatureStub({
-                sessionManager: sessionManager
-            }).resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+                sessionManager: sessionManager,
+            }).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                attachConfig,
+            );
 
             assert.equal(actual, undefined);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /requires PowerShell 7/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /requires PowerShell 7/,
+            );
             assert.ok(sessionManager.getPowerShellVersionDetails.calledOnce);
         });
 
@@ -232,17 +369,24 @@ describe("DebugSessionFeature", () => {
             const sessionManager = Sinon.createStubInstance(SessionManager, {});
             sessionManager.getPowerShellVersionDetails.returns(
                 stubInterface<IPowerShellVersionDetails>({
-                    version: "7.2.3"
-                })
+                    version: "7.2.3",
+                }),
             );
             const debugSessionFeatureStub = createDebugSessionFeatureStub({
-                sessionManager: sessionManager
+                sessionManager: sessionManager,
             });
 
-            // eslint-disable-next-line @typescript-eslint/no-explicit-any
-            const pickPSHostProcessStub = Sinon.stub(debugSessionFeatureStub , "pickPSHostProcess" as any).resolves(7357);
+            const pickPSHostProcessStub = Sinon.stub(
+                debugSessionFeatureStub,
+                // eslint-disable-next-line @typescript-eslint/no-explicit-any
+                "pickPSHostProcess" as any,
+            ).resolves(7357);
 
-            const actual = await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const actual =
+                await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(
+                    undefined,
+                    attachConfig,
+                );
 
             assert.equal(actual!.processId, TEST_NUMBER);
             assert.ok(pickPSHostProcessStub.calledOnce);
@@ -257,17 +401,24 @@ describe("DebugSessionFeature", () => {
             const sessionManager = Sinon.createStubInstance(SessionManager, {});
             sessionManager.getPowerShellVersionDetails.returns(
                 stubInterface<IPowerShellVersionDetails>({
-                    version: "7.2.3"
-                })
+                    version: "7.2.3",
+                }),
             );
             const debugSessionFeatureStub = createDebugSessionFeatureStub({
-                sessionManager: sessionManager
+                sessionManager: sessionManager,
             });
 
-            // eslint-disable-next-line @typescript-eslint/no-explicit-any
-            const pickPSHostProcessStub = Sinon.stub(debugSessionFeatureStub, "pickPSHostProcess" as any).resolves(undefined);
+            const pickPSHostProcessStub = Sinon.stub(
+                debugSessionFeatureStub,
+                // eslint-disable-next-line @typescript-eslint/no-explicit-any
+                "pickPSHostProcess" as any,
+            ).resolves(undefined);
 
-            const actual = await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const actual =
+                await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(
+                    undefined,
+                    attachConfig,
+                );
 
             assert.equal(actual, undefined);
             assert.ok(pickPSHostProcessStub.calledOnce);
@@ -281,17 +432,24 @@ describe("DebugSessionFeature", () => {
             const sessionManager = Sinon.createStubInstance(SessionManager, {});
             sessionManager.getPowerShellVersionDetails.returns(
                 stubInterface<IPowerShellVersionDetails>({
-                    version: "7.2.3"
-                })
+                    version: "7.2.3",
+                }),
             );
             const debugSessionFeatureStub = createDebugSessionFeatureStub({
-                sessionManager: sessionManager
+                sessionManager: sessionManager,
             });
 
-            // eslint-disable-next-line @typescript-eslint/no-explicit-any
-            const pickRunspaceStub = Sinon.stub(debugSessionFeatureStub, "pickRunspace" as any).resolves(TEST_NUMBER);
+            const pickRunspaceStub = Sinon.stub(
+                debugSessionFeatureStub,
+                // eslint-disable-next-line @typescript-eslint/no-explicit-any
+                "pickRunspace" as any,
+            ).resolves(TEST_NUMBER);
 
-            const actual = await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const actual =
+                await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(
+                    undefined,
+                    attachConfig,
+                );
 
             assert.equal(actual!.runspaceId, TEST_NUMBER);
             assert.ok(pickRunspaceStub.calledOnceWith(TEST_NUMBER));
@@ -305,17 +463,24 @@ describe("DebugSessionFeature", () => {
             const sessionManager = Sinon.createStubInstance(SessionManager, {});
             sessionManager.getPowerShellVersionDetails.returns(
                 stubInterface<IPowerShellVersionDetails>({
-                    version: "7.2.3"
-                })
+                    version: "7.2.3",
+                }),
             );
             const debugSessionFeatureStub = createDebugSessionFeatureStub({
-                sessionManager: sessionManager
+                sessionManager: sessionManager,
             });
 
-            // eslint-disable-next-line @typescript-eslint/no-explicit-any
-            const pickRunspaceStub = Sinon.stub(debugSessionFeatureStub, "pickRunspace" as any).resolves(undefined);
-
-            const actual = await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const pickRunspaceStub = Sinon.stub(
+                debugSessionFeatureStub,
+                // eslint-disable-next-line @typescript-eslint/no-explicit-any
+                "pickRunspace" as any,
+            ).resolves(undefined);
+
+            const actual =
+                await debugSessionFeatureStub.resolveDebugConfigurationWithSubstitutedVariables(
+                    undefined,
+                    attachConfig,
+                );
             assert.equal(actual, undefined);
             assert.ok(pickRunspaceStub.calledOnceWith(TEST_NUMBER));
         });
@@ -326,13 +491,21 @@ describe("DebugSessionFeature", () => {
             attachConfig.createTemporaryIntegratedConsole = true;
             attachConfig.attachDotnetDebugger = true;
             Sinon.stub(extensions, "getExtension").returns(
-                stubInterface<Extension<IPowerShellExtensionClient>>()
+                stubInterface<Extension<IPowerShellExtensionClient>>(),
             );
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                attachConfig,
+            );
 
             const dotnetAttachConfig = actual!.dotnetAttachConfig;
-            assert.equal(dotnetAttachConfig.name, "Dotnet Debugger: Temporary Extension Terminal");
+            assert.equal(
+                dotnetAttachConfig.name,
+                "Dotnet Debugger: Temporary Extension Terminal",
+            );
             assert.equal(dotnetAttachConfig.request, "attach");
             assert.equal(dotnetAttachConfig.type, "coreclr");
             assert.equal(dotnetAttachConfig.processId, undefined);
@@ -345,10 +518,18 @@ describe("DebugSessionFeature", () => {
             attachConfig.attachDotnetDebugger = true;
             const logger = Sinon.stub(testLogger);
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                attachConfig,
+            );
 
             assert.equal(actual!, null);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /dotnet debugging without using a temporary console/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /dotnet debugging without using a temporary console/,
+            );
         });
 
         it("Errors if dotnetDebuggerConfigName was provided but the config was not found", async () => {
@@ -359,13 +540,21 @@ describe("DebugSessionFeature", () => {
             attachConfig.dotnetDebuggerConfigName = "not a real config";
             const logger = Sinon.stub(testLogger);
             Sinon.stub(extensions, "getExtension").returns(
-                stubInterface<Extension<IPowerShellExtensionClient>>()
+                stubInterface<Extension<IPowerShellExtensionClient>>(),
             );
 
-            const actual = await createDebugSessionFeatureStub({}).resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const actual = await createDebugSessionFeatureStub(
+                {},
+            ).resolveDebugConfigurationWithSubstitutedVariables(
+                undefined,
+                attachConfig,
+            );
 
             assert.equal(actual!, null);
-            assert.match(logger.writeAndShowError.firstCall.args[0], /matching launch config was not found/);
+            assert.match(
+                logger.writeAndShowError.firstCall.args[0],
+                /matching launch config was not found/,
+            );
         });
 
         it("Finds the correct dotnetDebuggerConfigName", async () => {
@@ -378,29 +567,30 @@ describe("DebugSessionFeature", () => {
                 {
                     name: "BadCandidate1",
                     type: "powershell",
-                    request: "attach"
+                    request: "attach",
                 },
                 {
                     name: "BadCandidate2",
                     type: "coreclr",
-                    request: "attach"
+                    request: "attach",
                 },
-                { // This one has launch instead of attach and even tho it has same name, should not be matched
+                {
+                    // This one has launch instead of attach and even tho it has same name, should not be matched
                     name: foundDotnetConfig.name,
                     type: "coreclr",
-                    request: "launch"
+                    request: "launch",
                 },
                 foundDotnetConfig, //This is the one we want to match
                 {
                     name: foundDotnetConfig.name,
                     type: "notcoreclrExactly",
-                    request: "attach"
+                    request: "attach",
                 },
                 {
                     name: `${foundDotnetConfig.name}notexactlythisname`,
                     type: "coreclr",
-                    request: "attach"
-                }
+                    request: "attach",
+                },
             ];
             const attachConfig = defaultDebugConfig;
             attachConfig.script = "test.ps1"; // This bypasses the ${file} logic
@@ -409,15 +599,25 @@ describe("DebugSessionFeature", () => {
             attachConfig.dotnetDebuggerConfigName = foundDotnetConfig.name;
             const debugSessionFeature = createDebugSessionFeatureStub({});
 
-            // eslint-disable-next-line @typescript-eslint/no-explicit-any
-            Sinon.stub(debugSessionFeature, "getLaunchConfigurations" as any).returns(candidateDotnetConfigs);
+            Sinon.stub(
+                debugSessionFeature,
+                // eslint-disable-next-line @typescript-eslint/no-explicit-any
+                "getLaunchConfigurations" as any,
+            ).returns(candidateDotnetConfigs);
 
-            const config = await debugSessionFeature.resolveDebugConfigurationWithSubstitutedVariables(undefined, attachConfig);
+            const config =
+                await debugSessionFeature.resolveDebugConfigurationWithSubstitutedVariables(
+                    undefined,
+                    attachConfig,
+                );
 
             // This config will only be present if the C# extension is installed.
             if (extensions.getExtension("ms-dotnettools.csharp")) {
                 assert.ok(config);
-                assert.deepStrictEqual(config.dotnetAttachConfig, foundDotnetConfig);
+                assert.deepStrictEqual(
+                    config.dotnetAttachConfig,
+                    foundDotnetConfig,
+                );
             } else {
                 assert.ok(!config);
             }
@@ -428,36 +628,40 @@ describe("DebugSessionFeature", () => {
         it("Creates a named pipe server for the debug adapter", async () => {
             const debugSessionFeature = createDebugSessionFeatureStub({
                 sessionManager: Sinon.createStubInstance(SessionManager, {
-                    getSessionDetails: stubInterface<IEditorServicesSessionDetails>({
-                        debugServicePipeName: "testPipeName"
-                    })
+                    getSessionDetails:
+                        stubInterface<IEditorServicesSessionDetails>({
+                            debugServicePipeName: "testPipeName",
+                        }),
                 }),
             });
             const debugSession = stubInterface<DebugSession>({
                 configuration: stubInterface<DebugConfiguration>({
-                    createTemporaryIntegratedConsole: false
-                })
+                    createTemporaryIntegratedConsole: false,
+                }),
             });
 
-            const debugAdapterDescriptor = await debugSessionFeature.createDebugAdapterDescriptor(debugSession, undefined);
+            const debugAdapterDescriptor =
+                await debugSessionFeature.createDebugAdapterDescriptor(
+                    debugSession,
+                    undefined,
+                );
 
             // Confirm debugAdapterDescriptor is of type debugadapternamedpipeserver
-            assert.ok(debugAdapterDescriptor instanceof DebugAdapterNamedPipeServer);
+            assert.ok(
+                debugAdapterDescriptor instanceof DebugAdapterNamedPipeServer,
+            );
             assert.equal(debugAdapterDescriptor.path, "testPipeName");
         });
     });
 });
 
-describe("DebugSessionFeature E2E", function() {
-    // E2E tests can take a while to run since the debugger has to start up and attach
-    this.slow(20000);
+describe("DebugSessionFeature E2E", function () {
     before(async () => {
         // Registers and warms up the debug adapter and the PowerShell Extension Terminal
         await ensureEditorServicesIsConnected();
     });
 
     it("Starts and stops a debugging session", async () => {
-
         // Inspect the debug session via the started events to ensure it is correct
         const startDebugSession = new Promise<DebugSession>((resolve) => {
             const event = debug.onDidStartDebugSession((session) => {
@@ -473,13 +677,28 @@ describe("DebugSessionFeature E2E", function() {
         });
 
         const config = DebugConfigurations[DebugConfig.InteractiveSession];
-        assert.ok(await debug.startDebugging(undefined, config), "Debug session should start");
-        assert.equal((await startDebugSession).name, config.name, "Debug session name should match when started");
+        assert.ok(
+            await debug.startDebugging(undefined, config),
+            "Debug session should start",
+        );
+        assert.equal(
+            (await startDebugSession).name,
+            config.name,
+            "Debug session name should match when started",
+        );
 
         await debug.stopDebugging(await startDebugSession);
         assert.ok(await stopDebugSession, "Debug session should stop");
-        assert.equal((await stopDebugSession).name, config.name, "Debug session name should match when stopped");
-        assert.equal((await stopDebugSession).configuration.internalConsoleOptions, "neverOpen", "Debug session should always have neverOpen internalConsoleOptions");
+        assert.equal(
+            (await stopDebugSession).name,
+            config.name,
+            "Debug session name should match when stopped",
+        );
+        assert.equal(
+            (await stopDebugSession).configuration.internalConsoleOptions,
+            "neverOpen",
+            "Debug session should always have neverOpen internalConsoleOptions",
+        );
     });
 
     describe("Binary Modules", () => {
@@ -490,7 +709,10 @@ describe("DebugSessionFeature E2E", function() {
                 // These tests require that extension to be installed in the test environment.
                 this.skip();
             }
-            binaryModulePath = Uri.joinPath(workspace.workspaceFolders![0].uri, "BinaryModule");
+            binaryModulePath = Uri.joinPath(
+                workspace.workspaceFolders![0].uri,
+                "BinaryModule",
+            );
             BuildBinaryModuleMock();
             await ensureEditorServicesIsConnected();
         });
@@ -503,13 +725,21 @@ describe("DebugSessionFeature E2E", function() {
         });
 
         it("Debugs a binary module script", async () => {
-            const launchScriptConfig = structuredClone(DebugConfigurations[DebugConfig.LaunchScript]);
-            launchScriptConfig.script = Uri.joinPath(binaryModulePath, "BinaryModuleTest.ps1").fsPath;
+            const launchScriptConfig = structuredClone(
+                DebugConfigurations[DebugConfig.LaunchScript],
+            );
+            launchScriptConfig.script = Uri.joinPath(
+                binaryModulePath,
+                "BinaryModuleTest.ps1",
+            ).fsPath;
             launchScriptConfig.attachDotnetDebugger = true;
             launchScriptConfig.createTemporaryIntegratedConsole = true;
             const startDebugging = Sinon.spy(debug, "startDebugging");
 
-            const debugStarted = await debug.startDebugging(undefined, launchScriptConfig);
+            const debugStarted = await debug.startDebugging(
+                undefined,
+                launchScriptConfig,
+            );
             assert.ok(debugStarted);
 
             await debug.stopDebugging(undefined);
@@ -517,38 +747,62 @@ describe("DebugSessionFeature E2E", function() {
             assert.ok(startDebugging.calledTwice);
             assert.ok(startDebugging.calledWith(undefined, launchScriptConfig));
             // The C# child process
-            assert.ok(startDebugging.calledWithMatch(
-                undefined,
-                Sinon.match.has("type", "coreclr"), // The new child debugger
-                Sinon.match.has("type", "PowerShell") // The parent session
-            ), "The C# debugger child process is created with the PowerShell debugger as the parent");
+            assert.ok(
+                startDebugging.calledWithMatch(
+                    undefined,
+                    Sinon.match.has("type", "coreclr"), // The new child debugger
+                    Sinon.match.has("type", "PowerShell"), // The parent session
+                ),
+                "The C# debugger child process is created with the PowerShell debugger as the parent",
+            );
         });
 
         it("Stops at a binary module breakpoint", async () => {
-            const launchScriptConfig = structuredClone(DebugConfigurations[DebugConfig.LaunchCurrentFile]);
+            const launchScriptConfig = structuredClone(
+                DebugConfigurations[DebugConfig.LaunchCurrentFile],
+            );
             launchScriptConfig.attachDotnetDebugger = true;
             launchScriptConfig.createTemporaryIntegratedConsole = true;
-            const testScriptPath = Uri.joinPath(binaryModulePath, "BinaryModuleTest.ps1");
-            const cmdletSourcePath = Uri.joinPath(binaryModulePath, "TestSampleCmdletCommand.cs");
-            const testScriptDocument = await workspace.openTextDocument(testScriptPath);
+            const testScriptPath = Uri.joinPath(
+                binaryModulePath,
+                "BinaryModuleTest.ps1",
+            );
+            const cmdletSourcePath = Uri.joinPath(
+                binaryModulePath,
+                "TestSampleCmdletCommand.cs",
+            );
+            const testScriptDocument =
+                await workspace.openTextDocument(testScriptPath);
             await window.showTextDocument(testScriptDocument);
 
             // We cant see when a breakpoint is hit because the code we would spy on is in the C# extension or is vscode private, but we can see if the debug session changes which should only happen when the debug session context switches to C#, so that's good enough.
 
             //We wire this up before starting the debug session so the event is registered
-            const dotnetDebugSessionActive = WaitEvent(debug.onDidChangeActiveDebugSession, (session) => {
-                return !!session?.name.match(/Dotnet Debugger/);
-            });
+            const dotnetDebugSessionActive = WaitEvent(
+                debug.onDidChangeActiveDebugSession,
+                (session) => {
+                    return !!session?.name.match(/Dotnet Debugger/);
+                },
+            );
 
             // Break at beginProcessing of the cmdlet
             debug.addBreakpoints([
-                new SourceBreakpoint({
-                    uri: cmdletSourcePath,
-                    range: new Range(26, 0, 26, 0) //BeginProcessing
-                }, true, undefined, undefined, "TEST-BinaryModuleBreakpoint")
+                new SourceBreakpoint(
+                    {
+                        uri: cmdletSourcePath,
+                        range: new Range(26, 0, 26, 0), //BeginProcessing
+                    },
+                    true,
+                    undefined,
+                    undefined,
+                    "TEST-BinaryModuleBreakpoint",
+                ),
             ]);
 
-            const debugStarted = await debug.startDebugging(undefined, launchScriptConfig);
+            const debugStarted = await debug.startDebugging(
+                undefined,
+                launchScriptConfig,
+            );
             console.log(debug.breakpoints);
             const dotnetDebugSession = await dotnetDebugSessionActive;
             console.log(debug.activeDebugSession);
diff --git a/test/features/ExternalApi.test.ts b/test/features/ExternalApi.test.ts
index 84fe48af96..d0b3e56641 100644
--- a/test/features/ExternalApi.test.ts
+++ b/test/features/ExternalApi.test.ts
@@ -2,8 +2,11 @@
 // Licensed under the MIT License.
 
 import * as assert from "assert";
+import type {
+    IExternalPowerShellDetails,
+    IPowerShellExtensionClient,
+} from "../../src/features/ExternalApi";
 import utils = require("../utils");
-import { IExternalPowerShellDetails, IPowerShellExtensionClient } from "../../src/features/ExternalApi";
 
 describe("ExternalApi feature", function () {
     describe("External extension registration", function () {
@@ -13,35 +16,48 @@ describe("ExternalApi feature", function () {
         });
 
         it("Registers and unregisters an extension", function () {
-            const sessionId: string = extension.registerExternalExtension(utils.extensionId);
+            const sessionId: string = extension.registerExternalExtension(
+                utils.extensionId,
+            );
             assert.notStrictEqual(sessionId, "");
             assert.notStrictEqual(sessionId, null);
             assert.strictEqual(
                 extension.unregisterExternalExtension(sessionId),
-                true);
+                true,
+            );
         });
 
         it("Registers and unregisters an extension with a version", function () {
-            const sessionId: string = extension.registerExternalExtension(utils.extensionId, "v2");
+            const sessionId: string = extension.registerExternalExtension(
+                utils.extensionId,
+                "v2",
+            );
             assert.notStrictEqual(sessionId, "");
             assert.notStrictEqual(sessionId, null);
             assert.strictEqual(
                 extension.unregisterExternalExtension(sessionId),
-                true);
+                true,
+            );
         });
 
         it("Rejects if not registered", async function () {
-            await assert.rejects(async () => await extension.getPowerShellVersionDetails(""));
+            await assert.rejects(
+                async () => await extension.getPowerShellVersionDetails(""),
+            );
         });
 
         it("Throws if attempting to register an extension more than once", function () {
-            const sessionId: string = extension.registerExternalExtension(utils.extensionId);
+            const sessionId: string = extension.registerExternalExtension(
+                utils.extensionId,
+            );
             try {
                 assert.throws(
-                    () => extension.registerExternalExtension(utils.extensionId),
+                    () =>
+                        extension.registerExternalExtension(utils.extensionId),
                     {
-                        message: `The extension '${utils.extensionId}' is already registered.`
-                    });
+                        message: `The extension '${utils.extensionId}' is already registered.`,
+                    },
+                );
             } finally {
                 extension.unregisterExternalExtension(sessionId);
             }
@@ -51,8 +67,10 @@ describe("ExternalApi feature", function () {
             assert.throws(
                 () => extension.unregisterExternalExtension("not-real"),
                 {
-                    message: "No extension registered with session UUID: not-real"
-                });
+                    message:
+                        "No extension registered with session UUID: not-real",
+                },
+            );
         });
     });
 
@@ -65,10 +83,13 @@ describe("ExternalApi feature", function () {
             sessionId = extension.registerExternalExtension(utils.extensionId);
         });
 
-        after(function () { extension.unregisterExternalExtension(sessionId); });
+        after(function () {
+            extension.unregisterExternalExtension(sessionId);
+        });
 
         it("Gets non-empty version details from the PowerShell Editor Services", async function () {
-            const versionDetails: IExternalPowerShellDetails = await extension.getPowerShellVersionDetails(sessionId);
+            const versionDetails: IExternalPowerShellDetails =
+                await extension.getPowerShellVersionDetails(sessionId);
 
             assert.notStrictEqual(versionDetails.architecture, "");
             assert.notStrictEqual(versionDetails.architecture, null);
diff --git a/test/features/ISECompatibility.test.ts b/test/features/ISECompatibility.test.ts
index 0f2152c1c6..19a768c56a 100644
--- a/test/features/ISECompatibility.test.ts
+++ b/test/features/ISECompatibility.test.ts
@@ -9,20 +9,33 @@ import utils = require("../utils");
 describe("ISE compatibility feature", function () {
     let currentTheme: string | undefined;
 
-    async function enableISEMode(): Promise<void> { await vscode.commands.executeCommand("PowerShell.EnableISEMode"); }
-    async function disableISEMode(): Promise<void> { await vscode.commands.executeCommand("PowerShell.DisableISEMode"); }
-    async function toggleISEMode(): Promise<void> { await vscode.commands.executeCommand("PowerShell.ToggleISEMode"); }
+    async function enableISEMode(): Promise<void> {
+        await vscode.commands.executeCommand("PowerShell.EnableISEMode");
+    }
+    async function disableISEMode(): Promise<void> {
+        await vscode.commands.executeCommand("PowerShell.DisableISEMode");
+    }
+    async function toggleISEMode(): Promise<void> {
+        await vscode.commands.executeCommand("PowerShell.ToggleISEMode");
+    }
 
     before(async function () {
         // Save user's current theme.
-        currentTheme = await vscode.workspace.getConfiguration("workbench").get("colorTheme");
+        currentTheme = await vscode.workspace
+            .getConfiguration("workbench")
+            .get("colorTheme");
         await utils.ensureEditorServicesIsConnected();
     });
 
     after(async function () {
         // Reset user's current theme.
-        await vscode.workspace.getConfiguration("workbench").update("colorTheme", currentTheme, true);
-        assert.strictEqual(vscode.workspace.getConfiguration("workbench").get("colorTheme"), currentTheme);
+        await vscode.workspace
+            .getConfiguration("workbench")
+            .update("colorTheme", currentTheme, true);
+        assert.strictEqual(
+            vscode.workspace.getConfiguration("workbench").get("colorTheme"),
+            currentTheme,
+        );
     });
 
     describe("Enable ISE Mode updates expected settings", function () {
@@ -30,7 +43,9 @@ describe("ISE compatibility feature", function () {
         after(disableISEMode);
         for (const iseSetting of ISECompatibilityFeature.settings) {
             it(`Sets ${iseSetting.name} correctly`, function () {
-                const currently = vscode.workspace.getConfiguration(iseSetting.path).get(iseSetting.name);
+                const currently = vscode.workspace
+                    .getConfiguration(iseSetting.path)
+                    .get(iseSetting.name);
                 assert.strictEqual(currently, iseSetting.value);
             });
         }
@@ -42,7 +57,9 @@ describe("ISE compatibility feature", function () {
         after(disableISEMode);
         for (const iseSetting of ISECompatibilityFeature.settings) {
             it(`Reverts ${iseSetting.name} correctly`, function () {
-                const currently = vscode.workspace.getConfiguration(iseSetting.path).get(iseSetting.name);
+                const currently = vscode.workspace
+                    .getConfiguration(iseSetting.path)
+                    .get(iseSetting.name);
                 assert.notStrictEqual(currently, iseSetting.value);
             });
         }
@@ -54,7 +71,9 @@ describe("ISE compatibility feature", function () {
         after(disableISEMode);
         for (const iseSetting of ISECompatibilityFeature.settings) {
             it(`Reverts ${iseSetting.name} correctly`, function () {
-                const currently = vscode.workspace.getConfiguration(iseSetting.path).get(iseSetting.name);
+                const currently = vscode.workspace
+                    .getConfiguration(iseSetting.path)
+                    .get(iseSetting.name);
                 assert.notStrictEqual(currently, iseSetting.value);
             });
         }
@@ -66,40 +85,66 @@ describe("ISE compatibility feature", function () {
         after(disableISEMode);
         for (const iseSetting of ISECompatibilityFeature.settings) {
             it(`Sets ${iseSetting.name} correctly`, function () {
-                const currently = vscode.workspace.getConfiguration(iseSetting.path).get(iseSetting.name);
+                const currently = vscode.workspace
+                    .getConfiguration(iseSetting.path)
+                    .get(iseSetting.name);
                 assert.strictEqual(currently, iseSetting.value);
             });
         }
     });
 
     describe("Color theme interactions", function () {
-        // These tests are slow because they change the user's theme.
-        this.slow(3000);
         beforeEach(enableISEMode);
 
         function assertISESettings(): void {
             for (const iseSetting of ISECompatibilityFeature.settings) {
-                const currently = vscode.workspace.getConfiguration(iseSetting.path).get(iseSetting.name);
+                const currently = vscode.workspace
+                    .getConfiguration(iseSetting.path)
+                    .get(iseSetting.name);
                 assert.notStrictEqual(currently, iseSetting.value);
             }
         }
 
         it("Changes the theme back from PowerShell ISE", async function () {
             // Change state to something that DisableISEMode will change
-            await vscode.workspace.getConfiguration("workbench").update("colorTheme", "PowerShell ISE", true);
-            assert.strictEqual(vscode.workspace.getConfiguration("workbench").get("colorTheme"), "PowerShell ISE");
+            await vscode.workspace
+                .getConfiguration("workbench")
+                .update("colorTheme", "PowerShell ISE", true);
+            assert.strictEqual(
+                vscode.workspace
+                    .getConfiguration("workbench")
+                    .get("colorTheme"),
+                "PowerShell ISE",
+            );
             await disableISEMode();
             assertISESettings();
         });
 
         it("Doesn't change theme if it was manually changed", async function () {
-            assert.strictEqual(vscode.workspace.getConfiguration("workbench").get("colorTheme"), "PowerShell ISE");
+            assert.strictEqual(
+                vscode.workspace
+                    .getConfiguration("workbench")
+                    .get("colorTheme"),
+                "PowerShell ISE",
+            );
             // "Manually" change theme after enabling ISE mode. Use a built-in theme but not the default.
-            await vscode.workspace.getConfiguration("workbench").update("colorTheme", "Monokai", true);
-            assert.strictEqual(vscode.workspace.getConfiguration("workbench").get("colorTheme"), "Monokai");
+            await vscode.workspace
+                .getConfiguration("workbench")
+                .update("colorTheme", "Monokai", true);
+            assert.strictEqual(
+                vscode.workspace
+                    .getConfiguration("workbench")
+                    .get("colorTheme"),
+                "Monokai",
+            );
             await disableISEMode();
             assertISESettings();
-            assert.strictEqual(vscode.workspace.getConfiguration("workbench").get("colorTheme"), "Monokai");
+            assert.strictEqual(
+                vscode.workspace
+                    .getConfiguration("workbench")
+                    .get("colorTheme"),
+                "Monokai",
+            );
         });
     });
 });
diff --git a/test/features/UpdatePowerShell.test.ts b/test/features/UpdatePowerShell.test.ts
index 7d080b3078..ef5049b43e 100644
--- a/test/features/UpdatePowerShell.test.ts
+++ b/test/features/UpdatePowerShell.test.ts
@@ -3,8 +3,8 @@
 
 import assert from "assert";
 import { UpdatePowerShell } from "../../src/features/UpdatePowerShell";
+import type { IPowerShellVersionDetails } from "../../src/session";
 import { Settings } from "../../src/settings";
-import { IPowerShellVersionDetails } from "../../src/session";
 import { testLogger } from "../utils";
 
 describe("UpdatePowerShell feature", function () {
@@ -28,10 +28,10 @@ describe("UpdatePowerShell feature", function () {
         it("Won't check if 'promptToUpdatePowerShell' is false", function () {
             settings.promptToUpdatePowerShell = false;
             const version: IPowerShellVersionDetails = {
-                "version": "7.3.0",
-                "edition": "Core",
-                "commit": "7.3.0",
-                "architecture": "X64"
+                version: "7.3.0",
+                edition: "Core",
+                commit: "7.3.0",
+                architecture: "X64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
@@ -40,10 +40,10 @@ describe("UpdatePowerShell feature", function () {
 
         it("Won't check for Windows PowerShell", function () {
             const version: IPowerShellVersionDetails = {
-                "version": "5.1.22621",
-                "edition": "Desktop",
-                "commit": "5.1.22621",
-                "architecture": "X64"
+                version: "5.1.22621",
+                edition: "Desktop",
+                commit: "5.1.22621",
+                architecture: "X64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
@@ -52,10 +52,10 @@ describe("UpdatePowerShell feature", function () {
 
         it("Won't check for a development build of PowerShell", function () {
             const version: IPowerShellVersionDetails = {
-                "version": "7.3.0-preview.3",
-                "edition": "Core",
-                "commit": "7.3.0-preview.3-508-g07175ae0ff8eb7306fe0b0fc7d19bdef4fbf2d67",
-                "architecture": "Arm64"
+                version: "7.3.0-preview.3",
+                edition: "Core",
+                commit: "7.3.0-preview.3-508-g07175ae0ff8eb7306fe0b0fc7d19bdef4fbf2d67",
+                architecture: "Arm64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
@@ -64,10 +64,10 @@ describe("UpdatePowerShell feature", function () {
 
         it("Won't check for a daily build of PowerShell", function () {
             const version: IPowerShellVersionDetails = {
-                "version": "7.3.0-daily20221206.1",
-                "edition": "Core",
-                "commit": "7.3.0-daily20221206.1",
-                "architecture": "Arm64"
+                version: "7.3.0-daily20221206.1",
+                edition: "Core",
+                commit: "7.3.0-daily20221206.1",
+                architecture: "Arm64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
@@ -77,22 +77,22 @@ describe("UpdatePowerShell feature", function () {
         it("Won't check if POWERSHELL_UPDATECHECK is 'Off'", function () {
             process.env.POWERSHELL_UPDATECHECK = "Off";
             const version: IPowerShellVersionDetails = {
-                "version": "7.3.0",
-                "edition": "Core",
-                "commit": "7.3.0",
-                "architecture": "X64"
+                version: "7.3.0",
+                edition: "Core",
+                commit: "7.3.0",
+                architecture: "X64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
             assert(!updater.shouldCheckForUpdate());
         });
 
-        it ("Should otherwise check to update PowerShell", function () {
+        it("Should otherwise check to update PowerShell", function () {
             const version: IPowerShellVersionDetails = {
-                "version": "7.3.0",
-                "edition": "Core",
-                "commit": "7.3.0",
-                "architecture": "X64"
+                version: "7.3.0",
+                edition: "Core",
+                commit: "7.3.0",
+                architecture: "X64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
@@ -101,34 +101,36 @@ describe("UpdatePowerShell feature", function () {
     });
 
     describe("Which version it gets", function () {
-        it("Would update to LTS", async function() {
+        it("Would update to LTS", async function () {
             process.env.POWERSHELL_UPDATECHECK = "LTS";
             const version: IPowerShellVersionDetails = {
-                "version": "7.0.0",
-                "edition": "Core",
-                "commit": "7.0.0",
-                "architecture": "X64"
+                version: "7.2.0",
+                edition: "Core",
+                commit: "7.2.0",
+                architecture: "X64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
-            const tag: string = await updater.maybeGetNewRelease() ?? "";
+            const tag: string = (await updater.maybeGetNewRelease()) ?? "";
             // NOTE: This will need to be updated each time an LTS is released.
             // Also sometimes the prior LTS is more recently updated than the latest LTS.
-            assert(tag.startsWith("v7.4") || tag.startsWith("v7.2"));
+            assert(tag.startsWith("v7.4"));
         });
 
-        it("Would update to stable", async function() {
+        it("Would update to stable", async function () {
             const version: IPowerShellVersionDetails = {
-                "version": "7.3.0",
-                "edition": "Core",
-                "commit": "7.3.0",
-                "architecture": "X64"
+                version: "7.3.0",
+                edition: "Core",
+                commit: "7.3.0",
+                architecture: "X64",
             };
             const updater = new UpdatePowerShell(settings, testLogger, version);
             // @ts-expect-error method is private.
             const tag: string | undefined = await updater.maybeGetNewRelease();
             // NOTE: This will need to be updated each new major stable.
-            assert(tag?.startsWith("v7.4"));
+            // TODO: Upstream bug causes LTS releases to update the stable info.
+            // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+            assert(tag?.startsWith("v7.5") || tag?.startsWith("v7.4"));
         });
     });
 });
diff --git a/test/runTests.ts b/test/runTests.ts
deleted file mode 100644
index 87a27182bd..0000000000
--- a/test/runTests.ts
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (c) Microsoft Corporation.
-// Licensed under the MIT License.
-
-// NOTE: This code is borrowed under permission from:
-// https://github.com/microsoft/vscode-extension-samples/tree/main/helloworld-test-sample/src/test
-
-import * as path from "path";
-import { makeConsoleReporter, downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath, runTests } from "@vscode/test-electron";
-import { existsSync } from "fs";
-import { spawnSync } from "child_process";
-
-/** This is the main test entrypoint that:
- * - Prepares the test environment by downloading a testing instance of vscode and any additional extensions
- * - Starts the test environment with runTestsInner injected into the extensionsTestsPath which will in turn start the Mocha test runner inside the environment.
- *
- * Tools like npm run test and vscode tasks should point to this script to begin the testing process. It is assumed you have built the extension prior to this step, it will error if it does not find the built extension or related test scaffolding.
- * */
-async function main(): Promise<void> {
-    // Verify that the extension is built
-    const compiledExtensionPath = path.resolve(__dirname, "../src/extension.js");
-    if (!existsSync(compiledExtensionPath)) {
-        console.error("ERROR: The extension is not built yet. Please run a build first, using either the 'Run Build Task' in VSCode or ./build.ps1 in PowerShell.");
-        process.exit(1);
-    }
-
-    try {
-        /** The folder containing the Extension Manifest package.json. Passed to `--extensionDevelopmentPath */
-        const extensionDevelopmentPath = path.resolve(__dirname, "../");
-
-        /** The path to the test script that will run inside the vscode instance. Passed to --extensionTestsPath */
-        const extensionTestsPath = path.resolve(__dirname, "./runTestsInner");
-
-        /** The starting workspace/folder to open in vscode. By default this is a testing instance pointed to the Examples folder */
-        const workspacePath = process.env.__TEST_WORKSPACE_PATH ?? "test/TestEnvironment.code-workspace";
-        const workspaceToOpen = path.resolve(extensionDevelopmentPath, workspacePath);
-
-        /** The version to test. By default we test on insiders. */
-        const vsCodeVersion = process.env.__TEST_VSCODE_VERSION ?? "insiders";
-
-        /** Install a temporary vscode. This must be done ahead of RunTests in order to install extensions ahead of time. @see https://github.com/microsoft/vscode-test/blob/addc23e100b744de598220adbbf0761da870eda9/README.md?plain=1#L71-L89 **/
-        const testVSCodePath = await downloadAndUnzipVSCode(vsCodeVersion, undefined, await makeConsoleReporter());
-        InstallExtension(testVSCodePath, "ms-dotnettools.csharp");
-
-        const launchArgs = [
-            workspaceToOpen
-        ];
-
-        /** This is fed to runTestsInner so it knows the extension context to find config files */
-        const extensionTestsEnv: Record<string, string | undefined> = {
-            __TEST_EXTENSION_DEVELOPMENT_PATH: extensionDevelopmentPath
-        };
-
-        // This info is provided by the Mocha test explorer so it can communicate with the mocha running inside the vscode test instance.
-        // Adapted from: https://github.com/hbenl/mocha-explorer-launcher-scripts/blob/bd3ace403e729de1be31f46afddccc477f82a178/vscode-test/index.ts#L33-L37
-        if (process.argv[2]) {
-            const mochaIPCInfo = JSON.parse(process.argv[2]);
-            extensionTestsEnv.MOCHA_WORKER_IPC_ROLE = mochaIPCInfo.role;
-            extensionTestsEnv.MOCHA_WORKER_IPC_HOST = mochaIPCInfo.host;
-            extensionTestsEnv.MOCHA_WORKER_IPC_PORT = String(mochaIPCInfo.port);
-        }
-
-        /** This env var should be passed by launch configurations for debugging the extension tests. If specified, we should wait for it to connect because it means something explicitly asked for debugging **/
-        const debugPort = process.env.__TEST_DEBUG_INSPECT_PORT;
-        console.log("DebugPort", debugPort);
-        if (debugPort !== undefined) {
-            console.log(`__TEST_DEBUG_INSPECT_PORT is set to ${debugPort}`);
-            launchArgs.push(`--inspect-brk-extensions=${debugPort}`);
-        } else {
-            // Make debugger optionally available. Mocha Test adapter will use this when debugging because it provides no indicator when it is debugging vs. just running
-            // FIXME: Because the mocha test explorer often doesn't attach until after the tests start and it provides no indicator of debug vs run, it may be flaky for debug until https://github.com/hbenl/vscode-mocha-test-adapter/pull/240 is merged. To workaround, start debugging sessions using "Test Extensions" launch config. We could use a timeout here but it would slow down everything including normal runs.
-            launchArgs.push("--inspect-extensions=59229");
-        }
-
-        // Download VS Code, unzip it and run the integration test
-        await runTests({
-            extensionDevelopmentPath,
-            extensionTestsPath,
-            launchArgs: launchArgs,
-            // This is necessary because the tests fail if more than once
-            // instance of Code is running.
-            version: vsCodeVersion,
-            extensionTestsEnv: extensionTestsEnv
-        });
-    } catch (err) {
-        console.error(`RunTests failed to run tests: ${err}`);
-        process.exit(1);
-    } finally {
-        // Clean this up because runTests sets it on the current process, not the child one.
-        process.env.__TEST_DEBUG_INSPECT_PORT = undefined;
-    }
-}
-
-/** Installs an extension into an existing vscode instance. Returns the output result */
-function InstallExtension(vscodeExePath: string, extensionIdOrVSIXPath: string): string {
-    // Install the csharp extension which is required for the dotnet debugger testing
-    const [cli, ...args] = resolveCliArgsFromVSCodeExecutablePath(vscodeExePath);
-
-    args.push("--install-extension", extensionIdOrVSIXPath);
-
-    // Install the extension. There is no API for this, we must use the executable. This is the recommended sample in the vscode-test repo.
-    console.log(`Installing extension: ${cli} ${args.join(" ")}`);
-    const installResult = spawnSync(cli, args, {
-        encoding: "utf8",
-        stdio: "inherit"
-    });
-
-    if (installResult.status !== 0) {
-        console.error(`Failed to install extension: ${installResult.stderr}`);
-        console.log("Binary Module Tests will fail if not skipped!");
-    }
-
-    return installResult.stdout;
-}
-
-void main();
diff --git a/test/runTestsInner.ts b/test/runTestsInner.ts
deleted file mode 100644
index ea3d46f0ef..0000000000
--- a/test/runTestsInner.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) Microsoft Corporation.
-// Licensed under the MIT License.
-
-import { globSync } from "glob";
-import path from "path";
-import Mocha from "mocha";
-/** This is the entrypoint into the standalone vscode instance that should be passed to the --extensionsTestPath parameter of the test VSCode instance. */
-export function run(testsRoot: string): Promise<void> {
-    return runTestsInner(testsRoot);
-}
-
-/** Runs inside of the test vscode instance, and should set up and activate the test runner */
-function runTestsInner(testsRoot: string): Promise<void> {
-    // Allow tools like Mocha Test Explorer to inject their own Mocha worker
-    if (process.env.MOCHA_WORKER_PATH) {
-        return require(process.env.MOCHA_WORKER_PATH);
-    }
-
-    console.log(`\n\n=====\nTest Runner START\n${testsRoot}\n=====`);
-
-    /** Passed from RunTests */
-    const rootDir = process.env.__TEST_EXTENSION_DEVELOPMENT_PATH;
-    if (!rootDir) {
-        throw new Error("Missing environment variable __TEST_EXTENSIONDEVELOPMENTPATH, this is probably a bug in runTests.ts");
-    }
-
-    interface MochaOptionsWithFiles extends Mocha.MochaOptions {
-        spec?: string;
-    }
-
-    // eslint-disable-next-line @typescript-eslint/no-var-requires
-    const config: MochaOptionsWithFiles = require(path.resolve(rootDir, ".mocharc.json"));
-    if (config.spec === undefined) {
-        throw new Error("spec must be specified in the config options when running vscode launch tests");
-    }
-
-    const mocha = new Mocha(config);
-
-    // Test if files is empty
-    const files = globSync(config.spec, { cwd: rootDir });
-    if (files.length === 0) {
-        console.log("No tests found for glob pattern: test.ts in directory: " + rootDir);
-        throw new Error("No tests found for glob pattern: test.ts in directory: " + rootDir);
-    }
-
-    // Add files to the test suite
-    for (const file of files) {
-        const testFile = path.resolve(rootDir, file);
-        mocha.addFile(testFile);
-    }
-
-    mocha.reporter("mocha-multi-reporters", {
-        reporterEnabled: "spec, xunit",
-        xunitReporterOptions: {
-            output: path.resolve(rootDir, "test-results.xml"),
-        }
-    });
-
-    return new Promise((resolve) => {
-        mocha.run(failures => {
-            console.log(`Mocha Run Finished with ${failures} failures.`);
-            if (failures > 0) {
-                throw new Error(`${failures} tests failed.`);
-            } else {
-                console.log("\n\n=====\nTest Runner STOP\n=====");
-                resolve();
-                return;
-            }
-        });
-    });
-}
diff --git a/test/utils.ts b/test/utils.ts
index 7d601aadf2..aef25f0e64 100644
--- a/test/utils.ts
+++ b/test/utils.ts
@@ -1,18 +1,17 @@
 // Copyright (c) Microsoft Corporation.
 // Licensed under the MIT License.
 
+import { execSync } from "child_process";
 import * as path from "path";
 import * as vscode from "vscode";
-import { ILogger } from "../src/logging";
-import { IPowerShellExtensionClient } from "../src/features/ExternalApi";
-import { execSync } from "child_process";
+import type { IPowerShellExtensionClient } from "../src/features/ExternalApi";
+import type { ILogger } from "../src/logging";
+import { sleep } from "../src/utils";
 
 // This lets us test the rest of our path assumptions against the baseline of
 // this test file existing at `<root>/test/utils.js`.
-export const rootPath = path.resolve(__dirname, "../");
-// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-var-requires
-const packageJSON: any = require(path.resolve(rootPath, "package.json"));
-export const extensionId = `${packageJSON.publisher}.${packageJSON.name}`;
+import { name, publisher } from "../package.json";
+export const extensionId = `${publisher}.${name}`;
 
 export class TestLogger implements ILogger {
     logDirectoryPath: vscode.Uri = vscode.Uri.file("");
@@ -22,30 +21,43 @@ export class TestLogger implements ILogger {
     write(_message: string, ..._additionalMessages: string[]): void {
         return;
     }
-    writeAndShowInformation(_message: string, ..._additionalMessages: string[]): Promise<void> {
+    writeAndShowInformation(
+        _message: string,
+        ..._additionalMessages: string[]
+    ): Promise<void> {
         return Promise.resolve();
     }
-    writeDiagnostic(_message: string, ..._additionalMessages: string[]): void {
+    writeTrace(_message: string, ..._additionalMessages: string[]): void {
         return;
     }
-    writeVerbose(_message: string, ..._additionalMessages: string[]): void {
+    writeDebug(_message: string, ..._additionalMessages: string[]): void {
         return;
     }
     writeWarning(_message: string, ..._additionalMessages: string[]): void {
         return;
     }
-    writeAndShowWarning(_message: string, ..._additionalMessages: string[]): Promise<void> {
+    writeAndShowWarning(
+        _message: string,
+        ..._additionalMessages: string[]
+    ): Promise<void> {
         return Promise.resolve();
     }
     writeError(_message: string, ..._additionalMessages: string[]): void {
         return;
     }
-    writeAndShowError(_message: string, ..._additionalMessages: string[]): Promise<void> {
+    writeAndShowError(
+        _message: string,
+        ..._additionalMessages: string[]
+    ): Promise<void> {
         return Promise.resolve();
     }
     writeAndShowErrorWithActions(
         _message: string,
-        _actions: { prompt: string; action: (() => Promise<void>) | undefined }[]): Promise<void> {
+        _actions: {
+            prompt: string;
+            action: (() => Promise<void>) | undefined;
+        }[],
+    ): Promise<void> {
         return Promise.resolve();
     }
 }
@@ -53,9 +65,19 @@ export class TestLogger implements ILogger {
 export const testLogger = new TestLogger();
 
 export async function ensureExtensionIsActivated(): Promise<IPowerShellExtensionClient> {
-    const extension = vscode.extensions.getExtension(extensionId);
-    if (!extension!.isActive) { await extension!.activate(); }
-    return extension!.exports as IPowerShellExtensionClient;
+    let extension = vscode.extensions.getExtension(extensionId);
+    while (!extension) {
+        // Wait for VS Code to be ready
+        testLogger.writeDebug(`Extension ${extensionId} not yet found...`);
+        await sleep(200);
+        extension = vscode.extensions.getExtension(extensionId);
+        // Wait for VS Code to be ready
+        await sleep(200);
+    }
+    if (!extension.isActive) {
+        await extension.activate();
+    }
+    return extension.exports as IPowerShellExtensionClient;
 }
 
 export async function ensureEditorServicesIsConnected(): Promise<IPowerShellExtensionClient> {
@@ -68,20 +90,24 @@ export async function ensureEditorServicesIsConnected(): Promise<IPowerShellExte
 
 /**
  * This is a workaround for sinon not being able to stub interfaces. Interfaces are a TypeScript-only concept so this effectively allows us to stub interfaces by not providing the entire implementation but only what matters for the test. "What matters" is not type checked so you must be careful to stub everything you need, otherwise you should provide a default implementation instead if you do not know.
-*/
+ */
 export function stubInterface<T>(object?: Partial<T>): T {
-    return object ? object as T : {} as T;
+    return object ? (object as T) : ({} as T);
 }
 
 /** Builds the sample binary module code. We need to do this because the source maps have absolute paths so they are not portable between machines, and while we could do deterministic with source maps, that's way more complicated and everywhere we build has dotnet already anyways */
 export function BuildBinaryModuleMock(): void {
-    const projectPath = path.resolve(`${__dirname}/../test/mocks/BinaryModule/BinaryModule.csproj`);
+    const projectPath = path.resolve(
+        `${__dirname}/../test/mocks/BinaryModule/BinaryModule.csproj`,
+    );
     try {
         execSync(`dotnet publish ${projectPath}`, {
-            encoding: "utf8"
+            encoding: "utf8",
         });
     } catch (err) {
-        throw new Error(`Failed to build the binary module mock. Please ensure that you have the .NET Core SDK installed: ${err}`);
+        throw new Error(
+            `Failed to build the binary module mock. Please ensure that you have the .NET Core SDK installed: ${err}`,
+        );
     }
 }
 
@@ -89,8 +115,11 @@ export function BuildBinaryModuleMock(): void {
  * @param event The event to wait for
  * @param filter An optional filter to apply to the event TResult. The filter will continue to monitor the event firings until the filter returns true.
  * @returns A promise that resolves when the specified event is fired with the TResult subject of the event. If a filter is specified, the promise will not resolve until the filter returns true.
-*/
-export function WaitEvent<TResult>(event: vscode.Event<TResult>, filter?: (event: TResult) => boolean | undefined): Promise<TResult> {
+ */
+export function WaitEvent<TResult>(
+    event: vscode.Event<TResult>,
+    filter?: (event: TResult) => boolean | undefined,
+): Promise<TResult> {
     return new Promise<TResult>((resolve) => {
         const listener = event((result: TResult) => {
             if (!filter || filter(result)) {
diff --git a/themes/theme-psise/theme.json b/themes/theme-psise/theme.json
index 44474a7289..fcf52d0067 100644
--- a/themes/theme-psise/theme.json
+++ b/themes/theme-psise/theme.json
@@ -1,211 +1,189 @@
 {
-    "name": "PowerShell ISE",
-    "semanticHighlighting": true,
-    "tokenColors": [{
-            "settings": {
-                "background": "#FFFFFF",
-                "foreground": "#000000"
-            }
-        },
-        {
-            "name": "Comments",
-            "scope": [
-                "comment",
-                "punctuation.definition.comment"
-            ],
-            "settings": {
-                "fontStyle": "italic",
-                "foreground": "#006400"
-            }
-        },
-        {
-            "name": "Comments: Preprocessor",
-            "scope": "comment.block.preprocessor",
-            "settings": {
-                "fontStyle": "",
-                "foreground": "#006400"
-            }
-        },
-        {
-            "name": "Comments: Documentation",
-            "scope": [
-                "comment.documentation",
-                "comment.block.documentation"
-            ],
-            "settings": {
-                "foreground": "#006400"
-            }
-        },
-        {
-            "name": "Invalid - Deprecated",
-            "scope": "invalid.deprecated",
-            "settings": {
-                "background": "#96000014"
-            }
-        },
-        {
-            "name": "Invalid - Illegal",
-            "scope": "invalid.illegal",
-            "settings": {
-                "background": "#96000014",
-                "foreground": "#660000"
-            }
-        },
-        {
-            "name": "Operators",
-            "scope": "keyword.operator",
-            "settings": {
-                "foreground": "#A9A9A9"
-            }
-        },
-        {
-            "name": "Keywords",
-            "scope": [
-                "keyword",
-                "storage"
-            ],
-            "settings": {
-                "foreground": "#00008B"
-            }
-        },
-        {
-            "name": "Types",
-            "scope": [
-                "storage.type",
-                "support.type"
-            ],
-            "settings": {
-                "foreground": "#00008B"
-            }
-        },
-        {
-            "name": "Language Constants",
-            "scope": [
-                "constant.language",
-                "support.constant",
-                "variable.language"
-            ],
-            "settings": {
-                "foreground": "#008080"
-            }
-        },
-        {
-            "name": "Keys and Properties",
-            "scope": [
-                "property",
-                "variable.other.property",
-                "variable.other.property.powershell"
-            ],
-            "settings": {
-                "foreground": "#2d2e45"
-            }
-        },
-        {
-            "name": "Variables",
-            "scope": [
-                "variable",
-                "support.variable",
-                "punctuation.definition.variable.powershell",
-                "variable.other.readwrite.powershell"
-            ],
-            "settings": {
-                "foreground": "#FF4500"
-            }
-        },
-        {
-            "name": "Functions",
-            "scope": [
-                "entity.name.function",
-                "support.function"
-            ],
-            "settings": {
-                "foreground": "#0000FF"
-            }
-        },
-        {
-            "name": "Classes",
-            "scope": [
-                "entity.name.type",
-                "entity.other.inherited-class",
-                "support.class"
-            ],
-            "settings": {
-                "foreground": "#7A3E9D"
-            }
-        },
-        {
-            "name": "Exceptions",
-            "scope": "entity.name.exception",
-            "settings": {
-                "foreground": "#660000"
-            }
-        },
-        {
-            "name": "Sections",
-            "scope": "entity.name.section",
-            "settings": {}
-        },
-        {
-            "name": "Numbers, Characters",
-            "scope": [
-                "constant.numeric",
-                "constant.character",
-                "constant"
-            ],
-            "settings": {
-                "foreground": "#800080"
-            }
-        },
-        {
-            "name": "Strings",
-            "scope": "string",
-            "settings": {
-                "foreground": "#8B0000"
-            }
-        },
-        {
-            "name": "Strings: Escape Sequences",
-            "scope": "constant.character.escape",
-            "settings": {
-                "foreground": "#8B0000"
-            }
-        },
-        {
-            "name": "Strings: Regular Expressions",
-            "scope": "string.regexp",
-            "settings": {
-                "foreground": "#8B0000"
-            }
-        },
-        {
-            "name": "Strings: Symbols",
-            "scope": "constant.other.symbol",
-            "settings": {
-                "foreground": "#8B0000"
-            }
-        },
-        {
-            "name": "Punctuation",
-            "scope": "punctuation",
-            "settings": {
-                "foreground": "#000000"
-            }
-        }
-    ],
-    "colors": {
-        "activityBar.background": "#E1ECF9",
-        "activityBar.foreground": "#A9A9A9",
-        "activityBarBadge.background": "#A9A9A9",
-        "editor.lineHighlightBackground": "#add8e6",
-        "editor.selectionBackground": "#94c6f7",
-        "settings.checkboxBorder": "#A9A9A9",
-        "settings.dropdownBorder": "#A9A9A9",
-        "settings.numberInputBorder": "#A9A9A9",
-        "settings.textInputBorder": "#A9A9A9",
-        "statusBar.background": "#999999",
-        "statusBar.debuggingBackground": "#FF4500",
-        "statusBar.noFolderBackground": "#999999",
-        "terminal.background": "#012456",
-        "terminal.foreground": "#F5F5F5"
+  "name": "PowerShell ISE",
+  "semanticHighlighting": true,
+  "tokenColors": [
+    {
+      "settings": {
+        "background": "#FFFFFF",
+        "foreground": "#000000"
+      }
+    },
+    {
+      "name": "Comments",
+      "scope": ["comment", "punctuation.definition.comment"],
+      "settings": {
+        "fontStyle": "italic",
+        "foreground": "#006400"
+      }
+    },
+    {
+      "name": "Comments: Preprocessor",
+      "scope": "comment.block.preprocessor",
+      "settings": {
+        "fontStyle": "",
+        "foreground": "#006400"
+      }
+    },
+    {
+      "name": "Comments: Documentation",
+      "scope": ["comment.documentation", "comment.block.documentation"],
+      "settings": {
+        "foreground": "#006400"
+      }
+    },
+    {
+      "name": "Invalid - Deprecated",
+      "scope": "invalid.deprecated",
+      "settings": {
+        "background": "#96000014"
+      }
+    },
+    {
+      "name": "Invalid - Illegal",
+      "scope": "invalid.illegal",
+      "settings": {
+        "background": "#96000014",
+        "foreground": "#660000"
+      }
+    },
+    {
+      "name": "Operators",
+      "scope": "keyword.operator",
+      "settings": {
+        "foreground": "#A9A9A9"
+      }
+    },
+    {
+      "name": "Keywords",
+      "scope": ["keyword", "storage"],
+      "settings": {
+        "foreground": "#00008B"
+      }
+    },
+    {
+      "name": "Types",
+      "scope": ["storage.type", "support.type"],
+      "settings": {
+        "foreground": "#00008B"
+      }
+    },
+    {
+      "name": "Language Constants",
+      "scope": ["constant.language", "support.constant", "variable.language"],
+      "settings": {
+        "foreground": "#008080"
+      }
+    },
+    {
+      "name": "Keys and Properties",
+      "scope": [
+        "property",
+        "variable.other.property",
+        "variable.other.property.powershell"
+      ],
+      "settings": {
+        "foreground": "#2d2e45"
+      }
+    },
+    {
+      "name": "Variables",
+      "scope": [
+        "variable",
+        "support.variable",
+        "punctuation.definition.variable.powershell",
+        "variable.other.readwrite.powershell"
+      ],
+      "settings": {
+        "foreground": "#FF4500"
+      }
+    },
+    {
+      "name": "Functions",
+      "scope": ["entity.name.function", "support.function"],
+      "settings": {
+        "foreground": "#0000FF"
+      }
+    },
+    {
+      "name": "Classes",
+      "scope": [
+        "entity.name.type",
+        "entity.other.inherited-class",
+        "support.class"
+      ],
+      "settings": {
+        "foreground": "#7A3E9D"
+      }
+    },
+    {
+      "name": "Exceptions",
+      "scope": "entity.name.exception",
+      "settings": {
+        "foreground": "#660000"
+      }
+    },
+    {
+      "name": "Sections",
+      "scope": "entity.name.section",
+      "settings": {}
+    },
+    {
+      "name": "Numbers, Characters",
+      "scope": ["constant.numeric", "constant.character", "constant"],
+      "settings": {
+        "foreground": "#800080"
+      }
+    },
+    {
+      "name": "Strings",
+      "scope": "string",
+      "settings": {
+        "foreground": "#8B0000"
+      }
+    },
+    {
+      "name": "Strings: Escape Sequences",
+      "scope": "constant.character.escape",
+      "settings": {
+        "foreground": "#8B0000"
+      }
+    },
+    {
+      "name": "Strings: Regular Expressions",
+      "scope": "string.regexp",
+      "settings": {
+        "foreground": "#8B0000"
+      }
+    },
+    {
+      "name": "Strings: Symbols",
+      "scope": "constant.other.symbol",
+      "settings": {
+        "foreground": "#8B0000"
+      }
+    },
+    {
+      "name": "Punctuation",
+      "scope": "punctuation",
+      "settings": {
+        "foreground": "#000000"
+      }
     }
-}
\ No newline at end of file
+  ],
+  "colors": {
+    "activityBar.background": "#E1ECF9",
+    "activityBar.foreground": "#A9A9A9",
+    "activityBarBadge.background": "#A9A9A9",
+    "editor.lineHighlightBackground": "#add8e6",
+    "editor.selectionBackground": "#94c6f7",
+    "settings.checkboxBorder": "#A9A9A9",
+    "settings.dropdownBorder": "#A9A9A9",
+    "settings.numberInputBorder": "#A9A9A9",
+    "settings.textInputBorder": "#A9A9A9",
+    "statusBar.background": "#999999",
+    "statusBar.debuggingBackground": "#FF4500",
+    "statusBar.noFolderBackground": "#999999",
+    "terminal.background": "#012456",
+    "terminal.foreground": "#F5F5F5"
+  }
+}
diff --git a/tools/installPSResources.ps1 b/tools/installPSResources.ps1
index e98910d70a..3bb642aced 100644
--- a/tools/installPSResources.ps1
+++ b/tools/installPSResources.ps1
@@ -6,8 +6,19 @@ param(
 )
 
 if ($PSRepository -eq "CFS" -and -not (Get-PSResourceRepository -Name CFS -ErrorAction SilentlyContinue)) {
-    Register-PSResourceRepository -Name CFS -Uri "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v3/index.json"
+    Register-PSResourceRepository -Name CFS -Uri "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/PowerShellGalleryMirror/nuget/v3/index.json"
 }
 
-Install-PSResource -Repository $PSRepository -TrustRepository -Name InvokeBuild
-Install-PSResource -Repository $PSRepository -TrustRepository -Name platyPS
+# NOTE: Due to a bug in Install-PSResource with upstream feeds, we have to
+# request an exact version. Otherwise, if a newer version is available in the
+# upstream feed, it will fail to install any version at all.
+Install-PSResource -Verbose -TrustRepository -RequiredResource  @{
+    InvokeBuild = @{
+        version = "5.12.1"
+        repository = $PSRepository
+      }
+    platyPS = @{
+        version = "0.14.2"
+        repository = $PSRepository
+    }
+}
diff --git a/tsconfig.json b/tsconfig.json
index 3d2b64d81a..33ba7e18aa 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,25 +1,17 @@
 {
   "compilerOptions": {
-    // NOTE: The TypeScript compiler is only used for building the tests (and
-    // the sources which the tests need). The extension is built with `esbuild`.
-    "module": "commonjs",
-    "target": "ES2022",
-    "lib": [
-      "ES2022",
-      "DOM"
-    ],
-    "sourceMap": true,
-    "rootDir": ".",
-    "strict": true,
-    "noFallthroughCasesInSwitch": true,
-    "noImplicitOverride": true,
-    "noImplicitReturns": true,
-    "noUnusedLocals": true,
-    "noUnusedParameters": true,
+    "target": "ESNext",
     "esModuleInterop": true,
-    "allowSyntheticDefaultImports": true,
-    "useUnknownInCatchVariables": true
+    "skipLibCheck": true,
+    "allowJs": true,
+    "checkJs": true,
+    "resolveJsonModule": true,
+    "moduleDetection": "force",
+    "verbatimModuleSyntax": true,
+    "strict": true,
+    "noEmit": true,
+    "module": "Preserve"
   },
-  "include": [ "src", "test" ],
-  "exclude": [ "node_modules/@ungap/structured-clone" ]
+  "include": ["**/*.ts", "eslint.config.mjs", ".vscode-test.mjs"],
+  "exclude": ["node_modules"]
 }
diff --git a/vscode-powershell.build.ps1 b/vscode-powershell.build.ps1
index 8f297ba4fe..4bcc737e33 100644
--- a/vscode-powershell.build.ps1
+++ b/vscode-powershell.build.ps1
@@ -86,6 +86,8 @@ task CleanEditorServices -If (Get-EditorServicesPath) {
 task Lint RestoreNodeOptional, {
     Write-Build DarkMagenta "Linting TypeScript"
     Invoke-BuildExec { & npm run lint }
+    Write-Build DarkMagenta "Checking formatting of TypeScript, JSON, etc."
+    Invoke-BuildExec { & npm run format }
 }
 
 task Build RestoreEditorServices, RestoreNode, {
@@ -111,7 +113,7 @@ task Test Lint, Build, {
     Write-Build DarkMagenta "Running extension tests"
     Invoke-BuildExec { & npm run test }
     # Reset the state of files modified by tests
-    Invoke-BuildExec { git checkout package.json test/TestEnvironment.code-workspace }
+    Invoke-BuildExec { git checkout test/TestEnvironment.code-workspace }
 }
 
 task TestEditorServices -If (Get-EditorServicesPath) {
