diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 42e1f84bb98..4f56e1391ab 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,12 +1,9 @@
-# To get started with Dependabot version updates, you'll need to specify which
-# package ecosystems to update and where the package manifests are located.
-# Please see the documentation for all configuration options:
-# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
-
version: 2
updates:
- - package-ecosystem: "github-actions"
- directory: "/"
+ - package-ecosystem: github-actions
+ directory: /
target-branch: insider
schedule:
- interval: "weekly"
+ interval: weekly
+ cooldown:
+ default-days: 7
diff --git a/.github/repo-starter-kit.yml b/.github/repo-starter-kit.yml
new file mode 100644
index 00000000000..187279397cf
--- /dev/null
+++ b/.github/repo-starter-kit.yml
@@ -0,0 +1,5 @@
+package: "@daiyam/default"
+repository: https://github.com/VSCodium/vscodium
+resources:
+ - label
+keep: true
diff --git a/.github/workflows/ci-build-linux.yml b/.github/workflows/ci-build-linux.yml
new file mode 100644
index 00000000000..5d3d7b4b4c5
--- /dev/null
+++ b/.github/workflows/ci-build-linux.yml
@@ -0,0 +1,364 @@
+name: CI - Build - Linux
+
+on:
+ workflow_dispatch:
+ inputs:
+ generate_assets:
+ type: boolean
+ description: Generate assets
+ checkout_pr:
+ type: string
+ description: Checkout PR
+ push:
+ branches:
+ - master
+ - insider
+ paths-ignore:
+ - "**/*.md"
+ pull_request:
+ branches:
+ - "**"
+ paths-ignore:
+ - "**/*.md"
+
+env:
+ ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
+ APP_NAME: VSCodium
+ BINARY_NAME: ${{ (github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'codium-insiders' || 'codium' }}
+ DISABLE_UPDATE: yes
+ GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.event.head }}
+ ORG_NAME: ${{ github.repository_owner }}
+ OS_NAME: linux
+ VSCODE_QUALITY: ${{ (github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'insider' || 'stable' }}
+
+permissions: {}
+
+jobs:
+ compile:
+ runs-on: ubuntu-22.04
+ env:
+ VSCODE_ARCH: x64
+ outputs:
+ BUILD_SOURCEVERSION: ${{ env.BUILD_SOURCEVERSION }}
+ MS_COMMIT: ${{ env.MS_COMMIT }}
+ MS_TAG: ${{ env.MS_TAG }}
+ RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
+
+ - name: Switch to relevant branch
+ env:
+ PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
+ run: ./get_pr.sh
+
+ - name: Setup GCC
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
+ with:
+ version: 10
+ platform: x64
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: .nvmrc
+
+ - name: Setup Python 3
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
+ with:
+ python-version: "3.11"
+
+ - name: Install libkrb5-dev
+ run: sudo apt-get update -y && sudo apt-get install -y libkrb5-dev
+
+ - name: Clone VSCode repo
+ run: ./get_repo.sh
+
+ - name: Build
+ env:
+ SHOULD_BUILD: yes
+ SHOULD_BUILD_REH: no
+ SHOULD_BUILD_REH_WEB: no
+ run: ./build.sh
+
+ - name: Compress vscode artifact
+ run: |
+ find vscode -type f -not -path "*/node_modules/*" -not -path "vscode/.build/node/*" -not -path "vscode/.git/*" > vscode.txt
+ echo "vscode/.build/extensions/node_modules" >> vscode.txt
+ echo "vscode/.git" >> vscode.txt
+ tar -czf vscode.tar.gz -T vscode.txt
+
+ - name: Upload vscode artifact
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: vscode
+ path: ./vscode.tar.gz
+ retention-days: 1
+
+ build:
+ needs:
+ - compile
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - slug: X64
+ vscode_arch: x64
+ npm_arch: x64
+ image: vscodium/vscodium-linux-build-agent:focal-x64
+ - slug: ARM64
+ vscode_arch: arm64
+ npm_arch: arm64
+ image: vscodium/vscodium-linux-build-agent:focal-arm64
+ - slug: RISCV64
+ vscode_arch: riscv64
+ npm_arch: riscv64
+ image: vscodium/vscodium-linux-build-agent:focal-riscv64
+ - slug: LOONG64
+ vscode_arch: loong64
+ npm_arch: loong64
+ image: vscodium/vscodium-linux-build-agent:crimson-loong64
+ - slug: PPC64
+ vscode_arch: ppc64le
+ npm_arch: ppc64
+ image: vscodium/vscodium-linux-build-agent:focal-ppc64le
+ container:
+ image: ${{ matrix.image }}
+ env:
+ BUILD_SOURCEVERSION: ${{ needs.compile.outputs.BUILD_SOURCEVERSION }}
+ DISABLED: ${{ vars[format('DISABLE_{0}_LINUX_APP_{1}', ((github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'INSIDER' || 'STABLE'), matrix.slug)] }}
+ MS_COMMIT: ${{ needs.compile.outputs.MS_COMMIT }}
+ MS_TAG: ${{ needs.compile.outputs.MS_TAG }}
+ RELEASE_VERSION: ${{ needs.compile.outputs.RELEASE_VERSION }}
+ VSCODE_ARCH: ${{ matrix.vscode_arch }}
+ outputs:
+ RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
+ if: env.DISABLED != 'yes'
+
+ - name: Switch to relevant branch
+ env:
+ PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
+ run: ./get_pr.sh
+ if: env.DISABLED != 'yes'
+
+ - name: Install GH
+ run: ./build/linux/install_gh.sh
+ if: env.DISABLED != 'yes'
+
+ - name: Install dependencies
+ run: ./build/linux/deps.sh
+ if: env.DISABLED != 'yes'
+
+ - uses: actions-rust-lang/setup-rust-toolchain@46268bd060767258de96ed93c1251119784f2ab6 # v1.16.1
+ if: env.DISABLED != 'yes'
+
+ - name: Download vscode artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: vscode
+ if: env.DISABLED != 'yes'
+
+ - name: Build
+ id: build
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ npm_config_arch: ${{ matrix.npm_arch }}
+ run: ./build/linux/package_bin.sh
+ if: env.DISABLED != 'yes'
+
+ - name: Prepare assets
+ env:
+ SHOULD_BUILD_APPIMAGE: ${{ vars[format('DISABLE_{0}_APPIMAGE', ((github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'INSIDER' || 'STABLE'))] == 'yes' && 'no' || 'yes' }}
+ SHOULD_BUILD_REH: 'no'
+ SHOULD_BUILD_REH_WEB: 'no'
+ VSCODE_SYSROOT_REPOSITORY: ${{ steps.build.outputs.VSCODE_SYSROOT_REPOSITORY }}
+ VSCODE_SYSROOT_VERSION: ${{ steps.build.outputs.VSCODE_SYSROOT_VERSION }}
+ VSCODE_SYSROOT_PREFIX: ${{ steps.build.outputs.VSCODE_SYSROOT_PREFIX }}
+ run: ./prepare_assets.sh
+ if: env.DISABLED != 'yes' && github.event.inputs.generate_assets == 'true'
+
+ - name: Upload assets
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: bin-${{ matrix.vscode_arch }}
+ path: assets/
+ retention-days: 3
+ if: env.DISABLED != 'yes' && github.event.inputs.generate_assets == 'true'
+
+ reh_linux:
+ needs:
+ - compile
+ runs-on: ubuntu-22.04
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - slug: X64
+ vscode_arch: x64
+ npm_arch: x64
+ - slug: ARM64
+ vscode_arch: arm64
+ npm_arch: arm64
+ - slug: PPC64
+ vscode_arch: ppc64le
+ npm_arch: ppc64
+ - slug: RISCV64
+ vscode_arch: riscv64
+ npm_arch: riscv64
+ - slug: LOONG64
+ vscode_arch: loong64
+ npm_arch: loong64
+ - slug: S390X
+ vscode_arch: s390x
+ npm_arch: s390x
+ env:
+ BUILD_SOURCEVERSION: ${{ needs.compile.outputs.BUILD_SOURCEVERSION }}
+ DISABLED: ${{ vars[format('DISABLE_{0}_LINUX_REH_{1}', ((github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'INSIDER' || 'STABLE'), matrix.slug)] }}
+ MS_COMMIT: ${{ needs.compile.outputs.MS_COMMIT }}
+ MS_TAG: ${{ needs.compile.outputs.MS_TAG }}
+ RELEASE_VERSION: ${{ needs.compile.outputs.RELEASE_VERSION }}
+ VSCODE_ARCH: ${{ matrix.vscode_arch }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
+ if: env.DISABLED != 'yes'
+
+ - name: Switch to relevant branch
+ env:
+ PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
+ run: ./get_pr.sh
+ if: env.DISABLED != 'yes'
+
+ - name: Setup GCC
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
+ with:
+ version: 10
+ platform: x64
+ if: env.DISABLED != 'yes'
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: '.nvmrc'
+ if: env.DISABLED != 'yes'
+
+ - name: Setup Python 3
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
+ with:
+ python-version: '3.11'
+ if: env.DISABLED != 'yes'
+
+ - name: Install libkrb5-dev
+ run: sudo apt-get update -y && sudo apt-get install -y libkrb5-dev
+ if: env.DISABLED != 'yes'
+
+ - name: Install GH
+ run: ./build/linux/install_gh.sh
+ if: env.DISABLED != 'yes'
+
+ - name: Download vscode artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: vscode
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+
+ - name: Build
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ npm_config_arch: ${{ matrix.npm_arch }}
+ run: ./build/linux/package_reh.sh
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+
+ - name: Upload assets
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: reh-linux-${{ matrix.vscode_arch }}
+ path: assets/
+ retention-days: 3
+ if: env.DISABLED != 'yes' && github.event.inputs.generate_assets == 'true'
+
+ reh_alpine:
+ needs:
+ - compile
+ runs-on: ubuntu-22.04
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - slug: X64
+ vscode_arch: x64
+ npm_arch: x64
+ - slug: ARM64
+ vscode_arch: arm64
+ npm_arch: arm64
+ env:
+ BUILD_SOURCEVERSION: ${{ needs.compile.outputs.BUILD_SOURCEVERSION }}
+ DISABLED: ${{ vars[format('DISABLE_{0}_ALPINE_REH_{1}', ((github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'INSIDER' || 'STABLE'), matrix.slug)] }}
+ MS_COMMIT: ${{ needs.compile.outputs.MS_COMMIT }}
+ MS_TAG: ${{ needs.compile.outputs.MS_TAG }}
+ OS_NAME: alpine
+ RELEASE_VERSION: ${{ needs.compile.outputs.RELEASE_VERSION }}
+ VSCODE_ARCH: ${{ matrix.vscode_arch }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
+
+ - name: Switch to relevant branch
+ env:
+ PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
+ run: ./get_pr.sh
+
+ - name: Setup GCC
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
+ with:
+ version: 10
+ platform: x64
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: '.nvmrc'
+
+ - name: Install GH
+ run: ./build/linux/install_gh.sh
+
+ - name: Install libkrb5-dev
+ run: sudo apt-get update -y && sudo apt-get install -y libkrb5-dev
+
+ - name: Download vscode artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: vscode
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+
+ - name: Build
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ npm_config_arch: ${{ matrix.npm_arch }}
+ run: ./build/alpine/package_reh.sh
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+
+ - name: Upload assets
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: reh-alpine-${{ matrix.vscode_arch }}
+ path: assets/
+ retention-days: 3
+ if: env.DISABLED != 'yes' && github.event.inputs.generate_assets == 'true'
diff --git a/.github/workflows/ci-build-macos.yml b/.github/workflows/ci-build-macos.yml
new file mode 100644
index 00000000000..0290a57757d
--- /dev/null
+++ b/.github/workflows/ci-build-macos.yml
@@ -0,0 +1,90 @@
+name: CI - Build - macOS
+
+on:
+ workflow_dispatch:
+ inputs:
+ generate_assets:
+ type: boolean
+ description: Generate assets
+ checkout_pr:
+ type: string
+ description: Checkout PR
+ push:
+ branches:
+ - master
+ - insider
+ paths-ignore:
+ - "**/*.md"
+ pull_request:
+ branches:
+ - "**"
+ paths-ignore:
+ - "**/*.md"
+
+env:
+ APP_NAME: VSCodium
+ BINARY_NAME: ${{ (github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'codium-insiders' || 'codium' }}
+ GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.event.head }}
+ ORG_NAME: ${{ github.repository_owner }}
+ OS_NAME: osx
+ VSCODE_QUALITY: ${{ (github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'insider' || 'stable' }}
+
+permissions: {}
+
+jobs:
+ build:
+ runs-on: ${{ matrix.runner }}
+ env:
+ VSCODE_ARCH: ${{ matrix.vscode_arch }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - runner: macos-15-intel
+ vscode_arch: x64
+ - runner: macos-14
+ vscode_arch: arm64
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
+
+ - name: Switch to relevant branch
+ env:
+ PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
+ run: . get_pr.sh
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: '.nvmrc'
+
+ - name: Setup Python 3
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
+ with:
+ python-version: '3.11'
+ if: env.VSCODE_ARCH == 'x64'
+
+ - name: Clone VSCode repo
+ run: . get_repo.sh
+
+ - name: Build
+ env:
+ SHOULD_BUILD: yes
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: ./build.sh
+
+ - name: Prepare assets
+ run: ./prepare_assets.sh
+ if: env.SHOULD_BUILD == 'yes' && github.event.inputs.generate_assets == 'true'
+
+ - name: Upload assets
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: bin-${{ matrix.vscode_arch }}
+ path: assets/
+ retention-days: 3
+ if: env.SHOULD_BUILD == 'yes' && github.event.inputs.generate_assets == 'true'
diff --git a/.github/workflows/ci-build-windows.yml b/.github/workflows/ci-build-windows.yml
new file mode 100644
index 00000000000..24b63e80346
--- /dev/null
+++ b/.github/workflows/ci-build-windows.yml
@@ -0,0 +1,166 @@
+name: CI - Build - Windows
+
+on:
+ workflow_dispatch:
+ inputs:
+ generate_assets:
+ type: boolean
+ description: Generate assets
+ checkout_pr:
+ type: string
+ description: Checkout PR
+ push:
+ branches:
+ - master
+ - insider
+ paths-ignore:
+ - "**/*.md"
+ pull_request:
+ branches:
+ - "**"
+ paths-ignore:
+ - "**/*.md"
+
+env:
+ APP_NAME: VSCodium
+ BINARY_NAME: ${{ (github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'codium-insiders' || 'codium' }}
+ GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.event.head }}
+ ORG_NAME: ${{ github.repository_owner }}
+ OS_NAME: windows
+ VSCODE_QUALITY: ${{ (github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'insider' || 'stable' }}
+
+permissions: {}
+
+jobs:
+ compile:
+ runs-on: windows-2022
+ defaults:
+ run:
+ shell: bash
+ env:
+ VSCODE_ARCH: 'x64'
+ outputs:
+ BUILD_SOURCEVERSION: ${{ env.BUILD_SOURCEVERSION }}
+ MS_COMMIT: ${{ env.MS_COMMIT }}
+ MS_TAG: ${{ env.MS_TAG }}
+ RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
+
+ - name: Switch to relevant branch
+ env:
+ PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
+ run: ./get_pr.sh
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: '.nvmrc'
+
+ - name: Setup Python 3
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
+ with:
+ python-version: '3.11'
+
+ - name: Clone VSCode repo
+ run: ./get_repo.sh
+
+ - name: Build
+ env:
+ SHOULD_BUILD: yes
+ SHOULD_BUILD_REH: no
+ SHOULD_BUILD_REH_WEB: no
+ run: ./build.sh
+
+ - name: Compress vscode artifact
+ run: |
+ find vscode -type f -not -path "*/node_modules/*" -not -path "vscode/.build/node/*" -not -path "vscode/.git/*" > vscode.txt
+ echo "vscode/.build/extensions/node_modules" >> vscode.txt
+ echo "vscode/.git" >> vscode.txt
+ tar -czf vscode.tar.gz -T vscode.txt
+
+ - name: Upload vscode artifact
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: vscode
+ path: ./vscode.tar.gz
+ retention-days: 1
+
+ build:
+ needs:
+ - compile
+ runs-on: windows-2022
+ strategy:
+ fail-fast: false
+ matrix:
+ vscode_arch:
+ - x64
+ - arm64
+ defaults:
+ run:
+ shell: bash
+ env:
+ BUILD_SOURCEVERSION: ${{ needs.compile.outputs.BUILD_SOURCEVERSION }}
+ MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
+ MS_TAG: ${{ needs.check.outputs.MS_TAG }}
+ RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
+ SHOULD_BUILD_REH: no
+ SHOULD_BUILD_REH_WEB: no
+ VSCODE_ARCH: ${{ matrix.vscode_arch }}
+ outputs:
+ RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
+
+ - name: Switch to relevant branch
+ env:
+ PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
+ run: ./get_pr.sh
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: '.nvmrc'
+
+ - name: Setup Python 3
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
+ with:
+ python-version: '3.11'
+
+ - name: Download vscode artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: vscode
+
+ - name: Build
+ env:
+ DISABLE_MSI: ${{ vars[format('DISABLE_{0}_MSI', ((github.ref == 'refs/heads/insider' || (github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'insider')) && 'INSIDER' || 'STABLE'))] }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ npm_config_arch: ${{ matrix.vscode_arch }}
+ npm_config_target_arch: ${{ matrix.vscode_arch }}
+ run: ./build/windows/package.sh
+
+ - name: Prepare assets
+ run: ./prepare_assets.sh
+ if: github.event.inputs.generate_assets == 'true'
+
+ - name: Prepare checksums
+ run: ./prepare_checksums.sh
+ if: github.event.inputs.generate_assets == 'true'
+
+ - name: Upload assets
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: bin-${{ matrix.vscode_arch }}
+ path: assets/
+ retention-days: 3
+ if: github.event.inputs.generate_assets == 'true'
diff --git a/.github/workflows/insider-spearhead.yml b/.github/workflows/insider-spearhead.yml
deleted file mode 100644
index f18c68b17ac..00000000000
--- a/.github/workflows/insider-spearhead.yml
+++ /dev/null
@@ -1,98 +0,0 @@
-name: insider-spearhead
-
-on:
- workflow_dispatch:
- inputs:
- new_release:
- type: boolean
- description: Force new Release
- force_dispatch:
- type: boolean
- description: Force dispatch
- dont_update:
- type: boolean
- description: Don't update VSCode
- dont_dispatch:
- type: boolean
- description: Disable dispatch
- schedule:
- - cron: '0 7 * * *'
-
-jobs:
- build:
- runs-on: macos-15
- env:
- APP_NAME: VSCodium
- ASSETS_REPOSITORY: ${{ github.repository }}-insiders
- BINARY_NAME: codium-insiders
- GH_REPO_PATH: ${{ github.repository }}
- ORG_NAME: ${{ github.repository_owner }}
- OS_NAME: osx
- SOURCEMAPS_REPOSITORY: ${{ github.repository_owner }}/sourcemaps
- VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
- VSCODE_ARCH: arm64
- VSCODE_LATEST: ${{ github.event.inputs.dont_update == 'true' && 'no' || 'yes' }}
- VSCODE_QUALITY: insider
-
- steps:
- - uses: actions/checkout@v6
- with:
- ref: insider
-
- - name: Setup Node.js environment
- uses: actions/setup-node@v6
- with:
- node-version-file: '.nvmrc'
-
- - name: Clone VSCode repo
- run: . get_repo.sh
-
- - name: Check existing VSCodium tags/releases
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- NEW_RELEASE: ${{ github.event.inputs.new_release }}
- IS_SPEARHEAD: 'yes'
- run: . check_tags.sh
-
- - name: Build
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: ./build.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Import GPG key
- uses: crazy-max/ghaction-import-gpg@v7
- with:
- gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
- passphrase: ${{ secrets.GPG_PASSPHRASE }}
- git_user_signingkey: true
- git_commit_gpgsign: true
- if: env.SHOULD_BUILD == 'yes' && github.event.inputs.dont_update != 'true'
-
- - name: Update upstream version
- run: ./update_upstream.sh
- if: env.SHOULD_BUILD == 'yes' && github.event.inputs.dont_update != 'true'
-
- - name: Prepare source
- run: ./prepare_src.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Upload sourcemaps
- env:
- GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
- GITHUB_USERNAME: ${{ github.repository_owner }}
- run: ./upload_sourcemaps.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Release source
- env:
- GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
- GITHUB_USERNAME: ${{ github.repository_owner }}
- run: ./release.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Dispatch builds
- uses: peter-evans/repository-dispatch@v4
- with:
- event-type: insider
- if: github.event.inputs.dont_dispatch != 'true' && (env.SHOULD_BUILD == 'yes' || github.event.inputs.force_dispatch == 'true')
diff --git a/.github/workflows/lint-zizmor.yml b/.github/workflows/lint-zizmor.yml
new file mode 100644
index 00000000000..e13d2e38ed6
--- /dev/null
+++ b/.github/workflows/lint-zizmor.yml
@@ -0,0 +1,30 @@
+name: Lint - zizmor
+
+on:
+ push:
+ branches:
+ - master
+ - insider
+ paths-ignore:
+ - "**/*.md"
+ pull_request:
+ branches:
+ - "**"
+ paths-ignore:
+ - "**/*.md"
+
+permissions: {}
+
+jobs:
+ zizmor:
+ runs-on: ubuntu-latest
+ permissions:
+ security-events: write
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ persist-credentials: false
+
+ - name: Run zizmor
+ uses: zizmorcore/zizmor-action@192e21d79ab29983730a13d1382995c2307fbcaa # v0.5.7
diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml
deleted file mode 100644
index 05a1c3c4527..00000000000
--- a/.github/workflows/lock.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: Lock Closed Threads
-
-on:
- schedule:
- - cron: '0 2 * * *'
-
-jobs:
- lock:
- runs-on: ubuntu-latest
- steps:
- - uses: dessant/lock-threads@v6
- with:
- github-token: ${{ github.token }}
- issue-inactive-days: '90'
- pr-inactive-days: '90'
- discussion-inactive-days: '90'
- log-output: true
diff --git a/.github/workflows/mod-lock-closed-threads.yml b/.github/workflows/mod-lock-closed-threads.yml
new file mode 100644
index 00000000000..2d6c3bf51c6
--- /dev/null
+++ b/.github/workflows/mod-lock-closed-threads.yml
@@ -0,0 +1,22 @@
+name: Moderation - Lock Closed Threads
+
+on:
+ schedule:
+ - cron: 0 2 * * *
+
+permissions:
+ issues: write
+ pull-requests: write
+ discussions: write
+
+jobs:
+ lock:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: dessant/lock-threads@89ae32b08ed1a541efecbab17912962a5e38981c # v6.0.2
+ with:
+ github-token: ${{ github.token }}
+ issue-inactive-days: "90"
+ pr-inactive-days: "90"
+ discussion-inactive-days: "90"
+ log-output: true
diff --git a/.github/workflows/mod-stale-issue-pr.yml b/.github/workflows/mod-stale-issue-pr.yml
new file mode 100644
index 00000000000..b82cb87b1a0
--- /dev/null
+++ b/.github/workflows/mod-stale-issue-pr.yml
@@ -0,0 +1,24 @@
+name: Moderation - Stale Issues & PR
+
+on:
+ schedule:
+ - cron: 0 1 * * *
+
+permissions:
+ issues: write
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
+ with:
+ days-before-stale: 180
+ days-before-close: 30
+ operations-per-run: 1024
+ stale-issue-message: This issue has been automatically marked as stale. **If this issue is still affecting you, please leave any comment**, and we'll keep it open. If you have any new additional information, please include it with your comment!
+ close-issue-message: This issue has been closed due to inactivity, and will not be monitored. If this is a bug and you can reproduce this issue, please open a new issue.
+ exempt-issue-labels: discussion,never-stale
+ stale-pr-message: This PR has been automatically marked as stale.
+ close-pr-message: This PR has been closed due to inactivity, and will not be monitored.
+ only-pr-labels: needs-information
diff --git a/.github/workflows/insider-linux.yml b/.github/workflows/publish-insider-linux.yml
similarity index 65%
rename from .github/workflows/insider-linux.yml
rename to .github/workflows/publish-insider-linux.yml
index b1b17a87cd3..9ab74963a67 100644
--- a/.github/workflows/insider-linux.yml
+++ b/.github/workflows/publish-insider-linux.yml
@@ -1,37 +1,19 @@
-name: insider-linux
+name: Publish - Insider - Linux
on:
- workflow_dispatch:
- inputs:
- force_version:
- type: boolean
- description: Force update version
- generate_assets:
- type: boolean
- description: Generate assets
- checkout_pr:
- type: string
- description: Checkout PR
+ workflow_dispatch: {}
repository_dispatch:
- types: [insider]
- push:
- branches: [ insider ]
- paths-ignore:
- - '**/*.md'
- - 'upstream/*.json'
- pull_request:
- branches: [ insider ]
- paths-ignore:
- - '**/*.md'
+ types:
+ - publish-insider
env:
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
APP_NAME: VSCodium
ASSETS_REPOSITORY: ${{ github.repository }}-insiders
BINARY_NAME: codium-insiders
- DISABLE_UPDATE: 'yes'
+ DISABLE_UPDATE: yes
GH_REPO_PATH: ${{ github.repository }}
- GITHUB_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || 'insider' }}
+ GITHUB_BRANCH: insider
ORG_NAME: ${{ github.repository_owner }}
OS_NAME: linux
VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
@@ -40,77 +22,66 @@ env:
jobs:
check:
runs-on: ubuntu-latest
+ permissions: {}
outputs:
MS_COMMIT: ${{ env.MS_COMMIT }}
MS_TAG: ${{ env.MS_TAG }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
- name: Clone VSCode repo
run: ./get_repo.sh
- - name: Check PR or cron
- env:
- GENERATE_ASSETS: ${{ github.event.inputs.generate_assets }}
- run: ./check_cron_or_pr.sh
-
- name: Check existing VSCodium tags/releases
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- CHECK_ALL: 'yes'
+ CHECK_ALL: yes
run: ./check_tags.sh
compile:
needs:
- check
runs-on: ubuntu-22.04
+ permissions: {}
env:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- VSCODE_ARCH: 'x64'
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
+ VSCODE_ARCH: x64
outputs:
BUILD_SOURCEVERSION: ${{ env.BUILD_SOURCEVERSION }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
if: env.SHOULD_BUILD == 'yes'
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
-
- name: Setup GCC
- uses: egor-tensin/setup-gcc@v2
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
with:
version: 10
platform: x64
+ if: env.SHOULD_BUILD == 'yes'
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
- node-version-file: '.nvmrc'
+ node-version-file: .nvmrc
if: env.SHOULD_BUILD == 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
- python-version: '3.11'
+ python-version: "3.11"
if: env.SHOULD_BUILD == 'yes'
- name: Install libkrb5-dev
@@ -123,8 +94,8 @@ jobs:
- name: Build
env:
- SHOULD_BUILD_REH: 'no'
- SHOULD_BUILD_REH_WEB: 'no'
+ SHOULD_BUILD_REH: no
+ SHOULD_BUILD_REH_WEB: no
run: ./build.sh
if: env.SHOULD_BUILD == 'yes'
@@ -137,11 +108,11 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Upload vscode artifact
- uses: actions/upload-artifact@v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: vscode
path: ./vscode.tar.gz
- retention-days: ${{ needs.check.outputs.SHOULD_DEPLOY == 'yes' && 30 || 1 }}
+ retention-days: 30
if: env.SHOULD_BUILD == 'yes'
build:
@@ -149,6 +120,9 @@ jobs:
- check
- compile
runs-on: ubuntu-latest
+ environment: publish
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -161,10 +135,6 @@ jobs:
vscode_arch: arm64
npm_arch: arm64
image: vscodium/vscodium-linux-build-agent:focal-arm64
- - slug: ARM32
- vscode_arch: armhf
- npm_arch: arm
- image: vscodium/vscodium-linux-build-agent:focal-armhf
- slug: RISCV64
vscode_arch: riscv64
npm_arch: riscv64
@@ -185,29 +155,22 @@ jobs:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
outputs:
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Install GH
run: ./build/linux/install_gh.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Check existing VSCodium tags/releases
env:
@@ -221,16 +184,17 @@ jobs:
run: ./build/linux/deps.sh
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- - uses: actions-rust-lang/setup-rust-toolchain@v1
+ - uses: actions-rust-lang/setup-rust-toolchain@46268bd060767258de96ed93c1251119784f2ab6 # v1.16.1
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Build
+ id: build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
npm_config_arch: ${{ matrix.npm_arch }}
@@ -241,37 +205,34 @@ jobs:
env:
SHOULD_BUILD_REH: 'no'
SHOULD_BUILD_REH_WEB: 'no'
+ VSCODE_SYSROOT_REPOSITORY: ${{ steps.build.outputs.VSCODE_SYSROOT_REPOSITORY }}
+ VSCODE_SYSROOT_VERSION: ${{ steps.build.outputs.VSCODE_SYSROOT_VERSION }}
+ VSCODE_SYSROOT_PREFIX: ${{ steps.build.outputs.VSCODE_SYSROOT_PREFIX }}
run: ./prepare_assets.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Update versions repo
env:
- FORCE_UPDATE: ${{ github.event.inputs.force_version }}
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./update_version.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: bin-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
reh_linux:
needs:
- check
- compile
runs-on: ubuntu-22.04
+ environment: publish
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -282,9 +243,6 @@ jobs:
- slug: ARM64
vscode_arch: arm64
npm_arch: arm64
- - slug: ARM32
- vscode_arch: armhf
- npm_arch: arm
- slug: PPC64
vscode_arch: ppc64le
npm_arch: ppc64
@@ -304,37 +262,31 @@ jobs:
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
- if: needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true'
+ if: needs.check.outputs.SHOULD_BUILD == 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
- if: env.DISABLED != 'yes'
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
if: env.DISABLED != 'yes'
- name: Setup GCC
- uses: egor-tensin/setup-gcc@v2
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
with:
version: 10
platform: x64
if: env.DISABLED != 'yes'
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: '.nvmrc'
if: env.DISABLED != 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: '3.11'
if: env.DISABLED != 'yes'
@@ -345,7 +297,7 @@ jobs:
- name: Install GH
run: ./build/linux/install_gh.sh
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.DISABLED != 'yes'
- name: Check existing VSCodium tags/releases
env:
@@ -355,38 +307,33 @@ jobs:
if: env.DISABLED != 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
npm_config_arch: ${{ matrix.npm_arch }}
run: ./build/linux/package_reh.sh
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: reh-linux-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
reh_alpine:
needs:
- check
- compile
runs-on: ubuntu-22.04
+ environment: publish
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -405,34 +352,28 @@ jobs:
OS_NAME: alpine
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
- if: needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true'
+ if: needs.check.outputs.SHOULD_BUILD == 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
- name: Setup GCC
- uses: egor-tensin/setup-gcc@v2
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
with:
version: 10
platform: x64
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: '.nvmrc'
- name: Install GH
run: ./build/linux/install_gh.sh
- if: env.SHOULD_DEPLOY == 'yes'
- name: Check existing VSCodium tags/releases
env:
@@ -445,45 +386,38 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
npm_config_arch: ${{ matrix.npm_arch }}
run: ./build/alpine/package_reh.sh
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: reh-alpine-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
aur:
needs:
- check
- build
runs-on: ubuntu-latest
+ environment: publish-linux-aur
+ permissions: {}
strategy:
fail-fast: false
matrix:
include:
- package_name: vscodium-insiders-bin
- package_name: vscodium-insiders
- if: needs.check.outputs.SHOULD_DEPLOY == 'yes' && github.event.inputs.generate_assets != 'true'
steps:
- name: Get version
@@ -492,7 +426,7 @@ jobs:
run: echo "PACKAGE_VERSION=${RELEASE_VERSION/-*/}" >> "${GITHUB_ENV}"
- name: Publish ${{ matrix.package_name }}
- uses: zokugun/github-actions-aur-releaser@v1
+ uses: zokugun/github-actions-aur-releaser@4348c8a4124434a85d0a5e7457d0ef4079dab490 # v1
with:
package_name: ${{ matrix.package_name }}
package_version: ${{ env.PACKAGE_VERSION }}
@@ -505,6 +439,9 @@ jobs:
- check
- build
runs-on: ubuntu-latest
+ environment: publish
+ permissions:
+ contents: write
env:
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
SNAP_NAME: codium-insiders
@@ -514,21 +451,17 @@ jobs:
platform:
- amd64
- arm64
- if: needs.check.outputs.SHOULD_DEPLOY == 'yes' && needs.check.outputs.SHOULD_BUILD_SNAP != 'no' && vars.DISABLE_INSIDER_SNAP != 'yes'
+ if: needs.check.outputs.SHOULD_BUILD_SNAP != 'no' && vars.DISABLE_INSIDER_SNAP != 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
-
- - uses: docker/setup-qemu-action@v4
+ - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
- - uses: diddlesnaps/snapcraft-multiarch-action@v1
+ - uses: diddlesnaps/snapcraft-multiarch-action@cfd7a246fad6bea65bb92f69a1c8d07898c231e5 # v1.9.0
with:
path: stores/snapcraft/insider
architecture: ${{ matrix.platform }}
@@ -539,7 +472,7 @@ jobs:
# snap: ${{ steps.build.outputs.snap }}
# isClassic: 'true'
- - uses: svenstaro/upload-release-action@v2
+ - uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # latest
with:
repo_name: ${{ env.ASSETS_REPOSITORY }}
repo_token: ${{ secrets.STRONGER_GITHUB_TOKEN }}
@@ -551,11 +484,12 @@ jobs:
- check
- build
runs-on: ubuntu-latest
- if: needs.check.outputs.SHOULD_DEPLOY == 'yes' && github.event.inputs.generate_assets != 'true'
+ environment: publish
+ permissions: {}
steps:
- name: Trigger repository rebuild
- uses: peter-evans/repository-dispatch@v4
+ uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
with:
token: ${{ secrets.STRONGER_GITHUB_TOKEN }}
repository: VSCodium/repositories-linux
diff --git a/.github/workflows/insider-macos.yml b/.github/workflows/publish-insider-macos.yml
similarity index 50%
rename from .github/workflows/insider-macos.yml
rename to .github/workflows/publish-insider-macos.yml
index 79828c1da48..6d6cead1410 100644
--- a/.github/workflows/insider-macos.yml
+++ b/.github/workflows/publish-insider-macos.yml
@@ -1,35 +1,17 @@
-name: insider-macos
+name: Publish - Insider - macOS
on:
- workflow_dispatch:
- inputs:
- force_version:
- type: boolean
- description: Force update version
- generate_assets:
- type: boolean
- description: Generate assets
- checkout_pr:
- type: string
- description: Checkout PR
+ workflow_dispatch: {}
repository_dispatch:
- types: [insider]
- push:
- branches: [ insider ]
- paths-ignore:
- - '**/*.md'
- - 'upstream/*.json'
- pull_request:
- branches: [ insider ]
- paths-ignore:
- - '**/*.md'
+ types:
+ - publish-insider
env:
APP_NAME: VSCodium
ASSETS_REPOSITORY: ${{ github.repository }}-insiders
BINARY_NAME: codium-insiders
- GITHUB_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || 'insider' }}
GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: insider
ORG_NAME: ${{ github.repository_owner }}
OS_NAME: osx
VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
@@ -38,6 +20,9 @@ env:
jobs:
build:
runs-on: ${{ matrix.runner }}
+ environment: publish-osx
+ permissions:
+ contents: write
env:
VSCODE_ARCH: ${{ matrix.vscode_arch }}
strategy:
@@ -46,43 +31,33 @@ jobs:
include:
- runner: macos-15-intel
vscode_arch: x64
- - runner: [self-hosted, macOS, ARM64]
+ - runner: macos-14
vscode_arch: arm64
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: . get_pr.sh
+ persist-credentials: false
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
- node-version-file: '.nvmrc'
+ node-version-file: .nvmrc
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
- python-version: '3.11'
+ python-version: "3.11"
if: env.VSCODE_ARCH == 'x64'
- name: Clone VSCode repo
run: . get_repo.sh
- - name: Check PR or cron
- env:
- GENERATE_ASSETS: ${{ github.event.inputs.generate_assets }}
- run: . check_cron_or_pr.sh
-
- name: Check existing VSCodium tags/releases
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: . check_tags.sh
- if: env.SHOULD_DEPLOY == 'yes'
- name: Build
env:
@@ -92,36 +67,27 @@ jobs:
- name: Prepare assets
env:
- CERTIFICATE_OSX_APP_PASSWORD: ${{ secrets.CERTIFICATE_OSX_NEW_APP_PASSWORD }}
- CERTIFICATE_OSX_ID: ${{ secrets.CERTIFICATE_OSX_NEW_ID }}
- CERTIFICATE_OSX_P12_DATA: ${{ secrets.CERTIFICATE_OSX_NEW_P12_DATA }}
- CERTIFICATE_OSX_P12_PASSWORD: ${{ secrets.CERTIFICATE_OSX_NEW_P12_PASSWORD }}
- CERTIFICATE_OSX_TEAM_ID: ${{ secrets.CERTIFICATE_OSX_NEW_TEAM_ID }}
+ CERTIFICATE_OSX_APP_PASSWORD: ${{ secrets.CERTIFICATE_OSX_APP_PASSWORD }}
+ CERTIFICATE_OSX_APPLE_ID: ${{ secrets.CERTIFICATE_OSX_APPLE_ID }}
+ CERTIFICATE_OSX_P12_DATA: ${{ secrets.CERTIFICATE_OSX_P12_DATA }}
+ CERTIFICATE_OSX_P12_PASSWORD: ${{ secrets.CERTIFICATE_OSX_P12_PASSWORD }}
+ CERTIFICATE_OSX_TEAM_ID: ${{ secrets.CERTIFICATE_OSX_TEAM_ID }}
run: ./prepare_assets.sh
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.SHOULD_BUILD == 'yes'
- name: Update versions repo
env:
- FORCE_UPDATE: ${{ github.event.inputs.force_version }}
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./update_version.sh
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: bin-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.SHOULD_BUILD == 'yes'
- name: Clean up keychain
if: always()
diff --git a/.github/workflows/publish-insider-spearhead.yml b/.github/workflows/publish-insider-spearhead.yml
new file mode 100644
index 00000000000..fdab389391f
--- /dev/null
+++ b/.github/workflows/publish-insider-spearhead.yml
@@ -0,0 +1,120 @@
+name: Publish - Insider - Spearhead
+
+on:
+ workflow_dispatch:
+ inputs:
+ new_release:
+ type: boolean
+ description: Force new Release
+ dont_update:
+ type: boolean
+ description: Don't update VSCode
+ dont_dispatch:
+ type: boolean
+ description: Disable dispatch
+
+env:
+ APP_NAME: VSCodium
+ ASSETS_REPOSITORY: ${{ github.repository }}-insiders
+ BINARY_NAME: codium-insiders
+ GH_REPO_PATH: ${{ github.repository }}
+ ORG_NAME: ${{ github.repository_owner }}
+ OS_NAME: osx
+ SOURCEMAPS_REPOSITORY: ${{ github.repository_owner }}/sourcemaps
+ VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
+ VSCODE_ARCH: arm64
+ VSCODE_LATEST: ${{ github.event.inputs.dont_update == 'true' && 'no' || 'yes' }}
+ VSCODE_QUALITY: insider
+
+jobs:
+ check:
+ runs-on: macos-15
+ permissions: {}
+ outputs:
+ MS_COMMIT: ${{ env.MS_COMMIT }}
+ MS_TAG: ${{ env.MS_TAG }}
+ RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
+ SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: insider
+ persist-credentials: false
+
+ - name: Clone VSCode repo
+ run: . get_repo.sh
+
+ - name: Check existing VSCodium tags/releases
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NEW_RELEASE: ${{ github.event.inputs.new_release }}
+ IS_SPEARHEAD: 'yes'
+ run: . check_tags.sh
+
+ build:
+ needs:
+ - check
+ runs-on: macos-15
+ environment: publish-release
+ permissions:
+ contents: write # Release
+ env:
+ MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
+ MS_TAG: ${{ needs.check.outputs.MS_TAG }}
+ RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
+ if: needs.check.outputs.SHOULD_BUILD == 'yes'
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: insider
+ persist-credentials: false
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: '.nvmrc'
+
+ - name: Clone VSCode repo
+ run: . get_repo.sh
+
+ - name: Build
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: ./build.sh
+
+ - name: Import GPG key
+ uses: crazy-max/ghaction-import-gpg@2dc316deee8e90f13e1a351ab510b4d5bc0c82cd # v7.0.0
+ with:
+ gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
+ passphrase: ${{ secrets.GPG_PASSPHRASE }}
+ git_user_signingkey: true
+ git_commit_gpgsign: true
+ if: github.event.inputs.dont_update != 'true'
+
+ - name: Update upstream version
+ run: ./update_upstream.sh
+ if: github.event.inputs.dont_update != 'true'
+
+ - name: Prepare source
+ run: ./prepare_src.sh
+
+ - name: Upload sourcemaps
+ env:
+ GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
+ GITHUB_USERNAME: ${{ github.repository_owner }}
+ run: ./upload_sourcemaps.sh
+
+ - name: Release source
+ env:
+ GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
+ GITHUB_USERNAME: ${{ github.repository_owner }}
+ run: ./release.sh
+
+ - name: Dispatch builds
+ uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
+ with:
+ event-type: publish-insider
+ if: github.event.inputs.dont_dispatch != 'true'
diff --git a/.github/workflows/insider-windows.yml b/.github/workflows/publish-insider-windows.yml
similarity index 61%
rename from .github/workflows/insider-windows.yml
rename to .github/workflows/publish-insider-windows.yml
index 367f7f1e482..a9461e37ecf 100644
--- a/.github/workflows/insider-windows.yml
+++ b/.github/workflows/publish-insider-windows.yml
@@ -1,35 +1,17 @@
-name: insider-windows
+name: Publish - Insider - Windows
on:
- workflow_dispatch:
- inputs:
- force_version:
- type: boolean
- description: Force update version
- generate_assets:
- type: boolean
- description: Generate assets
- checkout_pr:
- type: string
- description: Checkout PR
+ workflow_dispatch: {}
repository_dispatch:
- types: [insider]
- push:
- branches: [ insider ]
- paths-ignore:
- - '**/*.md'
- - 'upstream/*.json'
- pull_request:
- branches: [ insider ]
- paths-ignore:
- - '**/*.md'
+ types:
+ - publish-insider
env:
APP_NAME: VSCodium
ASSETS_REPOSITORY: ${{ github.repository }}-insiders
BINARY_NAME: codium-insiders
- GITHUB_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || 'insider' }}
GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: insider
ORG_NAME: ${{ github.repository_owner }}
OS_NAME: windows
VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
@@ -38,41 +20,33 @@ env:
jobs:
check:
runs-on: ubuntu-latest
+ permissions: {}
outputs:
MS_COMMIT: ${{ env.MS_COMMIT }}
MS_TAG: ${{ env.MS_TAG }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
- name: Clone VSCode repo
run: ./get_repo.sh
- - name: Check PR or cron
- env:
- GENERATE_ASSETS: ${{ github.event.inputs.generate_assets }}
- run: ./check_cron_or_pr.sh
-
- name: Check existing VSCodium tags/releases
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- CHECK_ALL: 'yes'
+ CHECK_ALL: yes
run: ./check_tags.sh
compile:
needs:
- check
runs-on: windows-2022
+ permissions: {}
defaults:
run:
shell: bash
@@ -80,52 +54,38 @@ jobs:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- VSCODE_ARCH: 'x64'
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
+ VSCODE_ARCH: x64
outputs:
BUILD_SOURCEVERSION: ${{ env.BUILD_SOURCEVERSION }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
if: env.SHOULD_BUILD == 'yes'
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
-
- # - name: Setup GCC
- # uses: egor-tensin/setup-gcc@v1
- # with:
- # version: 10
- # platform: x64
-
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
- node-version-file: '.nvmrc'
+ node-version-file: .nvmrc
if: env.SHOULD_BUILD == 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
- python-version: '3.11'
+ python-version: "3.11"
if: env.SHOULD_BUILD == 'yes'
- # - name: Install libkrb5-dev
- # run: sudo apt-get update -y && sudo apt-get install -y libkrb5-dev
- # if: env.SHOULD_BUILD == 'yes'
-
- name: Clone VSCode repo
run: ./get_repo.sh
if: env.SHOULD_BUILD == 'yes'
- name: Build
env:
- SHOULD_BUILD_REH: 'no'
- SHOULD_BUILD_REH_WEB: 'no'
+ SHOULD_BUILD_REH: no
+ SHOULD_BUILD_REH_WEB: no
run: ./build.sh
if: env.SHOULD_BUILD == 'yes'
@@ -138,11 +98,11 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Upload vscode artifact
- uses: actions/upload-artifact@v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: vscode
path: ./vscode.tar.gz
- retention-days: ${{ needs.check.outputs.SHOULD_DEPLOY == 'yes' && 30 || 1 }}
+ retention-days: 30
if: env.SHOULD_BUILD == 'yes'
build:
@@ -150,6 +110,9 @@ jobs:
- check
- compile
runs-on: windows-2022
+ environment: publish-windows
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -164,33 +127,26 @@ jobs:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
outputs:
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
if: env.SHOULD_BUILD == 'yes'
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: '.nvmrc'
if: env.SHOULD_BUILD == 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: '3.11'
if: env.SHOULD_BUILD == 'yes'
@@ -203,7 +159,7 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
if: env.SHOULD_BUILD == 'yes'
@@ -218,21 +174,21 @@ jobs:
- name: Prepare assets
run: ./prepare_assets.sh
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Upload unsigned artifacts
id: upload-unsigned-artifacts
- uses: actions/upload-artifact@v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: unsigned-${{ matrix.vscode_arch }}
path: |
assets/*.exe
assets/*.msi
retention-days: 1
- if: env.SHOULD_BUILD == 'yes' && vars.DISABLE_INSIDER_WINDOWS_SIGNING != 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes' && vars.DISABLE_INSIDER_WINDOWS_SIGNING != 'yes'
- name: Signing
- uses: signpath/github-action-submit-signing-request@v2
+ uses: signpath/github-action-submit-signing-request@b9d91eadd323de506c0c81cf0c7fe7438f3360fd # v2
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
@@ -242,52 +198,46 @@ jobs:
artifact-configuration-slug: ${{ matrix.vscode_arch }}
wait-for-completion: true
# 3h to manually approve the request
- wait-for-completion-timeout-in-seconds: 10800
+ wait-for-completion-timeout-in-seconds: 28800
output-artifact-directory: assets/
- if: env.SHOULD_BUILD == 'yes' && vars.DISABLE_INSIDER_WINDOWS_SIGNING != 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes' && vars.DISABLE_INSIDER_WINDOWS_SIGNING != 'yes'
- name: Prepare checksums
run: ./prepare_checksums.sh
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.SHOULD_BUILD == 'yes'
- name: Update versions repo
env:
- FORCE_UPDATE: ${{ github.event.inputs.force_version }}
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./update_version.sh
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: bin-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.SHOULD_BUILD == 'yes'
winget:
needs: build
runs-on: windows-2022
+ environment: publish
+ permissions:
+ contents: write
defaults:
run:
shell: bash
env:
APP_IDENTIFIER: VSCodium.VSCodium.Insiders
ASSETS_REPOSITORY: vscodium-insiders
- if: needs.build.outputs.SHOULD_DEPLOY == 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
- name: Check version
run: ./stores/winget/check_version.sh
@@ -295,7 +245,7 @@ jobs:
RELEASE_VERSION: ${{ needs.build.outputs.RELEASE_VERSION }}
- name: Release to WinGet
- uses: vedantmgoyal9/winget-releaser@main
+ uses: vedantmgoyal9/winget-releaser@4ffc7888bffd451b357355dc214d43bb9f23917e
with:
identifier: ${{ env.APP_IDENTIFIER }}
version: ${{ env.RELEASE_VERSION }}
diff --git a/.github/workflows/stable-linux.yml b/.github/workflows/publish-stable-linux.yml
similarity index 65%
rename from .github/workflows/stable-linux.yml
rename to .github/workflows/publish-stable-linux.yml
index 456bfba3434..92d4dea77ad 100644
--- a/.github/workflows/stable-linux.yml
+++ b/.github/workflows/publish-stable-linux.yml
@@ -1,39 +1,19 @@
-name: stable-linux
+name: Publish - Stable - Linux
on:
- workflow_dispatch:
- inputs:
- force_version:
- type: boolean
- description: Force update version
- generate_assets:
- type: boolean
- description: Generate assets
- force_snap:
- type: boolean
- description: Force Snap
- checkout_pr:
- type: string
- description: Checkout PR
+ workflow_dispatch: {}
repository_dispatch:
- types: [stable]
- push:
- branches: [ master ]
- paths-ignore:
- - '**/*.md'
- - 'upstream/*.json'
- pull_request:
- branches: [ master ]
- paths-ignore:
- - '**/*.md'
+ types:
+ - publish-stable
env:
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
APP_NAME: VSCodium
ASSETS_REPOSITORY: ${{ github.repository }}
BINARY_NAME: codium
- DISABLE_UPDATE: 'yes'
+ DISABLE_UPDATE: yes
GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: master
ORG_NAME: ${{ github.repository_owner }}
OS_NAME: linux
VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
@@ -42,35 +22,26 @@ env:
jobs:
check:
runs-on: ubuntu-latest
+ permissions: {}
outputs:
MS_COMMIT: ${{ env.MS_COMMIT }}
MS_TAG: ${{ env.MS_TAG }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
- name: Clone VSCode repo
run: ./get_repo.sh
- - name: Check PR or cron
- env:
- GENERATE_ASSETS: ${{ github.event.inputs.generate_assets }}
- run: ./check_cron_or_pr.sh
-
- name: Check existing VSCodium tags/releases
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- CHECK_ALL: 'yes'
+ CHECK_ALL: yes
FORCE_LINUX_SNAP: ${{ github.event.inputs.force_snap }}
run: ./check_tags.sh
@@ -78,44 +49,40 @@ jobs:
needs:
- check
runs-on: ubuntu-22.04
+ permissions: {}
env:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- VSCODE_ARCH: 'x64'
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
+ VSCODE_ARCH: x64
outputs:
BUILD_SOURCEVERSION: ${{ env.BUILD_SOURCEVERSION }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
if: env.SHOULD_BUILD == 'yes'
- name: Setup GCC
- uses: egor-tensin/setup-gcc@v2
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
with:
version: 10
platform: x64
if: env.SHOULD_BUILD == 'yes'
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
- node-version-file: '.nvmrc'
+ node-version-file: .nvmrc
if: env.SHOULD_BUILD == 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
- python-version: '3.11'
+ python-version: "3.11"
if: env.SHOULD_BUILD == 'yes'
- name: Install libkrb5-dev
@@ -128,8 +95,8 @@ jobs:
- name: Build
env:
- SHOULD_BUILD_REH: 'no'
- SHOULD_BUILD_REH_WEB: 'no'
+ SHOULD_BUILD_REH: no
+ SHOULD_BUILD_REH_WEB: no
run: ./build.sh
if: env.SHOULD_BUILD == 'yes'
@@ -142,11 +109,11 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Upload vscode artifact
- uses: actions/upload-artifact@v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: vscode
path: ./vscode.tar.gz
- retention-days: ${{ needs.check.outputs.SHOULD_DEPLOY == 'yes' && 30 || 1 }}
+ retention-days: 30
if: env.SHOULD_BUILD == 'yes'
build:
@@ -154,6 +121,9 @@ jobs:
- check
- compile
runs-on: ubuntu-latest
+ environment: publish
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -166,10 +136,6 @@ jobs:
vscode_arch: arm64
npm_arch: arm64
image: vscodium/vscodium-linux-build-agent:focal-arm64
- - slug: ARM32
- vscode_arch: armhf
- npm_arch: arm
- image: vscodium/vscodium-linux-build-agent:focal-armhf
- slug: RISCV64
vscode_arch: riscv64
npm_arch: riscv64
@@ -190,29 +156,22 @@ jobs:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
outputs:
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
- if: env.DISABLED != 'yes'
-
- name: Install GH
run: ./build/linux/install_gh.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Check existing VSCodium tags/releases
env:
@@ -226,16 +185,17 @@ jobs:
run: ./build/linux/deps.sh
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- - uses: actions-rust-lang/setup-rust-toolchain@v1
+ - uses: actions-rust-lang/setup-rust-toolchain@46268bd060767258de96ed93c1251119784f2ab6 # v1.16.1
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Build
+ id: build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
npm_config_arch: ${{ matrix.npm_arch }}
@@ -246,37 +206,34 @@ jobs:
env:
SHOULD_BUILD_REH: 'no'
SHOULD_BUILD_REH_WEB: 'no'
+ VSCODE_SYSROOT_REPOSITORY: ${{ steps.build.outputs.VSCODE_SYSROOT_REPOSITORY }}
+ VSCODE_SYSROOT_VERSION: ${{ steps.build.outputs.VSCODE_SYSROOT_VERSION }}
+ VSCODE_SYSROOT_PREFIX: ${{ steps.build.outputs.VSCODE_SYSROOT_PREFIX }}
run: ./prepare_assets.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
- name: Update versions repo
env:
- FORCE_UPDATE: ${{ github.event.inputs.force_version }}
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./update_version.sh
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: bin-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.DISABLED != 'yes' && env.SHOULD_BUILD == 'yes'
reh_linux:
needs:
- check
- compile
runs-on: ubuntu-22.04
+ environment: publish
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -287,9 +244,6 @@ jobs:
- slug: ARM64
vscode_arch: arm64
npm_arch: arm64
- - slug: ARM32
- vscode_arch: armhf
- npm_arch: arm
- slug: PPC64
vscode_arch: ppc64le
npm_arch: ppc64
@@ -309,37 +263,31 @@ jobs:
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
- if: needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true'
+ if: needs.check.outputs.SHOULD_BUILD == 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
- if: env.DISABLED != 'yes'
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
if: env.DISABLED != 'yes'
- name: Setup GCC
- uses: egor-tensin/setup-gcc@v2
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
with:
version: 10
platform: x64
if: env.DISABLED != 'yes'
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: '.nvmrc'
if: env.DISABLED != 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: '3.11'
if: env.DISABLED != 'yes'
@@ -350,7 +298,7 @@ jobs:
- name: Install GH
run: ./build/linux/install_gh.sh
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.DISABLED != 'yes'
- name: Check existing VSCodium tags/releases
env:
@@ -360,38 +308,33 @@ jobs:
if: env.DISABLED != 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
npm_config_arch: ${{ matrix.npm_arch }}
run: ./build/linux/package_reh.sh
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: reh-linux-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
reh_alpine:
needs:
- check
- compile
runs-on: ubuntu-22.04
+ environment: publish
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -410,34 +353,28 @@ jobs:
OS_NAME: alpine
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
- if: needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true'
+ if: needs.check.outputs.SHOULD_BUILD == 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
- name: Setup GCC
- uses: egor-tensin/setup-gcc@v2
+ uses: egor-tensin/setup-gcc@a2861a8b8538f49cf2850980acccf6b05a1b2ae4 # v2.0
with:
version: 10
platform: x64
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: '.nvmrc'
- name: Install GH
run: ./build/linux/install_gh.sh
- if: env.SHOULD_DEPLOY == 'yes'
- name: Check existing VSCodium tags/releases
env:
@@ -450,51 +387,42 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
npm_config_arch: ${{ matrix.npm_arch }}
run: ./build/alpine/package_reh.sh
- if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no' || github.event.inputs.generate_assets == 'true')
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./release.sh
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: reh-alpine-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.DISABLED != 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.DISABLED != 'yes' && (env.SHOULD_BUILD_REH != 'no' || env.SHOULD_BUILD_REH_WEB != 'no')
aur:
needs:
- check
- build
runs-on: ubuntu-latest
+ environment: publish-linux-aur
+ permissions: {}
strategy:
fail-fast: false
matrix:
include:
- package_name: vscodium
package_type: stable
- # - package_name: vscodium-git
- # package_type: rolling
- if: needs.check.outputs.SHOULD_DEPLOY == 'yes'
steps:
- name: Publish ${{ matrix.package_name }}
- uses: zokugun/github-actions-aur-releaser@v1
+ uses: zokugun/github-actions-aur-releaser@4348c8a4124434a85d0a5e7457d0ef4079dab490 # v1
with:
package_name: ${{ matrix.package_name }}
package_type: ${{ matrix.package_type }}
@@ -507,6 +435,8 @@ jobs:
- check
- build
runs-on: ubuntu-latest
+ environment: publish-linux-snap
+ permissions: {}
env:
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
SNAP_NAME: codium
@@ -517,17 +447,13 @@ jobs:
platform:
- amd64
- arm64
- if: needs.check.outputs.SHOULD_DEPLOY == 'yes' && needs.check.outputs.SHOULD_BUILD_SNAP != 'no' && vars.DISABLE_STABLE_SNAP != 'yes'
+ if: needs.check.outputs.SHOULD_BUILD_SNAP != 'no' && vars.DISABLE_STABLE_SNAP != 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
- name: Check version
env:
@@ -537,23 +463,21 @@ jobs:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
run: ./stores/snapcraft/check_version.sh
- - uses: docker/setup-qemu-action@v4
- if: env.SHOULD_BUILD == 'yes'
+ - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
- - uses: diddlesnaps/snapcraft-multiarch-action@v1
+ - uses: diddlesnaps/snapcraft-multiarch-action@cfd7a246fad6bea65bb92f69a1c8d07898c231e5 # v1.9.0
with:
path: stores/snapcraft/stable
architecture: ${{ matrix.platform }}
id: build
- if: env.SHOULD_BUILD == 'yes'
- - uses: diddlesnaps/snapcraft-review-action@v1
+ - uses: diddlesnaps/snapcraft-review-action@40554b42331cf84dab19ef98c382620427f13482 # v1.3.1
with:
snap: ${{ steps.build.outputs.snap }}
isClassic: 'true'
if: env.SHOULD_DEPLOY_TO_RELEASE == 'yes' || env.SHOULD_DEPLOY_TO_STORE == 'yes'
- - uses: svenstaro/upload-release-action@v2
+ - uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # latest
with:
repo_name: ${{ env.ASSETS_REPOSITORY }}
repo_token: ${{ secrets.STRONGER_GITHUB_TOKEN }}
@@ -561,7 +485,7 @@ jobs:
tag: ${{ env.RELEASE_VERSION }}
if: env.SHOULD_DEPLOY_TO_RELEASE == 'yes'
- - uses: snapcore/action-publish@master
+ - uses: snapcore/action-publish@214b86e5ca036ead1668c79afb81e550e6c54d40
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
with:
@@ -574,7 +498,8 @@ jobs:
- check
- build
runs-on: ubuntu-latest
- if: needs.check.outputs.SHOULD_DEPLOY == 'yes' && github.event.inputs.generate_assets != 'true'
+ environment: publish-linux-rudy
+ permissions: {}
steps:
- name: Trigger repository rebuild
@@ -587,11 +512,12 @@ jobs:
- check
- build
runs-on: ubuntu-latest
- if: needs.check.outputs.SHOULD_DEPLOY == 'yes' && github.event.inputs.generate_assets != 'true'
+ environment: publish
+ permissions: {}
steps:
- name: Trigger repository rebuild
- uses: peter-evans/repository-dispatch@v4
+ uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
with:
token: ${{ secrets.STRONGER_GITHUB_TOKEN }}
repository: VSCodium/repositories-linux
diff --git a/.github/workflows/stable-macos.yml b/.github/workflows/publish-stable-macos.yml
similarity index 51%
rename from .github/workflows/stable-macos.yml
rename to .github/workflows/publish-stable-macos.yml
index 1c370d9e10d..37fe1531281 100644
--- a/.github/workflows/stable-macos.yml
+++ b/.github/workflows/publish-stable-macos.yml
@@ -1,34 +1,17 @@
-name: stable-macos
+name: Publish - Stable - macOS
on:
- workflow_dispatch:
- inputs:
- force_version:
- type: boolean
- description: Force update version
- generate_assets:
- type: boolean
- description: Generate assets
- checkout_pr:
- type: string
- description: Checkout PR
+ workflow_dispatch: {}
repository_dispatch:
- types: [stable]
- push:
- branches: [ master ]
- paths-ignore:
- - '**/*.md'
- - 'upstream/*.json'
- pull_request:
- branches: [ master ]
- paths-ignore:
- - '**/*.md'
+ types:
+ - publish-stable
env:
APP_NAME: VSCodium
ASSETS_REPOSITORY: ${{ github.repository }}
BINARY_NAME: codium
GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: master
ORG_NAME: ${{ github.repository_owner }}
OS_NAME: osx
VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
@@ -37,6 +20,9 @@ env:
jobs:
build:
runs-on: ${{ matrix.runner }}
+ environment: publish-osx
+ permissions:
+ contents: write
env:
VSCODE_ARCH: ${{ matrix.vscode_arch }}
strategy:
@@ -45,43 +31,33 @@ jobs:
include:
- runner: macos-15-intel
vscode_arch: x64
- - runner: [self-hosted, macOS, ARM64]
+ - runner: macos-14
vscode_arch: arm64
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: . get_pr.sh
+ persist-credentials: false
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
- node-version-file: '.nvmrc'
+ node-version-file: .nvmrc
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
- python-version: '3.11'
+ python-version: "3.11"
if: env.VSCODE_ARCH == 'x64'
- name: Clone VSCode repo
run: . get_repo.sh
- - name: Check PR or cron
- env:
- GENERATE_ASSETS: ${{ github.event.inputs.generate_assets }}
- run: . check_cron_or_pr.sh
-
- name: Check existing VSCodium tags/releases
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: . check_tags.sh
- if: env.SHOULD_DEPLOY == 'yes'
- name: Build
env:
@@ -91,35 +67,26 @@ jobs:
- name: Prepare assets
env:
- CERTIFICATE_OSX_APP_PASSWORD: ${{ secrets.CERTIFICATE_OSX_NEW_APP_PASSWORD }}
- CERTIFICATE_OSX_ID: ${{ secrets.CERTIFICATE_OSX_NEW_ID }}
- CERTIFICATE_OSX_P12_DATA: ${{ secrets.CERTIFICATE_OSX_NEW_P12_DATA }}
- CERTIFICATE_OSX_P12_PASSWORD: ${{ secrets.CERTIFICATE_OSX_NEW_P12_PASSWORD }}
- CERTIFICATE_OSX_TEAM_ID: ${{ secrets.CERTIFICATE_OSX_NEW_TEAM_ID }}
+ CERTIFICATE_OSX_APP_PASSWORD: ${{ secrets.CERTIFICATE_OSX_APP_PASSWORD }}
+ CERTIFICATE_OSX_APPLE_ID: ${{ secrets.CERTIFICATE_OSX_APPLE_ID }}
+ CERTIFICATE_OSX_P12_DATA: ${{ secrets.CERTIFICATE_OSX_P12_DATA }}
+ CERTIFICATE_OSX_P12_PASSWORD: ${{ secrets.CERTIFICATE_OSX_P12_PASSWORD }}
+ CERTIFICATE_OSX_TEAM_ID: ${{ secrets.CERTIFICATE_OSX_TEAM_ID }}
run: ./prepare_assets.sh
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./release.sh
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.SHOULD_BUILD == 'yes'
- name: Update versions repo
env:
- FORCE_UPDATE: ${{ github.event.inputs.force_version }}
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./update_version.sh
- if: env.SHOULD_DEPLOY == 'yes'
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: bin-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.SHOULD_BUILD == 'yes'
- name: Clean up keychain
if: always()
diff --git a/.github/workflows/publish-stable-spearhead.yml b/.github/workflows/publish-stable-spearhead.yml
new file mode 100644
index 00000000000..ad834df4553
--- /dev/null
+++ b/.github/workflows/publish-stable-spearhead.yml
@@ -0,0 +1,120 @@
+name: Publish - Stable - Spearhead
+
+on:
+ workflow_dispatch:
+ inputs:
+ new_release:
+ type: boolean
+ description: Force new Release
+ dont_update:
+ type: boolean
+ description: Don't update VSCode
+ dont_dispatch:
+ type: boolean
+ description: Disable dispatch
+
+env:
+ APP_NAME: VSCodium
+ ASSETS_REPOSITORY: ${{ github.repository }}
+ BINARY_NAME: codium
+ GH_REPO_PATH: ${{ github.repository }}
+ ORG_NAME: ${{ github.repository_owner }}
+ OS_NAME: osx
+ SOURCEMAPS_REPOSITORY: ${{ github.repository_owner }}/sourcemaps
+ VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
+ VSCODE_ARCH: arm64
+ VSCODE_LATEST: ${{ github.event.inputs.dont_update == 'true' && 'no' || 'yes' }}
+ VSCODE_QUALITY: stable
+
+jobs:
+ check:
+ runs-on: macos-15
+ permissions: {}
+ outputs:
+ MS_COMMIT: ${{ env.MS_COMMIT }}
+ MS_TAG: ${{ env.MS_TAG }}
+ RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
+ SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: master
+ persist-credentials: false
+
+ - name: Clone VSCode repo
+ run: . get_repo.sh
+
+ - name: Check existing VSCodium tags/releases
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NEW_RELEASE: ${{ github.event.inputs.new_release }}
+ IS_SPEARHEAD: 'yes'
+ run: . check_tags.sh
+
+ build:
+ needs:
+ - check
+ runs-on: macos-15
+ environment: publish-release
+ permissions:
+ contents: write # Release
+ env:
+ MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
+ MS_TAG: ${{ needs.check.outputs.MS_TAG }}
+ RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
+ if: needs.check.outputs.SHOULD_BUILD == 'yes'
+
+ steps:
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: master
+ persist-credentials: false
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ with:
+ node-version-file: '.nvmrc'
+
+ - name: Clone VSCode repo
+ run: . get_repo.sh
+
+ - name: Build
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: ./build.sh
+
+ - name: Import GPG key
+ uses: crazy-max/ghaction-import-gpg@2dc316deee8e90f13e1a351ab510b4d5bc0c82cd # v7.0.0
+ with:
+ gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
+ passphrase: ${{ secrets.GPG_PASSPHRASE }}
+ git_user_signingkey: true
+ git_commit_gpgsign: true
+ if: github.event.inputs.dont_update != 'true'
+
+ - name: Update upstream version
+ run: ./update_upstream.sh
+ if: github.event.inputs.dont_update != 'true'
+
+ - name: Prepare source
+ run: ./prepare_src.sh
+
+ - name: Upload sourcemaps
+ env:
+ GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
+ GITHUB_USERNAME: ${{ github.repository_owner }}
+ run: ./upload_sourcemaps.sh
+
+ - name: Release source
+ env:
+ GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
+ GITHUB_USERNAME: ${{ github.repository_owner }}
+ run: ./release.sh
+
+ - name: Dispatch builds
+ uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
+ with:
+ event-type: publish-stable
+ if: github.event.inputs.dont_dispatch != 'true'
diff --git a/.github/workflows/stable-windows.yml b/.github/workflows/publish-stable-windows.yml
similarity index 61%
rename from .github/workflows/stable-windows.yml
rename to .github/workflows/publish-stable-windows.yml
index 8bea37f105d..57f1d85e7a9 100644
--- a/.github/workflows/stable-windows.yml
+++ b/.github/workflows/publish-stable-windows.yml
@@ -1,34 +1,17 @@
-name: stable-windows
+name: Publish - Stable - Windows
on:
- workflow_dispatch:
- inputs:
- force_version:
- type: boolean
- description: Force update version
- generate_assets:
- type: boolean
- description: Generate assets
- checkout_pr:
- type: string
- description: Checkout PR
+ workflow_dispatch: {}
repository_dispatch:
- types: [stable]
- push:
- branches: [ master ]
- paths-ignore:
- - '**/*.md'
- - 'upstream/*.json'
- pull_request:
- branches: [ master ]
- paths-ignore:
- - '**/*.md'
+ types:
+ - publish-stable
env:
APP_NAME: VSCodium
ASSETS_REPOSITORY: ${{ github.repository }}
BINARY_NAME: codium
GH_REPO_PATH: ${{ github.repository }}
+ GITHUB_BRANCH: master
ORG_NAME: ${{ github.repository_owner }}
OS_NAME: windows
VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
@@ -37,41 +20,33 @@ env:
jobs:
check:
runs-on: ubuntu-latest
+ permissions: {}
outputs:
MS_COMMIT: ${{ env.MS_COMMIT }}
MS_TAG: ${{ env.MS_TAG }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
- name: Clone VSCode repo
run: ./get_repo.sh
- - name: Check PR or cron
- env:
- GENERATE_ASSETS: ${{ github.event.inputs.generate_assets }}
- run: ./check_cron_or_pr.sh
-
- name: Check existing VSCodium tags/releases
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- CHECK_ALL: 'yes'
+ CHECK_ALL: yes
run: ./check_tags.sh
compile:
needs:
- check
runs-on: windows-2022
+ permissions: {}
defaults:
run:
shell: bash
@@ -79,52 +54,38 @@ jobs:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- VSCODE_ARCH: 'x64'
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
+ VSCODE_ARCH: x64
outputs:
BUILD_SOURCEVERSION: ${{ env.BUILD_SOURCEVERSION }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
if: env.SHOULD_BUILD == 'yes'
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
-
- # - name: Setup GCC
- # uses: egor-tensin/setup-gcc@v1
- # with:
- # version: 10
- # platform: x64
-
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
- node-version-file: '.nvmrc'
+ node-version-file: .nvmrc
if: env.SHOULD_BUILD == 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
- python-version: '3.11'
+ python-version: "3.11"
if: env.SHOULD_BUILD == 'yes'
- # - name: Install libkrb5-dev
- # run: sudo apt-get update -y && sudo apt-get install -y libkrb5-dev
- # if: env.SHOULD_BUILD == 'yes'
-
- name: Clone VSCode repo
run: ./get_repo.sh
if: env.SHOULD_BUILD == 'yes'
- name: Build
env:
- SHOULD_BUILD_REH: 'no'
- SHOULD_BUILD_REH_WEB: 'no'
+ SHOULD_BUILD_REH: no
+ SHOULD_BUILD_REH_WEB: no
run: ./build.sh
if: env.SHOULD_BUILD == 'yes'
@@ -137,11 +98,11 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Upload vscode artifact
- uses: actions/upload-artifact@v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: vscode
path: ./vscode.tar.gz
- retention-days: ${{ needs.check.outputs.SHOULD_DEPLOY == 'yes' && 30 || 1 }}
+ retention-days: 30
if: env.SHOULD_BUILD == 'yes'
build:
@@ -149,6 +110,9 @@ jobs:
- check
- compile
runs-on: windows-2022
+ environment: publish-windows
+ permissions:
+ contents: write
strategy:
fail-fast: false
matrix:
@@ -163,33 +127,26 @@ jobs:
MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
MS_TAG: ${{ needs.check.outputs.MS_TAG }}
RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
- SHOULD_BUILD: ${{ (needs.check.outputs.SHOULD_BUILD == 'yes' || github.event.inputs.generate_assets == 'true') && 'yes' || 'no' }}
- SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
+ SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
VSCODE_ARCH: ${{ matrix.vscode_arch }}
outputs:
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
- SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Switch to relevant branch
- env:
- PULL_REQUEST_ID: ${{ github.event.inputs.checkout_pr }}
- run: ./get_pr.sh
+ persist-credentials: false
if: env.SHOULD_BUILD == 'yes'
- name: Setup Node.js environment
- uses: actions/setup-node@v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: '.nvmrc'
if: env.SHOULD_BUILD == 'yes'
- name: Setup Python 3
- uses: actions/setup-python@v6
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: '3.11'
if: env.SHOULD_BUILD == 'yes'
@@ -202,7 +159,7 @@ jobs:
if: env.SHOULD_BUILD == 'yes'
- name: Download vscode artifact
- uses: actions/download-artifact@v8
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: vscode
if: env.SHOULD_BUILD == 'yes'
@@ -217,21 +174,21 @@ jobs:
- name: Prepare assets
run: ./prepare_assets.sh
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Upload unsigned artifacts
id: upload-unsigned-artifacts
- uses: actions/upload-artifact@v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: unsigned-${{ matrix.vscode_arch }}
path: |
assets/*.exe
assets/*.msi
retention-days: 1
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Signing
- uses: signpath/github-action-submit-signing-request@v2
+ uses: signpath/github-action-submit-signing-request@b9d91eadd323de506c0c81cf0c7fe7438f3360fd # v2
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
@@ -243,48 +200,42 @@ jobs:
# 8h to manually approve the request
wait-for-completion-timeout-in-seconds: 28800
output-artifact-directory: assets/
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Prepare checksums
run: ./prepare_checksums.sh
- if: env.SHOULD_BUILD == 'yes' && (env.SHOULD_DEPLOY == 'yes' || github.event.inputs.generate_assets == 'true')
+ if: env.SHOULD_BUILD == 'yes'
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./release.sh
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
+ if: env.SHOULD_BUILD == 'yes'
- name: Update versions repo
env:
- FORCE_UPDATE: ${{ github.event.inputs.force_version }}
GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.repository_owner }}
run: ./update_version.sh
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'
-
- - name: Upload assets
- uses: actions/upload-artifact@v7
- with:
- name: bin-${{ matrix.vscode_arch }}
- path: assets/
- retention-days: 3
- if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'no' && github.event.inputs.generate_assets == 'true'
+ if: env.SHOULD_BUILD == 'yes'
winget:
needs: build
runs-on: windows-2022
+ environment: publish
+ permissions:
+ contents: write
defaults:
run:
shell: bash
env:
APP_IDENTIFIER: VSCodium.VSCodium
- if: needs.build.outputs.SHOULD_DEPLOY == 'yes'
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ env.GITHUB_BRANCH }}
+ persist-credentials: false
- name: Check version
run: ./stores/winget/check_version.sh
@@ -292,7 +243,7 @@ jobs:
RELEASE_VERSION: ${{ needs.build.outputs.RELEASE_VERSION }}
- name: Release to WinGet
- uses: vedantmgoyal9/winget-releaser@main
+ uses: vedantmgoyal9/winget-releaser@4ffc7888bffd451b357355dc214d43bb9f23917e
with:
identifier: ${{ env.APP_IDENTIFIER }}
version: ${{ env.RELEASE_VERSION }}
diff --git a/.github/workflows/stable-spearhead.yml b/.github/workflows/stable-spearhead.yml
deleted file mode 100644
index 4acaee4e154..00000000000
--- a/.github/workflows/stable-spearhead.yml
+++ /dev/null
@@ -1,93 +0,0 @@
-name: stable-spearhead
-
-on:
- workflow_dispatch:
- inputs:
- new_release:
- type: boolean
- description: Force new Release
- force_dispatch:
- type: boolean
- description: Force dispatch
- dont_update:
- type: boolean
- description: Don't update VSCode
- schedule:
- - cron: '0 18 * * *'
-
-jobs:
- build:
- runs-on: macos-15
- env:
- APP_NAME: VSCodium
- ASSETS_REPOSITORY: ${{ github.repository }}
- BINARY_NAME: codium
- GH_REPO_PATH: ${{ github.repository }}
- ORG_NAME: ${{ github.repository_owner }}
- OS_NAME: osx
- SOURCEMAPS_REPOSITORY: ${{ github.repository_owner }}/sourcemaps
- VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
- VSCODE_ARCH: arm64
- VSCODE_LATEST: ${{ github.event.inputs.dont_update == 'true' && 'no' || 'yes' }}
- VSCODE_QUALITY: stable
-
- steps:
- - uses: actions/checkout@v6
-
- - name: Setup Node.js environment
- uses: actions/setup-node@v6
- with:
- node-version-file: '.nvmrc'
-
- - name: Clone VSCode repo
- run: . get_repo.sh
-
- - name: Check existing VSCodium tags/releases
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- NEW_RELEASE: ${{ github.event.inputs.new_release }}
- IS_SPEARHEAD: 'yes'
- run: . check_tags.sh
-
- - name: Build
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: ./build.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Import GPG key
- uses: crazy-max/ghaction-import-gpg@v7
- with:
- gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
- passphrase: ${{ secrets.GPG_PASSPHRASE }}
- git_user_signingkey: true
- git_commit_gpgsign: true
- if: env.SHOULD_BUILD == 'yes' && github.event.inputs.dont_update != 'true'
-
- - name: Update upstream version
- run: ./update_upstream.sh
- if: env.SHOULD_BUILD == 'yes' && github.event.inputs.dont_update != 'true'
-
- - name: Prepare source
- run: ./prepare_src.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Upload sourcemaps
- env:
- GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
- GITHUB_USERNAME: ${{ github.repository_owner }}
- run: ./upload_sourcemaps.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Release source
- env:
- GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
- GITHUB_USERNAME: ${{ github.repository_owner }}
- run: ./release.sh
- if: env.SHOULD_BUILD == 'yes'
-
- - name: Dispatch builds
- uses: peter-evans/repository-dispatch@v4
- with:
- event-type: stable
- if: env.SHOULD_BUILD == 'yes' || github.event.inputs.force_dispatch == 'true'
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
deleted file mode 100644
index d3391096d3e..00000000000
--- a/.github/workflows/stale.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Stale Issues
-
-on:
- schedule:
- - cron: '0 1 * * *'
-
-permissions:
- issues: write
-
-jobs:
- stale:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/stale@v10
- with:
- days-before-stale: 180
- days-before-close: 30
- stale-issue-label: stale
- operations-per-run: 1024
- stale-issue-message: >
- This issue has been automatically marked as stale. **If this issue is still affecting you, please leave any comment**, and we'll keep it open. If you have any new additional information, please include it with your comment!
- close-issue-message: >
- This issue has been closed due to inactivity, and will not be monitored. If this is a bug and you can reproduce this issue, please open a new issue.
- exempt-issue-labels: discussion,never-stale
- only-pr-labels: needs-information
diff --git a/.github/zizmor.yml b/.github/zizmor.yml
new file mode 100644
index 00000000000..f86b55dc7bd
--- /dev/null
+++ b/.github/zizmor.yml
@@ -0,0 +1,6 @@
+rules:
+ superfluous-actions:
+ ignore:
+ # allows `svenstaro/upload-release-action` action
+ - publish-insider-linux.yml:482
+ - publish-stable-linux.yml:487
diff --git a/.nvmrc b/.nvmrc
index 85e502778f6..5bf4400f229 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22.22.0
+24.15.0
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 81a95f6551b..2fc0756cfef 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,6 +12,16 @@
This project and everyone participating in it is governed by the [VSCodium Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code.
+## Use of AI
+
+We welcome use of AI tools to help draft discussions, issues, or code, but please follow these rules:
+
+- Use AI tools responsibly and disclose their use.
+- Ensure all content passes a human review for authenticity and quality.
+- Be concise. Do not write verbose discussions, issues or PR.
+
+Discussions, issues or PR that consist solely of unvetted AI outputs may be closed at the maintainer's discretion.
+
## Reporting Bugs
### Before Submitting an Issue
diff --git a/README.md b/README.md
index 412dfdb8540..f0b8143d472 100644
--- a/README.md
+++ b/README.md
@@ -13,10 +13,6 @@
[](https://snapcraft.io/codium)
[](https://snapcraft.io/codium)
-[](https://github.com/VSCodium/vscodium/actions/workflows/stable-linux.yml?query=branch%3Amaster)
-[](https://github.com/VSCodium/vscodium/actions/workflows/stable-macos.yml?query=branch%3Amaster)
-[](https://github.com/VSCodium/vscodium/actions/workflows/stable-windows.yml?query=branch%3Amaster)
-
**This is not a fork. This is a repository of scripts to automatically build [Microsoft's `vscode` repository](https://github.com/microsoft/vscode) into freely-licensed binaries with a community-driven default configuration.**
@@ -36,6 +32,7 @@
- [Why Does This Exist](#why)
- [More Info](#more-info)
- [Supported Platforms](#supported-platforms)
+- [Previously Supported Platforms](#previously-supported-platforms)
## Download/Install
@@ -179,17 +176,22 @@ The builds are run every day, but exit early if there isn't a new release from M
The minimal version is limited by the core component Electron, you may want to check its [platform prerequisites](https://www.electronjs.org/docs/latest/development/build-instructions-gn#platform-prerequisites).
-- [x] macOS (`zip`, `dmg`) macOS 10.15 or newer x64
-- [x] macOS (`zip`, `dmg`) macOS 11.0 or newer arm64
+- [x] macOS (`zip`, `dmg`) macOS 12 or newer x64
+- [x] macOS (`zip`, `dmg`) macOS 12 or newer arm64
- [x] GNU/Linux x64 (`deb`, `rpm`, `AppImage`, `snap`, `tar.gz`)
- [x] GNU/Linux arm64 (`deb`, `rpm`, `snap`, `tar.gz`)
-- [x] GNU/Linux armhf (`deb`, `rpm`, `tar.gz`)
- [x] GNU/Linux riscv64 (`tar.gz`)
- [x] GNU/Linux loong64 (`tar.gz`)
- [x] GNU/Linux ppc64le (`tar.gz`)
- [x] Windows 10 / Server 2012 R2 or newer x64
- [x] Windows 10 / Server 2012 R2 or newer arm64
+## Previously Supported Platforms
+
+- GNU/Linux armhf:
+ - Latest available: [v1.121.03429](https://github.com/VSCodium/vscodium/releases/tag/1.121.03429).
+ - Breaking point: `node-v24`.
+
## Special thanks
diff --git a/announcements-extra.json b/announcements-extra.json
index 7ca48dc103d..42a46f8fa16 100644
--- a/announcements-extra.json
+++ b/announcements-extra.json
@@ -1,7 +1,12 @@
[
{
- "id": "#2668",
- "title": "[Windows] broken update on 1.107, need manual update",
- "url": "https://github.com/VSCodium/vscodium/issues/2668"
+ "id": "#2836",
+ "title": "Securing VSCodium",
+ "url": "https://github.com/VSCodium/vscodium/discussions/2836"
+ },
+ {
+ "id": "#2871",
+ "title": "Use minReleaseAge with auto-update",
+ "url": "https://github.com/VSCodium/vscodium/discussions/2871"
}
]
diff --git a/build.sh b/build.sh
index bd78e0f157b..84a75bc1711 100755
--- a/build.sh
+++ b/build.sh
@@ -13,14 +13,9 @@ if [[ "${SHOULD_BUILD}" == "yes" ]]; then
cd vscode || { echo "'vscode' dir not found"; exit 1; }
export NODE_OPTIONS="--max-old-space-size=8192"
+ export VSCODE_PUBLISH_COUNTER=1
- npm run monaco-compile-check
- npm run valid-layers-check
-
- npm run gulp compile-build-without-mangling
- npm run gulp compile-extension-media
- npm run gulp compile-extensions-build
- npm run gulp minify-vscode
+ npm run gulp vscode-min-prepack
if [[ "${OS_NAME}" == "osx" ]]; then
# remove win32 node modules
@@ -30,7 +25,7 @@ if [[ "${SHOULD_BUILD}" == "yes" ]]; then
npm run copy-policy-dto --prefix build
node build/lib/policies/policyGenerator.ts build/lib/policies/policyData.jsonc darwin
- npm run gulp "vscode-darwin-${VSCODE_ARCH}-min-ci"
+ npm run gulp "vscode-darwin-${VSCODE_ARCH}-min-packing"
find "../VSCode-darwin-${VSCODE_ARCH}" -print0 | xargs -0 touch -c
@@ -46,7 +41,7 @@ if [[ "${SHOULD_BUILD}" == "yes" ]]; then
npm run copy-policy-dto --prefix build
node build/lib/policies/policyGenerator.ts build/lib/policies/policyData.jsonc win32
- npm run gulp "vscode-win32-${VSCODE_ARCH}-min-ci"
+ npm run gulp "vscode-win32-${VSCODE_ARCH}-min-packing"
if [[ "${VSCODE_ARCH}" != "x64" ]]; then
SHOULD_BUILD_REH="no"
@@ -67,7 +62,7 @@ if [[ "${SHOULD_BUILD}" == "yes" ]]; then
npm run copy-policy-dto --prefix build
node build/lib/policies/policyGenerator.ts build/lib/policies/policyData.jsonc linux
- npm run gulp "vscode-linux-${VSCODE_ARCH}-min-ci"
+ npm run gulp "vscode-linux-${VSCODE_ARCH}-min-packing"
find "../VSCode-linux-${VSCODE_ARCH}" -print0 | xargs -0 touch -c
diff --git a/build/alpine/check_tags.sh b/build/alpine/check_tags.sh
new file mode 100644
index 00000000000..05032557208
--- /dev/null
+++ b/build/alpine/check_tags.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+
+if [[ "${CHECK_ONLY_REH}" == "yes" ]]; then
+ if [[ -z $( contains "${APP_NAME_LC}-reh-alpine-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Alpine ${VSCODE_ARCH} because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ echo "Already have the Alpine REH ${VSCODE_ARCH} archive"
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-reh-web-alpine-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Alpine ${VSCODE_ARCH} because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ echo "Already have the Alpine REH-web ${VSCODE_ARCH} archive"
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+else
+
+ # alpine-arm64
+ if [[ "${VSCODE_ARCH}" == "arm64" || "${CHECK_ALL}" == "yes" ]]; then
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-alpine-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Alpine arm64 because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-alpine-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Alpine arm64 because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+ fi
+
+ # alpine-x64
+ if [[ "${VSCODE_ARCH}" == "x64" || "${CHECK_ALL}" == "yes" ]]; then
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-alpine-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Alpine x64 because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-alpine-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Alpine x64 because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+ fi
+fi
diff --git a/build/linux/appimage/build.sh b/build/linux/appimage/build.sh
index 6f4e3fd5d9d..78289318301 100755
--- a/build/linux/appimage/build.sh
+++ b/build/linux/appimage/build.sh
@@ -33,12 +33,12 @@ if [[ "${VSCODE_ARCH}" == "x64" ]]; then
APP_NAME_LC="$( echo "${APP_NAME}" | awk '{print tolower($0)}' )"
if [[ "${VSCODE_QUALITY}" == "insider" ]]; then
- sed -i "s|@@NAME@@|${APP_NAME}-Insiders|g" recipe.yml
- sed -i "s|@@APPNAME@@|${BINARY_NAME}|g" recipe.yml
+ sed -i "s|@@APP_NAME@@|${APP_NAME}-Insiders|g" recipe.yml
+ sed -i "s|@@BINARY_NAME@@|${BINARY_NAME}|g" recipe.yml
sed -i "s|@@ICON@@|${APP_NAME_LC}-insiders|g" recipe.yml
else
- sed -i "s|@@NAME@@|${APP_NAME}|g" recipe.yml
- sed -i "s|@@APPNAME@@|${BINARY_NAME}|g" recipe.yml
+ sed -i "s|@@APP_NAME@@|${APP_NAME}|g" recipe.yml
+ sed -i "s|@@BINARY_NAME@@|${BINARY_NAME}|g" recipe.yml
sed -i "s|@@ICON@@|${APP_NAME_LC}|g" recipe.yml
fi
diff --git a/build/linux/appimage/recipe.yml b/build/linux/appimage/recipe.yml
index 59c273703dd..38dc72297e3 100644
--- a/build/linux/appimage/recipe.yml
+++ b/build/linux/appimage/recipe.yml
@@ -5,7 +5,7 @@
# wget -c "https://github.com/AppImage/pkg2appimage/raw/master/pkg2appimage"
# bash -ex pkg2appimage VSCodium
-app: @@NAME@@
+app: @@APP_NAME@@
ingredients:
packages:
@@ -17,11 +17,11 @@ ingredients:
script:
- pwd
- cp ../../../../vscode/.build/linux/deb/amd64/deb/*.deb .
- - ls @@APPNAME@@_*.deb | cut -d _ -f 2 > VERSION
+ - ls @@BINARY_NAME@@_*.deb | cut -d _ -f 2 > VERSION
script:
- - sed -i -e 's|/usr/share/pixmaps/||g' usr/share/applications/@@APPNAME@@.desktop
- - cp usr/share/applications/@@APPNAME@@.desktop .
+ - sed -i -e 's|/usr/share/pixmaps/||g' usr/share/applications/@@BINARY_NAME@@.desktop
+ - cp usr/share/applications/@@BINARY_NAME@@.desktop .
- cp usr/share/pixmaps/@@ICON@@.png .
- /usr/bin/convert @@ICON@@.png -resize 512x512 usr/share/icons/hicolor/512x512/apps/@@ICON@@.png
- /usr/bin/convert @@ICON@@.png -resize 256x256 usr/share/icons/hicolor/256x256/apps/@@ICON@@.png
@@ -29,18 +29,22 @@ script:
- /usr/bin/convert @@ICON@@.png -resize 64x64 usr/share/icons/hicolor/64x64/apps/@@ICON@@.png
- /usr/bin/convert @@ICON@@.png -resize 48x48 usr/share/icons/hicolor/48x48/apps/@@ICON@@.png
- /usr/bin/convert @@ICON@@.png -resize 32x32 usr/share/icons/hicolor/32x32/apps/@@ICON@@.png
- - ( cd usr/bin/ ; ln -s ../share/@@APPNAME@@/@@APPNAME@@ . )
+ - ( cd usr/bin/ ; ln -s ../share/@@BINARY_NAME@@/@@BINARY_NAME@@ . )
- rm -rf usr/lib/x86_64-linux-gnu
- rm -f lib/x86_64-linux-gnu/libglib*
- cat > AppRun <<\EOF
- #!/bin/sh
- HERE="$(dirname "$(readlink -f "${0}")")"
- export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/:"${PATH}"
- - export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/i386-linux-gnu/:"${HERE}"/lib/x86_64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/:"${LD_LIBRARY_PATH}"
- export XDG_DATA_DIRS="${HERE}"/usr/share/:"${XDG_DATA_DIRS}"
- export PERLLIB="${HERE}"/usr/share/perl5/:"${HERE}"/usr/lib/perl5/:"${PERLLIB}"
- export GSETTINGS_SCHEMA_DIR="${HERE}"/usr/share/glib-2.0/schemas/:"${GSETTINGS_SCHEMA_DIR}"
- export QT_PLUGIN_PATH="${HERE}"/usr/lib/qt4/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib32/qt4/plugins/:"${HERE}"/usr/lib64/qt4/plugins/:"${HERE}"/usr/lib/qt5/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib32/qt5/plugins/:"${HERE}"/usr/lib64/qt5/plugins/:"${QT_PLUGIN_PATH}"
- - EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2- | sed -e 's|%.||g')
- - exec ${EXEC} "$@"
+ - EXEC="${HERE}/usr/share/@@BINARY_NAME@@/@@BINARY_NAME@@"
+ - EXEC_CLI="${HERE}/usr/share/@@BINARY_NAME@@/bin/@@BINARY_NAME@@"
+ - if [ "$1" = "--" ]; then
+ - shift
+ - exec "${EXEC_CLI}" "$@"
+ - fi
+ - exec "${EXEC}" "$@"
- EOF
diff --git a/build/linux/check_tags.sh b/build/linux/check_tags.sh
new file mode 100644
index 00000000000..204a1f2a8fc
--- /dev/null
+++ b/build/linux/check_tags.sh
@@ -0,0 +1,293 @@
+#!/usr/bin/env bash
+
+if [[ "${CHECK_ONLY_REH}" == "yes" ]]; then
+
+ if [[ -z $( contains "${APP_NAME_LC}-reh-linux-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux ${VSCODE_ARCH} because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ echo "Already have the Linux REH ${VSCODE_ARCH} archive"
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-reh-web-linux-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux ${VSCODE_ARCH} because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ echo "Already have the Linux REH-web ${VSCODE_ARCH} archive"
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+else
+
+ # linux-arm64
+ if [[ "${VSCODE_ARCH}" == "arm64" || "${CHECK_ALL}" == "yes" ]]; then
+ if [[ -z $( contains "arm64.deb" ) ]]; then
+ echo "Building on Linux arm64 because we have no DEB"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_DEB="no"
+ fi
+
+ if [[ -z $( contains "aarch64.rpm" ) ]]; then
+ echo "Building on Linux arm64 because we have no RPM"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_RPM="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME}-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux arm64 because we have no TAR"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_TAR="no"
+ fi
+
+ if [[ -z $( contains "arm64.snap" ) || "${FORCE_LINUX_SNAP}" == "true" ]]; then
+ echo "Building on Linux arm64 because we have no SNAP"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_SNAP="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux arm64 because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux arm64 because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+ export SHOULD_BUILD_APPIMAGE="no"
+
+ if [[ -z $( contains "${APP_NAME_LC}-cli-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux arm64 because we have no CLI archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_CLI="no"
+ fi
+
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Linux arm64 builds"
+ fi
+ fi
+
+ # linux-ppc64le
+ if [[ "${VSCODE_ARCH}" == "ppc64le" || "${CHECK_ALL}" == "yes" ]]; then
+ export SHOULD_BUILD_APPIMAGE="no"
+
+ if [[ -z $( contains "ppc64el.deb" ) ]]; then
+ echo "Building on Linux PowerPC64LE because we have no DEB"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_DEB="no"
+ fi
+
+ if [[ -z $( contains "ppc64le.rpm" ) ]]; then
+ echo "Building on Linux PowerPC64LE because we have no RPM"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_RPM="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME}-linux-ppc64le-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux PowerPC64LE because we have no TAR"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_TAR="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-ppc64le-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux PowerPC64LE because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-ppc64le-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux PowerPC64LE because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-cli-linux-ppc64le-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux PowerPC64LE because we have no CLI archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_CLI="no"
+ fi
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Linux PowerPC64LE builds"
+ fi
+ fi
+
+ # linux-riscv64
+ if [[ "${VSCODE_ARCH}" == "riscv64" || "${CHECK_ALL}" == "yes" ]]; then
+ export SHOULD_BUILD_DEB="no"
+ export SHOULD_BUILD_RPM="no"
+ export SHOULD_BUILD_APPIMAGE="no"
+
+ if [[ -z $( contains "${APP_NAME}-linux-riscv64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux RISC-V 64 because we have no TAR"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_TAR="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-riscv64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux RISC-V 64 because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-riscv64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux RISC-V 64 because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+ export SHOULD_BUILD_CLI="no"
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Linux riscv64 builds"
+ fi
+ fi
+
+ # linux-loong64
+ if [[ "${VSCODE_ARCH}" == "loong64" || "${CHECK_ALL}" == "yes" ]]; then
+ export SHOULD_BUILD_DEB="no"
+ export SHOULD_BUILD_RPM="no"
+ export SHOULD_BUILD_APPIMAGE="no"
+
+ if [[ -z $( contains "${APP_NAME}-linux-loong64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux Loong64 because we have no TAR"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_TAR="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-loong64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux Loong64 because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-loong64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux Loong64 because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+ export SHOULD_BUILD_CLI="no"
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Linux Loong64 builds"
+ fi
+ fi
+
+ # linux-s390x
+ if [[ "${VSCODE_ARCH}" == "s390x" || "${CHECK_ALL}" == "yes" ]]; then
+ SHOULD_BUILD_APPIMAGE="no"
+ SHOULD_BUILD_DEB="no"
+ SHOULD_BUILD_RPM="no"
+ SHOULD_BUILD_TAR="no"
+
+ if [[ -z $( contains "${APP_NAME_LC}-reh-linux-s390x-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux s390x because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-reh-web-linux-s390x-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux s390x because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+ export SHOULD_BUILD_CLI="no"
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Linux s390x builds"
+ fi
+ fi
+
+ # linux-x64
+ if [[ "${VSCODE_ARCH}" == "x64" || "${CHECK_ALL}" == "yes" ]]; then
+ if [[ -z $( contains "amd64.deb" ) ]]; then
+ echo "Building on Linux x64 because we have no DEB"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_DEB="no"
+ fi
+
+ if [[ -z $( contains "x86_64.rpm" ) ]]; then
+ echo "Building on Linux x64 because we have no RPM"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_RPM="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME}-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux x64 because we have no TAR"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_TAR="no"
+ fi
+
+ if [[ "${DISABLE_APPIMAGE}" == "yes" ]]; then
+ export SHOULD_BUILD_APPIMAGE="no"
+ elif [[ -z $( contains "x86_64.AppImage" ) ]]; then
+ echo "Building on Linux x64 because we have no AppImage"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_APPIMAGE="no"
+ fi
+
+ if [[ -z $( contains "amd64.snap" ) || "${FORCE_LINUX_SNAP}" == "true" ]]; then
+ echo "Building on Linux x64 because we have no SNAP"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_SNAP="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux x64 because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux x64 because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-cli-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Linux x64 because we have no CLI archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_CLI="no"
+ fi
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Linux x64 builds"
+ fi
+ fi
+fi
diff --git a/build/linux/deps.sh b/build/linux/deps.sh
index 8af94f5d06d..e6ca9b2c44c 100755
--- a/build/linux/deps.sh
+++ b/build/linux/deps.sh
@@ -8,6 +8,4 @@ sudo apt-get install -y libkrb5-dev
if [[ "${VSCODE_ARCH}" == "arm64" ]]; then
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu crossbuild-essential-arm64
-elif [[ "${VSCODE_ARCH}" == "armhf" ]]; then
- sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf crossbuild-essential-armhf
fi
diff --git a/build/linux/loong64/electron.sh b/build/linux/loong64/electron.sh
index 63cb443fa42..792e70de554 100644
--- a/build/linux/loong64/electron.sh
+++ b/build/linux/loong64/electron.sh
@@ -2,5 +2,5 @@
set -ex
-export ELECTRON_VERSION="39.2.3"
+export ELECTRON_VERSION="42.3.0"
export VSCODE_ELECTRON_TAG="v${ELECTRON_VERSION}"
diff --git a/build/linux/loong64/electron.sha256sums b/build/linux/loong64/electron.sha256sums
index a727d66d1e1..11b09d08423 100644
--- a/build/linux/loong64/electron.sha256sums
+++ b/build/linux/loong64/electron.sha256sums
@@ -1,9 +1,11 @@
-d26b2189e7466a08c73861d0225c9b28730fdfc30918f3ea70853b43a2581dc4 *chromedriver-v39.2.3-linux-loong64.zip
-8cc36f7468f5b2d98cde3f73c10c535555754c54be43e45c320a382c35b8e466 *electron-v39.2.3-linux-loong64.zip
-f6e7462d6fd795ae2b08344ee0fdca817eba148b62a62717b3f512c845d96a64 *ffmpeg-v39.2.3-linux-loong64.zip
-b122599dc84b81526ba4eecbca4794f3a2d25300242ad3829d1445cb6948f470 *hunspell-dictionaries.zip
-76ef17d2810df5e77c5071863e2a375df914cfb7a362ad0582ee0eedca2441b9 *libcxx-headers.zip
-9b61ba9f0780a57ee2749f7963759395784eadcaccc54af313de1a540240298e *libcxx-objects-v39.2.3-linux-loong64.zip
-9ae64aff9e391eae401142e55654b5b8cf54d0611b1ecb540f2f4e89a2b4f772 *libcxxabi-headers.zip
-7d7e6e08c84aa38b74037f5910534918bc792ffbe2ca6d667067f587f27f5118 *mksnapshot-v39.2.3-linux-loong64.zip
-db48f8a9d2271e8b3a1c3f26ea1ae9bd489deb1b464b6ae424a15d5df7529fdc *node-v39.2.3-headers.tar.gz
+d79a0b6955a66c75b68e8204c6e619f1217397c57e6ac8041d0d644178f1d2d4 *chromedriver-v42.3.0-linux-loong64.zip
+349944821a5b0b96280bd68dcfdfae623152ecaf074c79ac73deab03f9a5f581 *electron-v42.3.0-linux-loong64-debug.zip
+6dc3af9e4396f0ee6863c299197018e89cb22b95d48ee55d4838280d27988178 *electron-v42.3.0-linux-loong64-symbols.zip
+92b0ca0c9c18ed90166918a4ac1970266c4fa967aee9277031b3b250b905526e *electron-v42.3.0-linux-loong64.zip
+1efa327bf004c805c4fbbe723cb98e324bc1bb7b957c196acddae5c7fe7bd67d *ffmpeg-v42.3.0-linux-loong64.zip
+7050ac1a2fef9962bb12094cb08cb26c22d70ae8dc0fe6b23c05a7f1380a330f *hunspell-dictionaries.zip
+a1f1483a02250e5add3d1957466a6936510c41ed9bc9011a5adc6cad8b8590e3 *libcxx-headers.zip
+01176a11233dd00913929217a495958d1f0c54c682b2ce25609a76756602356f *libcxx-objects-v42.3.0-linux-loong64.zip
+da3c0c2dc5522066522bb48bf33d3a1e691fa683e301951626256c7729cc903b *libcxxabi-headers.zip
+c0b0a28c6c6e648f1850e7925e888e3e47d30024972673ca42ae87a21e55d64e *mksnapshot-v42.3.0-linux-loong64.zip
+285692ab65685424574bdf8264c78898c51a5172588ad7c2f3285ac346d3dfcd *node-v42.3.0-headers.tar.gz
diff --git a/build/linux/loong64/ripgrep.sh b/build/linux/loong64/ripgrep.sh
index a9bb44338aa..d455ec6d6ef 100755
--- a/build/linux/loong64/ripgrep.sh
+++ b/build/linux/loong64/ripgrep.sh
@@ -8,11 +8,16 @@ if [ "$#" -ne 1 ]; then
exit 1
fi
-RG_PATH="$1/@vscode/ripgrep/bin/rg"
+RG_PATH="$1/@vscode/ripgrep-universal/bin/linux-loong64/rg"
RG_VERSION="14.1.1"
echo "Replacing ripgrep binary with loong64 one"
-rm "${RG_PATH}"
+if [ -f "${RG_PATH}" ]; then
+ rm "${RG_PATH}"
+else
+ mkdir -p "$(dirname "${RG_PATH}")"
+fi
+
curl --silent --fail -L https://github.com/darkyzhou/ripgrep-loongarch64-musl/releases/download/${RG_VERSION}/rg -o "${RG_PATH}"
chmod +x "${RG_PATH}"
diff --git a/build/linux/package_bin.sh b/build/linux/package_bin.sh
index ecb1eccd21b..8cd724eb5e6 100755
--- a/build/linux/package_bin.sh
+++ b/build/linux/package_bin.sh
@@ -7,6 +7,9 @@ if [[ "${CI_BUILD}" == "no" ]]; then
exit 1
fi
+npm -v
+node -v
+
# include common functions
. ./utils.sh
@@ -20,16 +23,16 @@ export VSCODE_PLATFORM='linux'
export VSCODE_SKIP_NODE_VERSION_CHECK=1
export VSCODE_SYSROOT_PREFIX='-glibc-2.28-gcc-10.5.0'
-if [[ "${VSCODE_ARCH}" == "arm64" || "${VSCODE_ARCH}" == "armhf" ]]; then
+if [[ "${VSCODE_ARCH}" == "arm64" ]]; then
export VSCODE_SKIP_SYSROOT=1
# export USE_GNUPP2A=1
elif [[ "${VSCODE_ARCH}" == "ppc64le" ]]; then
export VSCODE_SYSROOT_REPOSITORY='VSCodium/vscode-linux-build-agent'
- export VSCODE_SYSROOT_VERSION='20240129-253798'
+ export VSCODE_SYSROOT_VERSION='20260706'
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
- export VSCODE_SKIP_SETUPENV=1
export VSCODE_ELECTRON_REPOSITORY='lex-ibm/electron-ppc64le-build-scripts'
+ export IGNORE_ELECTRON_VERSION="yes"
elif [[ "${VSCODE_ARCH}" == "riscv64" ]]; then
export VSCODE_ELECTRON_REPOSITORY='riscv-forks/electron-riscv-releases'
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
@@ -53,10 +56,10 @@ if [[ -f "../build/linux/${VSCODE_ARCH}/electron.sh" ]]; then
# shellcheck disable=SC1090
source "../build/linux/${VSCODE_ARCH}/electron.sh"
- TARGET=$( npm config get target )
+ TARGET=$( grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' build/lib/electron.ts )
# Only fails at different major versions
- if [[ "${ELECTRON_VERSION%%.*}" != "${TARGET%%.*}" ]]; then
+ if [[ "${ELECTRON_VERSION%%.*}" != "${TARGET%%.*}" ]] && [[ "${IGNORE_ELECTRON_VERSION}" != "yes" ]]; then
# Fail the pipeline if electron target doesn't match what is used.
echo "Electron ${VSCODE_ARCH} binary version doesn't match target electron version!"
echo "Releases available at: https://github.com/${VSCODE_ELECTRON_REPOSITORY}/releases"
@@ -66,6 +69,10 @@ if [[ -f "../build/linux/${VSCODE_ARCH}/electron.sh" ]]; then
if [[ "${ELECTRON_VERSION}" != "${TARGET}" ]]; then
# Force version
replace "s|target=\"${TARGET}\"|target=\"${ELECTRON_VERSION}\"|" .npmrc
+
+ cat .npmrc
+
+ export VSCODE_ELECTRON_VERSION="${ELECTRON_VERSION}"
fi
fi
@@ -134,7 +141,7 @@ find .build/extensions -type f -name '*.node' -print -delete
npm run copy-policy-dto --prefix build
node build/lib/policies/policyGenerator.ts build/lib/policies/policyData.jsonc linux
-npm run gulp "vscode-linux-${VSCODE_ARCH}-min-ci"
+npm run gulp "vscode-linux-${VSCODE_ARCH}-min-packing"
if [[ -f "../build/linux/${VSCODE_ARCH}/ripgrep.sh" ]]; then
bash "../build/linux/${VSCODE_ARCH}/ripgrep.sh" "../VSCode-linux-${VSCODE_ARCH}/resources/app/node_modules"
@@ -144,4 +151,10 @@ find "../VSCode-linux-${VSCODE_ARCH}" -print0 | xargs -0 touch -c
. ../build_cli.sh
+if [[ -n "${GITHUB_OUTPUT}" ]]; then
+ echo "VSCODE_SYSROOT_REPOSITORY=${VSCODE_SYSROOT_REPOSITORY:-}" >> "${GITHUB_OUTPUT}"
+ echo "VSCODE_SYSROOT_VERSION=${VSCODE_SYSROOT_VERSION:-}" >> "${GITHUB_OUTPUT}"
+ echo "VSCODE_SYSROOT_PREFIX=${VSCODE_SYSROOT_PREFIX:-}" >> "${GITHUB_OUTPUT}"
+fi
+
cd ..
diff --git a/build/linux/package_reh.sh b/build/linux/package_reh.sh
index e7d23d99000..9d74ba68e69 100755
--- a/build/linux/package_reh.sh
+++ b/build/linux/package_reh.sh
@@ -18,7 +18,7 @@ cd vscode || { echo "'vscode' dir not found"; exit 1; }
GLIBC_VERSION="2.28"
GLIBCXX_VERSION="3.4.26"
-NODE_VERSION="22.21.1"
+NODE_VERSION="24.15.0"
export VSCODE_NODEJS_URLROOT='/download/release'
export VSCODE_NODEJS_URLSUFFIX=''
@@ -32,31 +32,23 @@ elif [[ "${VSCODE_ARCH}" == "arm64" ]]; then
VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME="vscodium/vscodium-linux-build-agent:focal-devtoolset-arm64"
- export VSCODE_SKIP_SYSROOT=1
- export USE_GNUPP2A=1
-elif [[ "${VSCODE_ARCH}" == "armhf" ]]; then
- EXPECTED_GLIBC_VERSION="2.30"
-
- VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME="vscodium/vscodium-linux-build-agent:focal-devtoolset-armhf"
-
export VSCODE_SKIP_SYSROOT=1
export USE_GNUPP2A=1
elif [[ "${VSCODE_ARCH}" == "ppc64le" ]]; then
- GLIBC_VERSION="2.28"
-
VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME="vscodium/vscodium-linux-build-agent:focal-devtoolset-ppc64le"
- VSCODE_SYSROOT_PREFIX="-glibc-${GLIBC_VERSION}"
-
export VSCODE_SYSROOT_REPOSITORY='VSCodium/vscode-linux-build-agent'
- export VSCODE_SYSROOT_VERSION='20240129-253798'
+ export VSCODE_SYSROOT_VERSION='20260706'
elif [[ "${VSCODE_ARCH}" == "riscv64" ]]; then
- NODE_VERSION="22.21.1"
- VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME="vscodium/vscodium-linux-build-agent:focal-devtoolset-riscv64"
+ VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME="vscodium/vscodium-linux-build-agent:jammy-devtoolset-riscv64"
+ NODE_VERSION="24.18.0"
+ NODEJS_RELEASE_TAG="v${NODE_VERSION}-riscv64.1"
+ NODEJS_ASSET_NAME="node-v${NODE_VERSION}-linux-${VSCODE_ARCH}-local1.tar.gz"
export VSCODE_SKIP_SETUPENV=1
- export VSCODE_NODEJS_SITE='https://unofficial-builds.nodejs.org'
+ export VSCODE_NODEJS_REPOSITORY='riscv-forks/node-riscv'
+ export VSCODE_NODEJS_TAG="${NODEJS_RELEASE_TAG}"
+ export VSCODE_NODEJS_NAME="${NODEJS_ASSET_NAME}"
elif [[ "${VSCODE_ARCH}" == "loong64" ]]; then
- NODE_VERSION="22.21.1"
VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME="vscodium/vscodium-linux-build-agent:beige-devtoolset-loong64"
export VSCODE_SKIP_SETUPENV=1
@@ -160,6 +152,12 @@ node build/npm/preinstall.ts
mv .npmrc .npmrc.bak
cp ../npmrc .npmrc
+echo "+ /usr/lib/node_modules/npm/node_modules/node-gyp/addon.gypi"
+cat /usr/lib/node_modules/npm/node_modules/node-gyp/addon.gypi || true
+
+echo "+ ${HOME}/.gyp/include.gypi"
+cat "${HOME}/.gyp/include.gypi" || true
+
for i in {1..5}; do # try 5 times
npm ci && break
if [[ $i == 5 ]]; then
diff --git a/build/linux/ppc64le/electron.sh b/build/linux/ppc64le/electron.sh
index bd858988feb..1eb1e3286b8 100644
--- a/build/linux/ppc64le/electron.sh
+++ b/build/linux/ppc64le/electron.sh
@@ -2,5 +2,5 @@
set -ex
-export ELECTRON_VERSION="39.2.7"
+export ELECTRON_VERSION="41.0.3"
export VSCODE_ELECTRON_TAG="v${ELECTRON_VERSION}"
diff --git a/build/linux/ppc64le/electron.sha256sums b/build/linux/ppc64le/electron.sha256sums
index 26ebd03810a..4e7e2a0ca2e 100644
--- a/build/linux/ppc64le/electron.sha256sums
+++ b/build/linux/ppc64le/electron.sha256sums
@@ -1,10 +1,11 @@
-bacff46523cea806df9788d9e24f7f53fad2317f18afdcbc596b86863dd40805 *chromedriver-v39.2.7-linux-ppc64le.zip
-b83820b37325c0a6ce0bbb98344b54f70ef7c2a949eea61bcb423b18c623a742 *electron-v39.2.7-linux-ppc64le-debug.zip
-7d3b4ff4320a54572f9e1e0286702a0bed3e1596a2cb34f8fdc455acf3b9234f *electron-v39.2.7-linux-ppc64le-symbols.zip
-6974cf1c8a550019b04762222742b8f1d9d76387594a191d3522cd65da075db1 *electron-v39.2.7-linux-ppc64le.zip
-40c772eb189d100087b75da6c2ad1aeb044f1d661c90543592546a654b0b6d5b *electron.d.ts
-0c923001d08e474d0dcd3b747b4f9a4bfca685d755ec08de8e44556a63f9ad3a *hunspell_dictionaries.zip
-ee57f79e88f50f199a6aeb87fa45c83d1bd0f92eb72e00787cfdf4cf11863562 *libcxx-objects-v39.2.7-linux-ppc64le.zip
-a8709029737d3073758ccb384161a37d91f16e5a3f8110ca8e2c30f83ef8d7e6 *libcxx_headers.zip
-238dcec817528659a86b0cd3d7dabe301e65b4cab25e45c5bbab7642a8849c02 *libcxxabi_headers.zip
-be033ed825bd8be92bb6ca86ff81f0907e60aa999aa011f5ddf1360abb19429b *mksnapshot-v39.2.7-linux-ppc64le.zip
+120e0e5915c8f1a49904737e82bf50bc72563f8556fc3c5997c118908b377874 *chromedriver-v41.0.3-linux-ppc64le.zip
+4601e7692cac011610c245d8c58f14a73b415fccf520194f14674f81e4ce2c41 *electron-v41.0.3-linux-ppc64le-debug.zip
+498a74b78699ff9d4819310262d96e861dd7d899f38f8f625a311968b076b29b *electron-v41.0.3-linux-ppc64le-symbols.zip
+77e86aa200d9e19b5eb3a51f273ee410788c21977f2ea76b1239d79aa2e1adbf *electron-v41.0.3-linux-ppc64le.zip
+e246066ccc328729e6a9f2a0d829bc893391cf54ed199b809bb7e47993fed88f *electron.d.ts
+687a36388a7cf06427d7fa7e3db7fca4ab0118c5eab2baeac128c1989a600cff *ffmpeg-v41.0.3-linux-ppc64le.zip
+70ba677d4bea3e7164c82f6b5a36ac6b740317fb1dd149a0eaf1ff151da44cb2 *hunspell_dictionaries.zip
+3e85df4843497ce567ad36ddf826cd1af7dfe9f883daad4623736ddd012dbfd1 *libcxx-objects-v41.0.3-linux-ppc64le.zip
+5587472eeaf9bfb76d0f187ecc19d11d60bc05f5e7c8fa822f2370210c30b95d *libcxx_headers.zip
+f531ddd2782b4b19caf622c0355c93892965e22861279cc891675230c1310905 *libcxxabi_headers.zip
+6cb0e67dc5a23de0ebbe89253e1f24bf9d4ca41213a1b9f784f2afaa2cf61324 *mksnapshot-v41.0.3-linux-ppc64le.zip
\ No newline at end of file
diff --git a/build/linux/prepare_assets.sh b/build/linux/prepare_assets.sh
new file mode 100644
index 00000000000..364f956154e
--- /dev/null
+++ b/build/linux/prepare_assets.sh
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+cd vscode || { echo "'vscode' dir not found"; exit 1; }
+
+if [[ -z "${VSCODE_SYSROOT_REPOSITORY}" ]]; then
+ unset VSCODE_SYSROOT_REPOSITORY
+fi
+
+if [[ -z "${VSCODE_SYSROOT_VERSION}" ]]; then
+ unset VSCODE_SYSROOT_VERSION
+fi
+
+if [[ -z "${VSCODE_SYSROOT_PREFIX}" ]]; then
+ unset VSCODE_SYSROOT_PREFIX
+fi
+
+if [[ "${SHOULD_BUILD_APPIMAGE}" != "no" && "${VSCODE_ARCH}" != "x64" ]]; then
+ SHOULD_BUILD_APPIMAGE="no"
+fi
+
+if [[ "${SHOULD_BUILD_DEB}" != "no" || "${SHOULD_BUILD_APPIMAGE}" != "no" ]]; then
+ npm run gulp "vscode-linux-${VSCODE_ARCH}-prepare-deb"
+ npm run gulp "vscode-linux-${VSCODE_ARCH}-build-deb"
+fi
+
+if [[ "${SHOULD_BUILD_RPM}" != "no" ]]; then
+ npm run gulp "vscode-linux-${VSCODE_ARCH}-prepare-rpm"
+ npm run gulp "vscode-linux-${VSCODE_ARCH}-build-rpm"
+fi
+
+if [[ "${SHOULD_BUILD_APPIMAGE}" != "no" ]]; then
+ . ../build/linux/appimage/build.sh
+fi
+
+cd ..
+
+if [[ "${CI_BUILD}" == "no" ]]; then
+ . ./stores/snapcraft/build.sh
+
+ if [[ "${SKIP_ASSETS}" == "no" ]]; then
+ mv stores/snapcraft/build/*.snap assets/
+ fi
+fi
+
+if [[ "${SHOULD_BUILD_TAR}" != "no" ]]; then
+ echo "Building and moving TAR"
+ cd "VSCode-linux-${VSCODE_ARCH}"
+ tar czf "../assets/${APP_NAME}-linux-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" .
+ cd ..
+fi
+
+if [[ "${SHOULD_BUILD_DEB}" != "no" ]]; then
+ echo "Moving DEB"
+ mv vscode/.build/linux/deb/*/deb/*.deb assets/
+fi
+
+if [[ "${SHOULD_BUILD_RPM}" != "no" ]]; then
+ echo "Moving RPM"
+ mv vscode/.build/linux/rpm/*/*.rpm assets/
+fi
+
+if [[ "${SHOULD_BUILD_APPIMAGE}" != "no" ]]; then
+ echo "Moving AppImage"
+ mv build/linux/appimage/out/*.AppImage* assets/
+
+ find assets -name '*.AppImage*' -exec bash -c 'mv $0 ${0/_-_/-}' {} \;
+fi
diff --git a/build/linux/riscv64/electron.sh b/build/linux/riscv64/electron.sh
index 277200b1442..f456341deb2 100755
--- a/build/linux/riscv64/electron.sh
+++ b/build/linux/riscv64/electron.sh
@@ -2,5 +2,5 @@
set -ex
-export ELECTRON_VERSION="39.2.7"
+export ELECTRON_VERSION="42.3.3"
export VSCODE_ELECTRON_TAG="v${ELECTRON_VERSION}.riscv1"
diff --git a/build/linux/riscv64/electron.sha256sums b/build/linux/riscv64/electron.sha256sums
index 5c501df38b4..64beebca56c 100644
--- a/build/linux/riscv64/electron.sha256sums
+++ b/build/linux/riscv64/electron.sha256sums
@@ -1,11 +1,11 @@
-6759ef2bd69a2e31a3f0e17c4e4c0bf239b54f08525572201ae7760851168487 *chromedriver-v39.2.7-linux-riscv64.zip
-89562e30982d8ac71fbc1e0f549a4a6e19abd5cb98ea904d5f3cfceb7c61e582 *electron-v39.2.7-linux-riscv64-debug.tar.zst
-71c6f265a2ef065f478ef910a06466a21009c02783dcb7053767549a6dbeb80d *electron-v39.2.7-linux-riscv64-symbols.tar.zst
-136804dbd04f1c6b9a6047c4e7bb648876214ff453b62fb3bdc81505b6f5aab2 *electron-v39.2.7-linux-riscv64.zip
-1059d6cb97b87464b3bd415bb5f96fceaf91d6e3af1c9733724ab9f2e14e2a08 *ffmpeg-v39.2.7-linux-riscv64.zip
-224a84d4aaceb5ed8be3c4f65f8404d492dc86ded8ab336c2562dfdd21752068 *hunspell-dictionaries.zip
-b6cb4f8902aad5de811efd106ddbdbca79e43cb7c8fa67f7eeddaedf2efd82d5 *libcxx-headers.zip
-0664e200ec1eab1ce1957bc6e17ad89f6c0d4d904a9492d64fcf4175cd81e537 *libcxx-objects-v39.2.7-linux-riscv64.zip
-96f9b66be7ff11e79ec2e781a0025938eb5ef97cbab429c05e9b45d24d421abf *libcxxabi-headers.zip
-be0774857454f81b9407f6b941200f8843a0b3ecb86e2bb072209ef9f9bfe74a *mksnapshot-v39.2.7-linux-riscv64.zip
-a8fca541e8f9a18de73c78f6862cbf439723c80c5eb60fe50405dfb751d2ee13 *node-v39.2.7-headers.tar.gz
+2b0b61329886cf355a86126b4cac7869104340b530034c67c2572dc6ea41d6f1 *chromedriver-v42.3.3-linux-riscv64.zip
+b27d12271f03df5591a3cc36e2242976bccc6ff8e8a5ec6ba19b3c64fca593c2 *electron-v42.3.3-linux-riscv64-debug.tar.zst
+c171fa2342d1c5ca2ac827214ed9d9f075195a6f84122c69e2096820c89ea435 *electron-v42.3.3-linux-riscv64-symbols.tar.zst
+f0d07addb8094aa216c9e1f75abce4eef53b6274c544e16abb1454ee613fdab8 *electron-v42.3.3-linux-riscv64.zip
+a5f12bf3e256b1cee3288847d0ddfde2736dbff57a7b9cdce3e13944735cdbfc *ffmpeg-v42.3.3-linux-riscv64.zip
+bad30deb9d83f85af01bde7745165827e8849366ec4f763929025f461f185372 *hunspell-dictionaries.zip
+be9ebc3052cb8069321364839f06a793d8e27e04495ba3fef9531f90aa6a577d *libcxx-headers.zip
+c7c7cc05068261600503eb0a4897b985fe3a0b3ad59853f2400134e6715e3872 *libcxx-objects-v42.3.3-linux-riscv64.zip
+f17024e72c182f76e75cdfabf524c0044aebccc018d162729c940d4c2657e14a *libcxxabi-headers.zip
+53974b8ca250c32a032cc0e2603ae179b86564d4f0f23c6d4a2b6eeac64da3e4 *mksnapshot-v42.3.3-linux-riscv64.zip
+46545ab9ca90deb710e8811dee9cf4022c811d520d1a702cf36f6958d91aa119 *node-v42.3.3-headers.tar.gz
diff --git a/build/linux/riscv64/ripgrep.sh b/build/linux/riscv64/ripgrep.sh
index 67e0d005302..e7f6385a8e2 100755
--- a/build/linux/riscv64/ripgrep.sh
+++ b/build/linux/riscv64/ripgrep.sh
@@ -8,11 +8,16 @@ if [ "$#" -ne 1 ]; then
exit 1
fi
-RG_PATH="$1/@vscode/ripgrep/bin/rg"
+RG_PATH="$1/@vscode/ripgrep-universal/bin/linux-riscv64/rg"
RG_VERSION="14.1.1-4"
echo "Replacing ripgrep binary with riscv64 one"
-rm "${RG_PATH}"
+if [ -f "${RG_PATH}" ]; then
+ rm "${RG_PATH}"
+else
+ mkdir -p "$(dirname "${RG_PATH}")"
+fi
+
curl --silent --fail -L https://github.com/riscv-forks/ripgrep-riscv64-prebuilt/releases/download/${RG_VERSION}/rg -o "${RG_PATH}"
chmod +x "${RG_PATH}"
diff --git a/build/osx/check_tags.sh b/build/osx/check_tags.sh
new file mode 100644
index 00000000000..33be9f683d3
--- /dev/null
+++ b/build/osx/check_tags.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+
+if [[ -z $( contains "${APP_NAME}-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ) ]]; then
+ echo "Building on MacOS because we have no ZIP"
+ export SHOULD_BUILD="yes"
+else
+ export SHOULD_BUILD_ZIP="no"
+fi
+
+if [[ -z $( contains ".${VSCODE_ARCH}.${RELEASE_VERSION}.dmg" ) ]]; then
+ echo "Building on MacOS because we have no DMG"
+ export SHOULD_BUILD="yes"
+else
+ export SHOULD_BUILD_DMG="no"
+fi
+
+if [[ -z $( contains "${APP_NAME_LC}-reh-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on MacOS because we have no REH archive"
+ export SHOULD_BUILD="yes"
+else
+ export SHOULD_BUILD_REH="no"
+fi
+
+if [[ -z $( contains "${APP_NAME_LC}-reh-web-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on MacOS because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+else
+ export SHOULD_BUILD_REH_WEB="no"
+fi
+
+if [[ -z $( contains "${APP_NAME_LC}-cli-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on MacOS because we have no CLI archive"
+ export SHOULD_BUILD="yes"
+else
+ export SHOULD_BUILD_CLI="no"
+fi
+
+if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the MacOS builds"
+fi
diff --git a/build/osx/prepare_assets.sh b/build/osx/prepare_assets.sh
new file mode 100644
index 00000000000..c1b03e41507
--- /dev/null
+++ b/build/osx/prepare_assets.sh
@@ -0,0 +1,84 @@
+#!/usr/bin/env bash
+
+if [[ -n "${CERTIFICATE_OSX_P12_DATA}" ]]; then
+ if [[ "${CI_BUILD}" == "no" ]]; then
+ RUNNER_TEMP="${TMPDIR}"
+ fi
+
+ CERTIFICATE_P12="${APP_NAME}.p12"
+ KEYCHAIN="${RUNNER_TEMP}/buildagent.keychain"
+ AGENT_TEMPDIRECTORY="${RUNNER_TEMP}"
+ # shellcheck disable=SC2006
+ KEYCHAINS=`security list-keychains | xargs`
+
+ rm -f "${KEYCHAIN}"
+
+ echo "${CERTIFICATE_OSX_P12_DATA}" | base64 --decode > "${CERTIFICATE_P12}"
+
+ echo "+ create temporary keychain"
+ security create-keychain -p pwd "${KEYCHAIN}"
+ security set-keychain-settings -lut 21600 "${KEYCHAIN}"
+ security unlock-keychain -p pwd "${KEYCHAIN}"
+ # shellcheck disable=SC2086
+ security list-keychains -s $KEYCHAINS "${KEYCHAIN}"
+ # security show-keychain-info "${KEYCHAIN}"
+
+ echo "+ import certificate to keychain"
+ security import "${CERTIFICATE_P12}" -k "${KEYCHAIN}" -P "${CERTIFICATE_OSX_P12_PASSWORD}" -T /usr/bin/codesign
+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k pwd "${KEYCHAIN}" > /dev/null
+ # security find-identity "${KEYCHAIN}"
+
+ CODESIGN_IDENTITY="$( security find-identity -v -p codesigning "${KEYCHAIN}" | grep -oEi "([0-9A-F]{40})" | head -n 1 )"
+
+ echo "+ signing"
+ export CODESIGN_IDENTITY AGENT_TEMPDIRECTORY
+
+ DEBUG="electron-osx-sign*" node vscode/build/darwin/sign.ts "$( pwd )"
+ # codesign --display --entitlements :- ""
+
+ echo "+ notarize"
+
+ cd "VSCode-darwin-${VSCODE_ARCH}"
+ ZIP_FILE="./${APP_NAME}-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.zip"
+
+ zip -r -X -y "${ZIP_FILE}" ./*.app
+
+ xcrun notarytool store-credentials "${APP_NAME}" --apple-id "${CERTIFICATE_OSX_APPLE_ID}" --team-id "${CERTIFICATE_OSX_TEAM_ID}" --password "${CERTIFICATE_OSX_APP_PASSWORD}" --keychain "${KEYCHAIN}"
+ # xcrun notarytool history --keychain-profile "${APP_NAME}" --keychain "${KEYCHAIN}"
+ xcrun notarytool submit "${ZIP_FILE}" --keychain-profile "${APP_NAME}" --wait --keychain "${KEYCHAIN}"
+
+ echo "+ attach staple"
+ xcrun stapler staple ./*.app
+ # spctl --assess -vv --type install ./*.app
+
+ rm "${ZIP_FILE}"
+
+ cd ..
+fi
+
+if [[ "${SHOULD_BUILD_ZIP}" != "no" ]]; then
+ echo "Building and moving ZIP"
+ cd "VSCode-darwin-${VSCODE_ARCH}"
+ zip -r -X -y "../assets/${APP_NAME}-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ./*.app
+ cd ..
+fi
+
+if [[ -n "${CERTIFICATE_OSX_P12_DATA}" && "${SHOULD_BUILD_DMG}" != "no" ]]; then
+ echo "Building and moving DMG"
+ pushd "VSCode-darwin-${VSCODE_ARCH}"
+ npx create-dmg ./*.app .
+ mv ./*.dmg "../assets/${APP_NAME}.${VSCODE_ARCH}.${RELEASE_VERSION}.dmg"
+ popd
+fi
+
+if [[ "${SHOULD_BUILD_SRC}" == "yes" ]]; then
+ git archive --format tar.gz --output="./assets/${APP_NAME}-${RELEASE_VERSION}-src.tar.gz" HEAD
+ git archive --format zip --output="./assets/${APP_NAME}-${RELEASE_VERSION}-src.zip" HEAD
+fi
+
+if [[ -n "${CERTIFICATE_OSX_P12_DATA}" ]]; then
+ echo "+ clean"
+ security delete-keychain "${KEYCHAIN}"
+ # shellcheck disable=SC2086
+ security list-keychains -s $KEYCHAINS
+fi
diff --git a/build/windows/appx/build.sh b/build/windows/appx/build.sh
index 1cd450f3742..19a75156f89 100755
--- a/build/windows/appx/build.sh
+++ b/build/windows/appx/build.sh
@@ -8,7 +8,7 @@ export PATH="${SDK}:${PATH}"
APPX_NAME="${BINARY_NAME//-/_}"
-makeappx pack /d "../../../VSCode-win32-${VSCODE_ARCH}/appx/manifest" /p "../../../VSCode-win32-${VSCODE_ARCH}/appx/${APPX_NAME}_${VSCODE_ARCH}.appx" /nv
+powershell "makeappx pack /d ..\\VSCode-win32-${VSCODE_ARCH}\\appx\\manifest /p ..\\VSCode-win32-${VSCODE_ARCH}\\appx\\${APPX_NAME}_${VSCODE_ARCH}.appx /nv"
# Remove the raw manifest folder
-rm -rf "../../../VSCode-win32-${VSCODE_ARCH}/appx/manifest"
+rm -rf "../VSCode-win32-${VSCODE_ARCH}/appx/manifest"
diff --git a/build/windows/check_tags.sh b/build/windows/check_tags.sh
new file mode 100644
index 00000000000..0f8b5c97c93
--- /dev/null
+++ b/build/windows/check_tags.sh
@@ -0,0 +1,105 @@
+#!/usr/bin/env bash
+
+# windows-arm64
+if [[ "${VSCODE_ARCH}" == "arm64" ]]; then
+ if [[ -z $( contains "${APP_NAME}Setup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
+ echo "Building on Windows arm64 because we have no system setup"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_EXE_SYS="no"
+ fi
+
+ if [[ -z $( contains "UserSetup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
+ echo "Building on Windows arm64 because we have no user setup"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_EXE_USR="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME}-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ) ]]; then
+ echo "Building on Windows arm64 because we have no zip"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_ZIP="no"
+ fi
+
+ export SHOULD_BUILD_REH="no"
+ export SHOULD_BUILD_REH_WEB="no"
+
+ if [[ -z $( contains "${APP_NAME_LC}-cli-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Windows arm64 because we have no CLI archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_CLI="no"
+ fi
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Windows arm64 builds"
+ fi
+
+# windows-x64
+else
+ if [[ -z $( contains "${APP_NAME}Setup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
+ echo "Building on Windows x64 because we have no system setup"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_EXE_SYS="no"
+ fi
+
+ if [[ -z $( contains "UserSetup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
+ echo "Building on Windows x64 because we have no user setup"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_EXE_USR="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME}-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ) ]]; then
+ echo "Building on Windows x64 because we have no zip"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_ZIP="no"
+ fi
+
+ if [[ "${DISABLE_MSI}" == "yes" ]]; then
+ export SHOULD_BUILD_MSI="no"
+ elif [[ -z $( contains "${APP_NAME}-${VSCODE_ARCH}-${RELEASE_VERSION}.msi" ) ]]; then
+ echo "Building on Windows x64 because we have no msi"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_MSI="no"
+ fi
+
+ if [[ "${DISABLE_MSI}" == "yes" ]]; then
+ export SHOULD_BUILD_MSI_NOUP="no"
+ elif [[ -z $( contains "${APP_NAME}-${VSCODE_ARCH}-updates-disabled-${RELEASE_VERSION}.msi" ) ]]; then
+ echo "Building on Windows x64 because we have no updates-disabled msi"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_MSI_NOUP="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-reh-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Windows x64 because we have no REH archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-reh-web-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Windows x64 because we have no REH-web archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_REH_WEB="no"
+ fi
+
+ if [[ -z $( contains "${APP_NAME_LC}-cli-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
+ echo "Building on Windows x64 because we have no CLI archive"
+ export SHOULD_BUILD="yes"
+ else
+ export SHOULD_BUILD_CLI="no"
+ fi
+
+ if [[ "${SHOULD_BUILD}" != "yes" ]]; then
+ echo "Already have all the Windows x64 builds"
+ fi
+fi
diff --git a/build/windows/package.sh b/build/windows/package.sh
index 4afa57f8518..560c132c7b0 100755
--- a/build/windows/package.sh
+++ b/build/windows/package.sh
@@ -31,7 +31,9 @@ find .build/extensions -type f -name '*.node' -print -delete
npm run copy-policy-dto --prefix build
node build/lib/policies/policyGenerator.ts build/lib/policies/policyData.jsonc win32
-npm run gulp "vscode-win32-${VSCODE_ARCH}-min-ci"
+# node build/win32/explorer-dll-fetcher.ts .build/win32/appx
+
+npm run gulp "vscode-win32-${VSCODE_ARCH}-min-packing"
. ../build_cli.sh
diff --git a/build/windows/prepare_assets.sh b/build/windows/prepare_assets.sh
new file mode 100644
index 00000000000..82ee0308bb5
--- /dev/null
+++ b/build/windows/prepare_assets.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+
+cd vscode || { echo "'vscode' dir not found"; exit 1; }
+
+npm run gulp "vscode-win32-${VSCODE_ARCH}-inno-updater"
+
+# . ../build/windows/appx/build.sh
+
+if [[ "${SHOULD_BUILD_ZIP}" != "no" ]]; then
+ 7z.exe a -tzip "../assets/${APP_NAME}-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" -x!CodeSignSummary*.md -x!tools "../VSCode-win32-${VSCODE_ARCH}/*" -r
+fi
+
+if [[ "${SHOULD_BUILD_EXE_SYS}" != "no" ]]; then
+ npm run gulp "vscode-win32-${VSCODE_ARCH}-system-setup"
+fi
+
+if [[ "${SHOULD_BUILD_EXE_USR}" != "no" ]]; then
+ npm run gulp "vscode-win32-${VSCODE_ARCH}-user-setup"
+fi
+
+if [[ "${VSCODE_ARCH}" == "ia32" || "${VSCODE_ARCH}" == "x64" ]]; then
+ if [[ "${SHOULD_BUILD_MSI}" != "no" ]]; then
+ . ../build/windows/msi/build.sh
+ fi
+
+ if [[ "${SHOULD_BUILD_MSI_NOUP}" != "no" ]]; then
+ . ../build/windows/msi/build-updates-disabled.sh
+ fi
+fi
+
+cd ..
+
+if [[ "${SHOULD_BUILD_EXE_SYS}" != "no" ]]; then
+ echo "Moving System EXE"
+ mv "vscode\\.build\\win32-${VSCODE_ARCH}\\system-setup\\VSCodeSetup.exe" "assets\\${APP_NAME}Setup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe"
+fi
+
+if [[ "${SHOULD_BUILD_EXE_USR}" != "no" ]]; then
+ echo "Moving User EXE"
+ mv "vscode\\.build\\win32-${VSCODE_ARCH}\\user-setup\\VSCodeSetup.exe" "assets\\${APP_NAME}UserSetup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe"
+fi
+
+if [[ "${VSCODE_ARCH}" == "ia32" || "${VSCODE_ARCH}" == "x64" ]]; then
+ if [[ "${SHOULD_BUILD_MSI}" != "no" ]]; then
+ echo "Moving MSI"
+ mv "build\\windows\\msi\\releasedir\\${APP_NAME}-${VSCODE_ARCH}-${RELEASE_VERSION}.msi" assets/
+ fi
+
+ if [[ "${SHOULD_BUILD_MSI_NOUP}" != "no" ]]; then
+ echo "Moving MSI with disabled updates"
+ mv "build\\windows\\msi\\releasedir\\${APP_NAME}-${VSCODE_ARCH}-updates-disabled-${RELEASE_VERSION}.msi" assets/
+ fi
+fi
diff --git a/build_cli.sh b/build_cli.sh
index a2af2d47fff..1d84559ba68 100755
--- a/build_cli.sh
+++ b/build_cli.sh
@@ -1,5 +1,10 @@
#!/usr/bin/env bash
+if [[ "${SHOULD_BUILD_CLI}" == "no" ]]; then
+ echo "Skipping CLI build"
+ return 0
+fi
+
set -ex
cd cli
@@ -69,18 +74,21 @@ else
export CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
export PKG_CONFIG_ALLOW_CROSS=1
fi
- elif [[ "${VSCODE_ARCH}" == "armhf" ]]; then
- VSCODE_CLI_TARGET="armv7-unknown-linux-gnueabihf"
-
- export OPENSSL_LIB_DIR="$( pwd )/openssl/out/arm-linux/lib"
- export OPENSSL_INCLUDE_DIR="$( pwd )/openssl/out/arm-linux/include"
-
- if [[ "${CI_BUILD}" != "no" ]]; then
- export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
- export CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
- export CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++
+ elif [[ "${VSCODE_ARCH}" == "ppc64le" ]]; then
+ VSCODE_CLI_TARGET="powerpc64le-unknown-linux-gnu"
+
+ # Use system libs instead of @vscode/openssl-prebuilt
+ mkdir -p openssl/out/ppc64le-linux/
+ ln -sf /usr/lib/powerpc64le-linux-gnu openssl/out/ppc64le-linux/lib
+ ln -sf /usr/include openssl/out/ppc64le-linux/include
+
+ if [[ "${CI_BUILD}" != "no" ]] && [[ "$(uname -m)" != "ppc64le" ]]; then
+ export CARGO_TARGET_POWERPC64LE_UNKNOWN_LINUX_GNU_LINKER=powerpc64le-linux-gnu-gcc-10
+ export CC_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-gcc-10
+ export CXX_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-g++-10
export PKG_CONFIG_ALLOW_CROSS=1
fi
+
elif [[ "${VSCODE_ARCH}" == "x64" ]]; then
VSCODE_CLI_TARGET="x86_64-unknown-linux-gnu"
fi
diff --git a/check_tags.sh b/check_tags.sh
index e8b8ccc94de..053bb5f6418 100755
--- a/check_tags.sh
+++ b/check_tags.sh
@@ -83,546 +83,23 @@ elif [[ "${ASSETS}" != "null" ]]; then
fi
# macos
elif [[ "${OS_NAME}" == "osx" ]]; then
- if [[ -z $( contains "${APP_NAME}-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ) ]]; then
- echo "Building on MacOS because we have no ZIP"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_ZIP="no"
- fi
-
- if [[ -z $( contains ".${VSCODE_ARCH}.${RELEASE_VERSION}.dmg" ) ]]; then
- echo "Building on MacOS because we have no DMG"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_DMG="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on MacOS because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-web-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on MacOS because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-cli-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on MacOS because we have no CLI archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_CLI="no"
- fi
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the MacOS builds"
- fi
+ . ./build/osx/check_tags.sh
elif [[ "${OS_NAME}" == "windows" ]]; then
-
- # windows-arm64
- if [[ "${VSCODE_ARCH}" == "arm64" ]]; then
- if [[ -z $( contains "${APP_NAME}Setup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
- echo "Building on Windows arm64 because we have no system setup"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_EXE_SYS="no"
- fi
-
- if [[ -z $( contains "UserSetup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
- echo "Building on Windows arm64 because we have no user setup"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_EXE_USR="no"
- fi
-
- if [[ -z $( contains "${APP_NAME}-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ) ]]; then
- echo "Building on Windows arm64 because we have no zip"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_ZIP="no"
- fi
-
- export SHOULD_BUILD_REH="no"
- export SHOULD_BUILD_REH_WEB="no"
-
- if [[ -z $( contains "${APP_NAME_LC}-cli-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Windows arm64 because we have no CLI archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_CLI="no"
- fi
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Windows arm64 builds"
- fi
-
- # windows-x64
- else
- if [[ -z $( contains "${APP_NAME}Setup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
- echo "Building on Windows x64 because we have no system setup"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_EXE_SYS="no"
- fi
-
- if [[ -z $( contains "UserSetup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe" ) ]]; then
- echo "Building on Windows x64 because we have no user setup"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_EXE_USR="no"
- fi
-
- if [[ -z $( contains "${APP_NAME}-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ) ]]; then
- echo "Building on Windows x64 because we have no zip"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_ZIP="no"
- fi
-
- if [[ "${DISABLE_MSI}" == "yes" ]]; then
- export SHOULD_BUILD_MSI="no"
- elif [[ -z $( contains "${APP_NAME}-${VSCODE_ARCH}-${RELEASE_VERSION}.msi" ) ]]; then
- echo "Building on Windows x64 because we have no msi"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_MSI="no"
- fi
-
- if [[ "${DISABLE_MSI}" == "yes" ]]; then
- export SHOULD_BUILD_MSI_NOUP="no"
- elif [[ -z $( contains "${APP_NAME}-${VSCODE_ARCH}-updates-disabled-${RELEASE_VERSION}.msi" ) ]]; then
- echo "Building on Windows x64 because we have no updates-disabled msi"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_MSI_NOUP="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Windows x64 because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-web-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Windows x64 because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-cli-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Windows x64 because we have no CLI archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_CLI="no"
- fi
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Windows x64 builds"
- fi
- fi
+ . ./build/windows/check_tags.sh
else
if [[ "${OS_NAME}" == "linux" ]]; then
- if [[ "${CHECK_ONLY_REH}" == "yes" ]]; then
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-linux-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux ${VSCODE_ARCH} because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- echo "Already have the Linux REH ${VSCODE_ARCH} archive"
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-web-linux-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux ${VSCODE_ARCH} because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- echo "Already have the Linux REH-web ${VSCODE_ARCH} archive"
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- else
-
- # linux-arm64
- if [[ "${VSCODE_ARCH}" == "arm64" || "${CHECK_ALL}" == "yes" ]]; then
- if [[ -z $( contains "arm64.deb" ) ]]; then
- echo "Building on Linux arm64 because we have no DEB"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_DEB="no"
- fi
-
- if [[ -z $( contains "aarch64.rpm" ) ]]; then
- echo "Building on Linux arm64 because we have no RPM"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_RPM="no"
- fi
-
- if [[ -z $( contains "${APP_NAME}-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm64 because we have no TAR"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_TAR="no"
- fi
-
- if [[ -z $( contains "arm64.snap" ) || "${FORCE_LINUX_SNAP}" == "true" ]]; then
- echo "Building on Linux arm64 because we have no SNAP"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_SNAP="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm64 because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm64 because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- export SHOULD_BUILD_APPIMAGE="no"
-
- if [[ -z $( contains "${APP_NAME_LC}-cli-linux-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm64 because we have no CLI archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_CLI="no"
- fi
-
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Linux arm64 builds"
- fi
- fi
-
- # linux-armhf
- if [[ "${VSCODE_ARCH}" == "armhf" || "${CHECK_ALL}" == "yes" ]]; then
- if [[ -z $( contains "armhf.deb" ) ]]; then
- echo "Building on Linux arm because we have no DEB"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_DEB="no"
- fi
-
- if [[ -z $( contains "armv7hl.rpm" ) ]]; then
- echo "Building on Linux arm because we have no RPM"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_RPM="no"
- fi
-
- if [[ -z $( contains "${APP_NAME}-linux-armhf-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm because we have no TAR"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_TAR="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-armhf-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-armhf-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- export SHOULD_BUILD_APPIMAGE="no"
-
- if [[ -z $( contains "${APP_NAME_LC}-cli-linux-armhf-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux arm because we have no CLI archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_CLI="no"
- fi
-
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Linux arm builds"
- fi
- fi
-
- # linux-ppc64le
- if [[ "${VSCODE_ARCH}" == "ppc64le" || "${CHECK_ALL}" == "yes" ]]; then
- export SHOULD_BUILD_APPIMAGE="no"
- export SHOULD_BUILD_DEB="no"
- export SHOULD_BUILD_RPM="no"
-
- if [[ -z $( contains "${APP_NAME}-linux-ppc64le-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux PowerPC64LE because we have no TAR"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_TAR="no"
- fi
-
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-ppc64le-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux PowerPC64LE because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-ppc64le-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux PowerPC64LE because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- export SHOULD_BUILD_CLI="no"
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Linux PowerPC64LE builds"
- fi
- fi
-
- # linux-riscv64
- if [[ "${VSCODE_ARCH}" == "riscv64" || "${CHECK_ALL}" == "yes" ]]; then
- export SHOULD_BUILD_DEB="no"
- export SHOULD_BUILD_RPM="no"
- export SHOULD_BUILD_APPIMAGE="no"
-
- if [[ -z $( contains "${APP_NAME}-linux-riscv64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux RISC-V 64 because we have no TAR"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_TAR="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-riscv64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux RISC-V 64 because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-riscv64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux RISC-V 64 because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- export SHOULD_BUILD_CLI="no"
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Linux riscv64 builds"
- fi
- fi
-
- # linux-loong64
- if [[ "${VSCODE_ARCH}" == "loong64" || "${CHECK_ALL}" == "yes" ]]; then
- export SHOULD_BUILD_DEB="no"
- export SHOULD_BUILD_RPM="no"
- export SHOULD_BUILD_APPIMAGE="no"
-
- if [[ -z $( contains "${APP_NAME}-linux-loong64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux Loong64 because we have no TAR"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_TAR="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-loong64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux Loong64 because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-loong64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux Loong64 because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- export SHOULD_BUILD_CLI="no"
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Linux Loong64 builds"
- fi
- fi
-
- # linux-s390x
- if [[ "${VSCODE_ARCH}" == "s390x" || "${CHECK_ALL}" == "yes" ]]; then
- SHOULD_BUILD_APPIMAGE="no"
- SHOULD_BUILD_DEB="no"
- SHOULD_BUILD_RPM="no"
- SHOULD_BUILD_TAR="no"
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-linux-s390x-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux s390x because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-web-linux-s390x-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux s390x because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- export SHOULD_BUILD_CLI="no"
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Linux s390x builds"
- fi
- fi
-
- # linux-x64
- if [[ "${VSCODE_ARCH}" == "x64" || "${CHECK_ALL}" == "yes" ]]; then
- if [[ -z $( contains "amd64.deb" ) ]]; then
- echo "Building on Linux x64 because we have no DEB"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_DEB="no"
- fi
-
- if [[ -z $( contains "x86_64.rpm" ) ]]; then
- echo "Building on Linux x64 because we have no RPM"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_RPM="no"
- fi
-
- if [[ -z $( contains "${APP_NAME}-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux x64 because we have no TAR"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_TAR="no"
- fi
-
- if [[ "${DISABLE_APPIMAGE}" == "yes" ]]; then
- export SHOULD_BUILD_APPIMAGE="no"
- elif [[ -z $( contains "x86_64.AppImage" ) ]]; then
- echo "Building on Linux x64 because we have no AppImage"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_APPIMAGE="no"
- fi
-
- if [[ -z $( contains "amd64.snap" ) || "${FORCE_LINUX_SNAP}" == "true" ]]; then
- echo "Building on Linux x64 because we have no SNAP"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_SNAP="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux x64 because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux x64 because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-cli-linux-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Linux x64 because we have no CLI archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_CLI="no"
- fi
-
- if [[ "${SHOULD_BUILD}" != "yes" ]]; then
- echo "Already have all the Linux x64 builds"
- fi
- fi
- fi
+ . ./build/linux/check_tags.sh
fi
if [[ "${OS_NAME}" == "alpine" ]] || [[ "${OS_NAME}" == "linux" && "${CHECK_ALL}" == "yes" ]]; then
-
- if [[ "${CHECK_ONLY_REH}" == "yes" ]]; then
- if [[ -z $( contains "${APP_NAME_LC}-reh-alpine-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Alpine ${VSCODE_ARCH} because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- echo "Already have the Alpine REH ${VSCODE_ARCH} archive"
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ -z $( contains "${APP_NAME_LC}-reh-web-alpine-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Alpine ${VSCODE_ARCH} because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- echo "Already have the Alpine REH-web ${VSCODE_ARCH} archive"
- export SHOULD_BUILD_REH_WEB="no"
- fi
- else
-
- # alpine-arm64
- if [[ "${VSCODE_ARCH}" == "arm64" || "${CHECK_ALL}" == "yes" ]]; then
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-alpine-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Alpine arm64 because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-alpine-arm64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Alpine arm64 because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
- fi
-
- # alpine-x64
- if [[ "${VSCODE_ARCH}" == "x64" || "${CHECK_ALL}" == "yes" ]]; then
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-alpine-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Alpine x64 because we have no REH archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH="no"
- fi
-
- if [[ "${CHECK_REH}" != "no" && -z $( contains "${APP_NAME_LC}-reh-web-alpine-x64-${RELEASE_VERSION}.tar.gz" ) ]]; then
- echo "Building on Alpine x64 because we have no REH-web archive"
- export SHOULD_BUILD="yes"
- else
- export SHOULD_BUILD_REH_WEB="no"
- fi
- fi
- fi
+ . ./build/alpine/check_tags.sh
fi
fi
else
if [[ "${IS_SPEARHEAD}" == "yes" ]]; then
export SHOULD_BUILD_SRC="yes"
elif [[ "${OS_NAME}" == "linux" ]]; then
- if [[ "${VSCODE_ARCH}" == "ppc64le" ]]; then
- SHOULD_BUILD_DEB="no"
- SHOULD_BUILD_RPM="no"
- SHOULD_BUILD_TAR="no"
- SHOULD_BUILD_CLI="no"
- elif [[ "${VSCODE_ARCH}" == "riscv64" ]]; then
+ if [[ "${VSCODE_ARCH}" == "riscv64" ]]; then
SHOULD_BUILD_DEB="no"
SHOULD_BUILD_RPM="no"
SHOULD_BUILD_CLI="no"
diff --git a/dev/build.sh b/dev/build.sh
index 4efd2963235..2fa271b2fa9 100755
--- a/dev/build.sh
+++ b/dev/build.sh
@@ -155,7 +155,7 @@ if [[ "${SKIP_ASSETS}" == "no" ]]; then
if [[ "${OS_NAME}" == "osx" && -f "dev/osx/codesign.env" ]]; then
. dev/osx/macos-codesign.env
- echo "CERTIFICATE_OSX_ID: ${CERTIFICATE_OSX_ID}"
+ echo "CERTIFICATE_OSX_APPLE_ID: ${CERTIFICATE_OSX_APPLE_ID}"
fi
. prepare_assets.sh
diff --git a/dev/osx/codesign.env.template b/dev/osx/codesign.env.template
index 43b6c907a0f..cb9a09a3a1c 100644
--- a/dev/osx/codesign.env.template
+++ b/dev/osx/codesign.env.template
@@ -1,5 +1,5 @@
CERTIFICATE_OSX_APP_PASSWORD=
-CERTIFICATE_OSX_ID=
+CERTIFICATE_OSX_APPLE_ID=
CERTIFICATE_OSX_P12_DATA=
CERTIFICATE_OSX_P12_PASSWORD=
CERTIFICATE_OSX_TEAM_ID=
diff --git a/dev/patch.sh b/dev/patch.sh
index 63d5bf5f3e7..4eb708b1eb4 100755
--- a/dev/patch.sh
+++ b/dev/patch.sh
@@ -18,6 +18,9 @@ normalize_file() {
cd vscode || { echo "'vscode' dir not found"; exit 1; }
+# include common functions
+. ../utils.sh
+
git add .
git reset -q --hard HEAD
@@ -30,19 +33,93 @@ normalize_file "${1}"
if [[ "${FILE}" != "../patches/helper/settings.patch" ]]; then
git apply --reject "../patches/helper/settings.patch"
- while [ $# -gt 1 ]; do
- echo "Parameter: $1"
+ if [[ $# -gt 1 ]]; then
+ while [ $# -gt 1 ]; do
+ echo "Parameter: $1"
+ normalize_file "${1}"
+
+ git apply --reject "${FILE}"
+
+ shift
+ done
+
+ git add .
+ git commit --no-verify -q -m "VSCODIUM HELPER"
+
normalize_file "${1}"
+ else
+ normalize_file "${1}"
+
+ BASENAME=$(basename "${FILE}")
+ DIRNAME=$(dirname "${FILE}")
+ echo $FILE
+ echo $BASENAME
+ echo $DIRNAME
+
+ if [[ "${BASENAME}" =~ ^([0-9])([1-9])(-.*)\.patch$ ]]; then
+ GROUP_ID="${BASH_REMATCH[1]}"
+ INDEX="${BASH_REMATCH[2]}"
+ ENDNAME="${BASH_REMATCH[3]}"
+
+ for ((I = 0; I < INDEX; I++)); do
+ NOT_FOUND=1
+
+ for CANDIDATE in "${DIRNAME}/${GROUP_ID}${I}-"*.patch; do
+ if [[ -f "$CANDIDATE" ]]; then
+ echo "Candidate: ${CANDIDATE}"
+ normalize_file "${CANDIDATE}"
- git apply --reject "${FILE}"
+ git apply --reject "${FILE}"
- shift
- done
+ NOT_FOUND=0
+ fi
+ done
- git add .
- git commit --no-verify -q -m "VSCODIUM HELPER"
+ if (( $NOT_FOUND )); then
+ for CANDIDATE in "${DIRNAME}/${GROUP_ID}${I}-"*.json; do
+ if [[ -f "$CANDIDATE" ]]; then
+ echo "Candidate: ${CANDIDATE}"
- normalize_file "${1}"
+ apply_actions "${CANDIDATE}"
+
+ NOT_FOUND=0
+ fi
+ done
+ fi
+
+ if (( $NOT_FOUND )); then
+ for CANDIDATE in "${DIRNAME}/../${GROUP_ID}${I}-"*.patch; do
+ if [[ -f "$CANDIDATE" ]]; then
+ echo "Candidate: ${CANDIDATE}"
+ normalize_file "${CANDIDATE}"
+
+ git apply --reject "${FILE}"
+
+ NOT_FOUND=0
+ fi
+ done
+
+ if (( $NOT_FOUND )); then
+ for CANDIDATE in "${DIRNAME}/../../${GROUP_ID}${I}-"*.patch; do
+ if [[ -f "$CANDIDATE" ]]; then
+ echo "Candidate: ${CANDIDATE}"
+ normalize_file "${CANDIDATE}"
+
+ git apply --reject "${FILE}"
+
+ NOT_FOUND=0
+ fi
+ done
+ fi
+ fi
+ done
+ fi
+
+ git add .
+ git commit --no-verify -q -m "VSCODIUM HELPER"
+
+ normalize_file "${1}"
+ fi
fi
echo "FILE: ${FILE}"
diff --git a/dev/update_patches.sh b/dev/update_patches.sh
index 8fcbf8e5cf5..5a559ed4013 100755
--- a/dev/update_patches.sh
+++ b/dev/update_patches.sh
@@ -119,6 +119,7 @@ check_file() {
fi
while [[ -n "$( find . -name '*.rej' -print )" ]]; do
+ echo "patch: ${1}"
find . -name '*.rej' -print
read -rp "Press any key when the conflict have been resolved..." -n1 -s
echo
@@ -136,6 +137,9 @@ check_file() {
cd vscode || { echo "'vscode' dir not found"; exit 1; }
+# include common functions
+. ../utils.sh
+
git add .
git reset -q --hard HEAD
@@ -144,8 +148,37 @@ while [[ -n "$( git log -1 | grep "VSCODIUM HELPER" )" ]]; do
done
for FILE in ../patches/*.patch; do
- if [[ "${FILE}" == *"/fix-policies.patch" ]]; then
- check_file "../patches/fix-keymap.patch" "../patches/fix-policies.patch"
+ ADDITIONAL_FILES=()
+ BASENAME=$(basename "${FILE}")
+ DIRNAME=$(dirname "${FILE}")
+
+ if [[ "${BASENAME}" =~ ^([0-9])([1-9])(-.*)\.patch$ ]]; then
+ GROUP_ID="${BASH_REMATCH[1]}"
+ INDEX="${BASH_REMATCH[2]}"
+ ENDNAME="${BASH_REMATCH[3]}"
+
+ for ((I = 0; I < INDEX; I++)); do
+ NOT_FOUND=1
+
+ for CANDIDATE in "${DIRNAME}/${GROUP_ID}${I}-"*.patch; do
+ if [[ -f "$CANDIDATE" ]]; then
+ ADDITIONAL_FILES+=("$CANDIDATE")
+ NOT_FOUND=0
+ fi
+
+ if (( $NOT_FOUND )); then
+ for CANDIDATE in "${DIRNAME}/${GROUP_ID}${I}-"*.json; do
+ if [[ -f "$CANDIDATE" ]]; then
+ apply_actions "${CANDIDATE}"
+ fi
+ done
+ fi
+ done
+ done
+ fi
+
+ if [[ ${#ADDITIONAL_FILES[@]} -gt 0 ]]; then
+ check_file ${ADDITIONAL_FILES[@]} "${FILE}"
else
check_file "${FILE}"
fi
@@ -159,25 +192,52 @@ fi
for ARCH in alpine linux osx windows; do
for FILE in "../patches/${ARCH}/"*.patch; do
- if [[ "${ARCH}" == "linux" && "${FILE}" == *"/arch-"* ]] || [[ "${ARCH}" == "linux" && "${FILE}" == *"/fix-dependencies.patch" ]] || [[ "${ARCH}" == "windows" && "${FILE}" == *"/cli"* ]]; then
- echo "skip ${FILE}"
+ ADDITIONAL_FILES=()
+ BASENAME=$(basename "${FILE}")
+ DIRNAME=$(dirname "${FILE}")
+
+ if [[ "${BASENAME}" =~ ^([0-9])([1-9])(-.*)\.patch$ ]]; then
+ GROUP_ID="${BASH_REMATCH[1]}"
+ INDEX="${BASH_REMATCH[2]}"
+ ENDNAME="${BASH_REMATCH[3]}"
+
+ for ((I = 0; I < INDEX; I++)); do
+ NOT_FOUND=1
+
+ for CANDIDATE in "${DIRNAME}/${GROUP_ID}${I}-"*.patch; do
+ if [[ -f "$CANDIDATE" ]]; then
+ ADDITIONAL_FILES+=( "${CANDIDATE}" )
+ NOT_FOUND=0
+ fi
+ done
+
+ if (( $NOT_FOUND )); then
+ for CANDIDATE in "${DIRNAME}/../${GROUP_ID}${I}-"*.json; do
+ if [[ -f "$CANDIDATE" ]]; then
+ apply_actions "${CANDIDATE}"
+ fi
+ done
+ fi
+
+ if (( $NOT_FOUND )); then
+ for CANDIDATE in "${DIRNAME}/../${GROUP_ID}${I}-"*.patch; do
+ if [[ -f "$CANDIDATE" ]]; then
+ ADDITIONAL_FILES+=( "${CANDIDATE}" )
+ fi
+ done
+ fi
+ done
+
+ if [[ ${#ADDITIONAL_FILES[@]} -gt 0 ]]; then
+ check_file ${ADDITIONAL_FILES[@]} "${FILE}"
+ else
+ check_file "${FILE}"
+ fi
else
check_file "${FILE}"
fi
done
- if [[ "${ARCH}" == "linux" ]]; then
- check_file "../patches/optional-tree-sitter.patch" "../patches/linux/fix-dependencies.patch"
-
- check_file "../patches/cli.patch" "../patches/linux/arch-0-support.patch"
- check_file "../patches/cli.patch" "../patches/linux/arch-0-support.patch" "../patches/linux/arch-1-ppc64le.patch"
- check_file "../patches/cli.patch" "../patches/linux/arch-0-support.patch" "../patches/linux/arch-1-ppc64le.patch" "../patches/linux/arch-2-riscv64.patch"
- check_file "../patches/cli.patch" "../patches/linux/arch-0-support.patch" "../patches/linux/arch-1-ppc64le.patch" "../patches/linux/arch-2-riscv64.patch" "../patches/linux/arch-3-loong64.patch"
- check_file "../patches/cli.patch" "../patches/linux/arch-0-support.patch" "../patches/linux/arch-1-ppc64le.patch" "../patches/linux/arch-2-riscv64.patch" "../patches/linux/arch-3-loong64.patch" "../patches/linux/arch-4-s390x.patch"
- elif [[ "${ARCH}" == "windows" ]]; then
- check_file "../patches/cli.patch" "../patches/windows/cli.patch"
- fi
-
for TARGET in client reh; do
for FILE in "../patches/${ARCH}/${TARGET}/"*.patch; do
check_file "${FILE}"
diff --git a/docs/extensions.md b/docs/extensions.md
index 930ff8d603b..6a34b75fddd 100644
--- a/docs/extensions.md
+++ b/docs/extensions.md
@@ -28,7 +28,7 @@ By default, the `product.json` file is set up to use [open-vsx.org](https://open
## How to use the Open VSX Registry
As noted above, the [Open VSX Registry](https://open-vsx.org/) is the pre-set extension gallery in VSCodium. Using the extension view in VSCodium will therefore by default use it.
-See [this article](https://www.gitpod.io/blog/open-vsx/) for more information on the motivation behind Open VSX.
+See [this article](https://web.archive.org/web/20200423131829/https://www.gitpod.io/blog/open-vsx/) for more information on the motivation behind Open VSX.
## How to use a different extension gallery
diff --git a/font-size/.artifactrc.yml b/font-size/.artifactrc.yml
index 007a8d3be61..1810e6b47dc 100644
--- a/font-size/.artifactrc.yml
+++ b/font-size/.artifactrc.yml
@@ -1,7 +1,8 @@
+$schema: https://raw.githubusercontent.com/zokugun/artifact/v0.9.0/schemas/v2/install.json
artifacts:
"@daiyam/artifact-lang-js":
- version: 0.9.3
+ version: 0.12.3
requires:
- "22"
"@daiyam/artifact-lang-ts":
- version: 0.6.3
+ version: 0.9.1
diff --git a/font-size/.editorconfig b/font-size/.editorconfig
index 255114eb70e..3d01fcbfe94 100644
--- a/font-size/.editorconfig
+++ b/font-size/.editorconfig
@@ -15,3 +15,8 @@ indent_size = 2
[*.md]
indent_style = space
indent_size = 4
+
+[*.patch]
+indent_style = space
+indent_size = 2
+trim_trailing_whitespace = false
diff --git a/font-size/.fixpackrc b/font-size/.fixpackrc
index b871313d2ef..0707a38391d 100644
--- a/font-size/.fixpackrc
+++ b/font-size/.fixpackrc
@@ -1,9 +1,14 @@
{
+ "finalNewLine": true,
+ "required": [
+ "dependencies"
+ ],
"sortToTop": [
"name",
"displayName",
"description",
"version",
+ "since",
"private",
"author",
"publisher",
@@ -23,7 +28,8 @@
"dependencies",
"devDependencies",
"optionalDependencies",
+ "peerDependencies",
+ "overrides",
"keywords"
- ],
- "finalNewLine": true
+ ]
}
diff --git a/font-size/.nvmrc b/font-size/.nvmrc
index c6a66a6e6a6..a3745049aad 100644
--- a/font-size/.nvmrc
+++ b/font-size/.nvmrc
@@ -1 +1 @@
-v22.21.1
+v22.22.2
diff --git a/font-size/.tazerc.json b/font-size/.tazerc.json
new file mode 100644
index 00000000000..3b849486f95
--- /dev/null
+++ b/font-size/.tazerc.json
@@ -0,0 +1,12 @@
+{
+ "force": true,
+ "includeLocked": true,
+ "maturityPeriod": 7,
+ "packageMode": {
+ "@types/node": "minor",
+ "typescript": "minor"
+ },
+ "exclude": [
+ "xo"
+ ]
+}
diff --git a/font-size/.xo-config.json b/font-size/.xo-config.json
index 7c4c8c89360..d96bb651440 100644
--- a/font-size/.xo-config.json
+++ b/font-size/.xo-config.json
@@ -48,8 +48,14 @@
"error",
{
"selector": "variable",
- "modifiers": ["const", "global"],
- "format": ["camelCase", "UPPER_CASE"],
+ "modifiers": [
+ "const",
+ "global"
+ ],
+ "format": [
+ "camelCase",
+ "UPPER_CASE"
+ ],
"filter": {
"regex": "^(__filename|__dirname)$",
"match": false
@@ -57,7 +63,9 @@
},
{
"selector": "variable",
- "format": ["camelCase"],
+ "format": [
+ "camelCase"
+ ],
"filter": {
"regex": "^(__filename|__dirname)$",
"match": false
@@ -66,6 +74,14 @@
],
"@typescript-eslint/no-confusing-void-expression": "off",
"@typescript-eslint/no-dynamic-delete": "off",
+ "@typescript-eslint/no-empty-function": [
+ "error",
+ {
+ "allow": [
+ "arrowFunctions"
+ ]
+ }
+ ],
"@typescript-eslint/no-inferrable-types": "off",
"@typescript-eslint/no-namespace": "off",
"@typescript-eslint/object-curly-spacing": [
@@ -73,6 +89,12 @@
"always"
],
"@typescript-eslint/parameter-properties": "off",
+ "@typescript-eslint/prefer-nullish-coalescing": [
+ "error",
+ {
+ "ignoreConditionalTests": true
+ }
+ ],
"@typescript-eslint/prefer-promise-reject-errors": "off",
"@typescript-eslint/return-await": "off",
"arrow-parens": [
@@ -82,7 +104,7 @@
"capitalized-comments": "off",
"complexity": "off",
"default-case": "off",
- "import/extensions": [
+ "import/extensions": [
"error",
"never"
],
@@ -117,6 +139,7 @@
"no-lonely-if": "off",
"no-negated-condition": "off",
"object-curly-newline": "off",
+ "object-shorthand": "off",
"one-var": [
"error",
"never"
@@ -145,7 +168,8 @@
"mod": false,
"num": false,
"pkg": false,
- "str": false
+ "str": false,
+ "temp": false
}
}
]
diff --git a/font-size/generate-css.ts b/font-size/generate-css.ts
index 6e0f5841659..274aabaf949 100755
--- a/font-size/generate-css.ts
+++ b/font-size/generate-css.ts
@@ -4,7 +4,7 @@ import path from 'node:path';
import process from 'node:process';
import fse from '@zokugun/fs-extra-plus/async';
import { err, OK, type Result, stringifyError, xtry } from '@zokugun/xtry';
-import postcss, { Root, type Rule } from 'postcss';
+import postcss, { type Root, type Rule } from 'postcss';
type Area = {
name: string;
@@ -16,7 +16,7 @@ type Area = {
const PX_REGEX = /(-?\d+(\.\d+)?)px\b/g;
const COEFF_PRECISION = 6;
const HEADER = '/*** Generated for Custom Font Size ***/';
-const ZEROS = ['margin', 'padding'];
+const ZEROS = new Set(['margin', 'padding']);
const AREAS: Record = {
activitybar: {
@@ -44,6 +44,7 @@ const AREAS: Record = {
'src/vs/base/browser/ui/actionbar/actionbar.css',
'src/vs/base/browser/ui/button/button.css',
'src/vs/base/browser/ui/inputbox/inputBox.css',
+ 'src/vs/base/browser/ui/toggle/toggle.css',
'src/vs/workbench/contrib/debug/browser/media/debugToolBar.css',
'src/vs/workbench/contrib/debug/browser/media/debugViewlet.css',
'src/vs/workbench/contrib/extensions/browser/media/extension.css',
@@ -59,10 +60,19 @@ const AREAS: Record = {
files: [
'src/vs/workbench/browser/parts/editor/media/editortabscontrol.css',
'src/vs/workbench/browser/parts/editor/media/editortitlecontrol.css',
- 'src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css'
+ 'src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css',
],
prefixes: ['.monaco-workbench .part.editor > .content .editor-group-container > .title.tabs'],
},
+ workbench: {
+ name: 'workbench',
+ defaultSize: 13,
+ files: [
+ 'src/vs/base/browser/ui/toggle/toggle.css',
+ 'src/vs/editor/contrib/find/browser/findWidget.css',
+ ],
+ prefixes: ['.monaco-workbench .part'],
+ },
};
function formatCoefficient(n: number): string { // {{{
@@ -79,8 +89,9 @@ function replacePx(area: Area) { // {{{
}
const coeff = formatCoefficient(pxValue / area.defaultSize);
+ const varname = area.name === 'workbench' ? '--vscode-workbench-font-size' : `--vscode-workbench-${area.name}-font-size`;
- return `calc(var(--vscode-workbench-${area.name}-font-size) * ${coeff})`;
+ return `calc(var(${varname}) * ${coeff})`;
};
} // }}}
@@ -104,7 +115,7 @@ async function processFile(filePath: string, areas: Area[]): Promise 0) {
@@ -135,7 +146,7 @@ function processFileArea(postcssResult: Root, generatedRoot: Root, area: Area):
else if(declaration.value === 'auto' && (declaration.prop === 'height' || declaration.prop === 'width')) {
declarationsToAdd.push({ prop: declaration.prop, value: 'auto' });
}
- else if(declaration.value === '0' && ZEROS.includes(declaration.prop)) {
+ else if(declaration.value === '0' && ZEROS.has(declaration.prop)) {
declarationsToAdd.push({ prop: declaration.prop, value: '0' });
}
});
@@ -205,7 +216,7 @@ function mergeSelector(selectors: string[], prefixes: string[], index: number):
mergeSelector(selectors, prefixes, index + 1);
}
else if(index === 0) {
- selectors.unshift(...prefixes)
+ selectors.unshift(...prefixes);
}
else {
selectors.splice(index + 1, 0, ...prefixes.slice(index));
@@ -245,10 +256,10 @@ async function main(): Promise { // {{{
for(const area of Object.values(AREAS)) {
for(const file of area.files) {
if(files[file]) {
- files[file].push(area)
+ files[file].push(area);
}
else {
- files[file] = [area]
+ files[file] = [area];
}
}
}
@@ -263,7 +274,6 @@ async function main(): Promise { // {{{
else {
console.log(`No area found for ${name}`);
console.log(`\nAvailable areas:\n- ${Object.keys(AREAS).join('\n- ')}`);
- return;
}
} // }}}
diff --git a/font-size/package-lock.json b/font-size/package-lock.json
index cf7f5031815..dc97c80fd07 100644
--- a/font-size/package-lock.json
+++ b/font-size/package-lock.json
@@ -9,17 +9,46 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "@zokugun/fs-extra-plus": "^0.3.3",
- "@zokugun/xtry": "^0.10.1",
- "fast-glob": "^3.3.3",
- "postcss": "^8.5.6"
+ "@zokugun/fs-extra-plus": "0.4.1",
+ "@zokugun/xtry": "0.11.6",
+ "fast-glob": "3.3.3",
+ "postcss": "8.5.23"
},
"devDependencies": {
- "@types/node": "^22.9.0",
- "fixpack": "^4.0.0",
+ "@types/node": "22.19.18",
+ "fixpack": "4.0.0",
+ "rimraf": "6.1.3",
+ "taze": "19.12.0",
+ "typescript": "5.9.3",
"xo": "0.60.0"
}
},
+ "node_modules/@antfu/ni": {
+ "version": "30.1.0",
+ "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-30.1.0.tgz",
+ "integrity": "sha512-3VuAbPjgY52rQNn4wABaXMhBU2Oq91uy6L8nX49eJ35OLI68CyckGU+HZxcaHix4ymuGM2nFL1D6sLpgODK5xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fzf": "^0.5.2",
+ "package-manager-detector": "^1.6.0",
+ "tinyexec": "^1.0.4",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "na": "bin/na.mjs",
+ "nci": "bin/nci.mjs",
+ "nd": "bin/nd.mjs",
+ "ni": "bin/ni.mjs",
+ "nlx": "bin/nlx.mjs",
+ "nr": "bin/nr.mjs",
+ "nun": "bin/nun.mjs",
+ "nup": "bin/nup.mjs"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
@@ -145,6 +174,13 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
+ "node_modules/@henrygd/queue": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@henrygd/queue/-/queue-1.2.0.tgz",
+ "integrity": "sha512-jW/BLSTpcvExDhqJGxtIPgGr2O0IFF8XUNDwEbfCfhrXT8a4xztQ9Lv6U/vbYzYC0xVWn+3zv6YnLUh3bEFUKA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
@@ -286,6 +322,19 @@
"url": "https://opencollective.com/pkgr"
}
},
+ "node_modules/@quansync/fs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.0.0.tgz",
+ "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -358,9 +407,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.19.11",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz",
- "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==",
+ "version": "22.19.18",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.18.tgz",
+ "integrity": "sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -527,9 +576,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz",
+ "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -824,28 +873,34 @@
"peer": true
},
"node_modules/@zokugun/fs-extra-plus": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@zokugun/fs-extra-plus/-/fs-extra-plus-0.3.3.tgz",
- "integrity": "sha512-GzLdcuSttjzcWL3dkdoxKPm9MZVVOVv5q2tWjCn4KUlIu27FBTx3pyvZMmpJf8u6ZNw0bqafWVYYppBiFqJ23g==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@zokugun/fs-extra-plus/-/fs-extra-plus-0.4.1.tgz",
+ "integrity": "sha512-aLwHhiBg7mqmhxCat/mOoM1zdzrqOVnxCXGMzs6I3XiPaTlNczwlO8WHGw/111DSlYuGvrX2zagBXHVpqVHGGQ==",
"license": "MIT",
"dependencies": {
- "@zokugun/is-it-type": "^0.5.2",
- "@zokugun/xtry": "^0.10.1"
+ "@zokugun/is-it-type": "0.7.0",
+ "@zokugun/xtry": "0.11.5"
},
"optionalDependencies": {
"mime-types": "*"
}
},
+ "node_modules/@zokugun/fs-extra-plus/node_modules/@zokugun/xtry": {
+ "version": "0.11.5",
+ "resolved": "https://registry.npmjs.org/@zokugun/xtry/-/xtry-0.11.5.tgz",
+ "integrity": "sha512-C6g/48K05hLMHAlx0cJoSoOiAcKL/1qJRFxeoDao1dywry2XO+CnhE8BdDkQEVsgkZrqob7B2dQSP7N1piEPSg==",
+ "license": "MIT"
+ },
"node_modules/@zokugun/is-it-type": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/@zokugun/is-it-type/-/is-it-type-0.5.2.tgz",
- "integrity": "sha512-Gj6H+nvhwJt4Q5UeIntwRQY4/JTs9ZVaJ/Ac2na3LUdN//dgSyH4gZrXzGqzDu31ZyaEySppvF+frN7L2Rg7Pg==",
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@zokugun/is-it-type/-/is-it-type-0.7.0.tgz",
+ "integrity": "sha512-6r7JJKo9+KkLw4aOIFkAAI5ZpcRXlGPogjENwbzqPOk37WREUKLpBTfxMxmS/dCBELAvyvBWrOatm0clEsHjdA==",
"license": "MIT"
},
"node_modules/@zokugun/xtry": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/@zokugun/xtry/-/xtry-0.10.1.tgz",
- "integrity": "sha512-nB3KpyjpFdK69EFTT9SLcIpec9EFA9ysiOuWS1B8lpnbJtzm4woMxHT22ZEEDKl9ykIhHKfpFQc2emaJMUi5oQ==",
+ "version": "0.11.6",
+ "resolved": "https://registry.npmjs.org/@zokugun/xtry/-/xtry-0.11.6.tgz",
+ "integrity": "sha512-hEODJ0ZUsC8o/9vZA1XEIxXx89oPHgswM7T6Q6r3A4+rx7bbLoDXSIB6Ar1TcwI94BgbcPC1Y4t3AtU3UOOGiQ==",
"license": "MIT"
},
"node_modules/acorn": {
@@ -1162,9 +1217,9 @@
}
},
"node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
+ "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1255,6 +1310,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/cac": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz",
+ "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
@@ -1455,9 +1520,9 @@
}
},
"node_modules/cosmiconfig": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
- "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz",
+ "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1664,6 +1729,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/detect-indent": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
@@ -3196,9 +3275,9 @@
"license": "MIT"
},
"node_modules/fast-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
- "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz",
+ "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==",
"dev": true,
"funding": [
{
@@ -3409,6 +3488,45 @@
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/flat-cache/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/flatted": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
@@ -3480,6 +3598,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/fzf": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz",
+ "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/generator-function": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
@@ -3614,22 +3739,18 @@
}
},
"node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"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"
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
},
"engines": {
- "node": "*"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -3655,6 +3776,45 @@
"license": "BSD-2-Clause",
"peer": true
},
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
+ "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/globals": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
@@ -4671,6 +4831,16 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -4689,10 +4859,20 @@
}
},
"node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
+ "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
@@ -4882,6 +5062,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/lru-cache": {
+ "version": "11.4.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.4.0.tgz",
+ "integrity": "sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -4899,6 +5089,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -4959,6 +5162,19 @@
"node": ">= 0.6"
}
},
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/min-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -4992,6 +5208,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -5000,9 +5226,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
- "version": "3.3.11",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "version": "3.3.16",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
+ "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
"funding": [
{
"type": "github",
@@ -5061,6 +5287,13 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/node-fetch-native": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
@@ -5278,6 +5511,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/ofetch": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz",
+ "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "destr": "^2.0.5",
+ "node-fetch-native": "^1.6.7",
+ "ufo": "^1.6.1"
+ }
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -5288,6 +5533,22 @@
"wrappy": "1"
}
},
+ "node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/open": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
@@ -5404,6 +5665,20 @@
"node": ">=6"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
+ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -5486,6 +5761,23 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/path-type": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz",
@@ -5499,6 +5791,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -5644,6 +5943,26 @@
"node": ">=4"
}
},
+ "node_modules/pnpm-workspace-yaml": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/pnpm-workspace-yaml/-/pnpm-workspace-yaml-1.6.0.tgz",
+ "integrity": "sha512-uUy4dK3E11sp7nK+hnT7uAWfkBMe00KaUw8OG3NuNlYQoTk4sc9pcdIy1+XIP85v9Tvr02mK3JPaNNrP0QyRaw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "yaml": "^2.8.2"
+ }
+ },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -5655,9 +5974,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.6",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
- "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "version": "8.5.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz",
+ "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==",
"funding": [
{
"type": "opencollective",
@@ -5674,7 +5993,7 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.11",
+ "nanoid": "^3.3.16",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -5757,6 +6076,23 @@
"node": ">=6"
}
},
+ "node_modules/quansync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz",
+ "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -6051,6 +6387,23 @@
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/reusify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
@@ -6062,17 +6415,20 @@
}
},
"node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz",
+ "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "glob": "^7.1.3"
+ "glob": "^13.0.3",
+ "package-json-from-dist": "^1.0.1"
},
"bin": {
- "rimraf": "bin.js"
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -6649,6 +7005,34 @@
"node": ">=0.6"
}
},
+ "node_modules/taze": {
+ "version": "19.12.0",
+ "resolved": "https://registry.npmjs.org/taze/-/taze-19.12.0.tgz",
+ "integrity": "sha512-qe9mTHwyJUNgWyqx62chVcJN0bfel2AJHsqlFVVxVto0GiBhKjNsPo0FOnFxpKin1Nh0uBooZHgNAjcsP8t2Fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/ni": "^30.1.0",
+ "@henrygd/queue": "^1.2.0",
+ "cac": "^7.0.0",
+ "find-up-simple": "^1.0.1",
+ "ofetch": "^1.5.1",
+ "package-manager-detector": "^1.6.0",
+ "pathe": "^2.0.3",
+ "pnpm-workspace-yaml": "^1.6.0",
+ "restore-cursor": "^5.1.0",
+ "tinyexec": "^1.1.2",
+ "tinyglobby": "^0.2.16",
+ "unconfig": "^7.5.0",
+ "yaml": "^2.9.0"
+ },
+ "bin": {
+ "taze": "bin/taze.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/terser": {
"version": "5.46.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz",
@@ -6719,6 +7103,64 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/tinyexec": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz",
+ "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/to-absolute-glob": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-3.0.0.tgz",
@@ -6925,6 +7367,13 @@
"node": ">=14.17"
}
},
+ "node_modules/ufo": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/unbox-primitive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
@@ -6954,6 +7403,37 @@
"node": ">=0.10.0"
}
},
+ "node_modules/unconfig": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.5.0.tgz",
+ "integrity": "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "defu": "^6.1.4",
+ "jiti": "^2.6.1",
+ "quansync": "^1.0.0",
+ "unconfig-core": "7.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/unconfig-core": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz",
+ "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
@@ -7348,17 +7828,20 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/xo/node_modules/meow": {
- "version": "13.2.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
- "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
"engines": {
- "node": ">=18"
+ "node": ">= 14.6"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yocto-queue": {
diff --git a/font-size/package.json b/font-size/package.json
index 2f3a8e686f3..1a4aa8a4c36 100644
--- a/font-size/package.json
+++ b/font-size/package.json
@@ -10,20 +10,29 @@
"type": "module",
"main": "generate-css.ts",
"scripts": {
+ "audit:fix": "npm audit fix --min-release-age=0",
"clean": "rimraf lib",
+ "compile:src": "tsc -p src",
"lint": "xo",
+ "lint:all": "npm audit && npm run lint:package && npm run lint",
"lint:fix": "xo --fix",
- "prepare": "fixpack || true"
+ "lint:package": "fixpack || true",
+ "run": "node generate-css.ts",
+ "update:artifacts": "artifact update",
+ "update:deps": "taze --all"
},
"dependencies": {
- "@zokugun/fs-extra-plus": "^0.3.3",
- "@zokugun/xtry": "^0.10.1",
- "fast-glob": "^3.3.3",
- "postcss": "^8.5.6"
+ "@zokugun/fs-extra-plus": "0.4.1",
+ "@zokugun/xtry": "0.11.6",
+ "fast-glob": "3.3.3",
+ "postcss": "8.5.23"
},
"devDependencies": {
- "@types/node": "^22.9.0",
- "fixpack": "^4.0.0",
+ "@types/node": "22.19.18",
+ "fixpack": "4.0.0",
+ "rimraf": "6.1.3",
+ "taze": "19.12.0",
+ "typescript": "5.9.3",
"xo": "0.60.0"
},
"keywords": []
diff --git a/justfile b/justfile
new file mode 100644
index 00000000000..b0cf4a70fd4
--- /dev/null
+++ b/justfile
@@ -0,0 +1,10 @@
+set shell := ["bash", "-uc"]
+
+ci-lint:
+ zizmor .
+
+ci-lint-fix:
+ zizmor . --fix=all
+
+ci-update:
+ PINACT_MIN_AGE=7 pinact run --update
diff --git a/patches/binary-name.patch b/patches/00-binary-fix-name.patch
similarity index 100%
rename from patches/binary-name.patch
rename to patches/00-binary-fix-name.patch
diff --git a/patches/brand.patch b/patches/00-brand-remove-branding.patch
similarity index 81%
rename from patches/brand.patch
rename to patches/00-brand-remove-branding.patch
index 9417bf35284..98fa2c0fead 100644
--- a/patches/brand.patch
+++ b/patches/00-brand-remove-branding.patch
@@ -1,5 +1,43 @@
+diff --git a/build/win32/i18n/messages.en.isl b/build/win32/i18n/messages.en.isl
+index 6255123d..dd33a446 100644
+--- a/build/win32/i18n/messages.en.isl
++++ b/build/win32/i18n/messages.en.isl
+@@ -16,2 +16,2 @@ SourceFile=%1 Source File
+ OpenWithCodeContextMenu=Open w&ith %1
+-UpdatingVisualStudioCode=Updating Visual Studio Code...
++UpdatingVisualStudioCode=Updating !!APP_NAME!!...
+diff --git a/build/win32/i18n/messages.es.isl b/build/win32/i18n/messages.es.isl
+index 7f6f1bd0..97962525 100644
+--- a/build/win32/i18n/messages.es.isl
++++ b/build/win32/i18n/messages.es.isl
+@@ -9,2 +9,2 @@ SourceFile=Archivo de origen %1
+ OpenWithCodeContextMenu=Abrir &con %1
+-UpdatingVisualStudioCode=Actualizando Visual Studio Code...
+\ No newline at end of file
++UpdatingVisualStudioCode=Actualizando !!APP_NAME!!...
+\ No newline at end of file
+diff --git a/build/win32/i18n/messages.it.isl b/build/win32/i18n/messages.it.isl
+index ac64aae7..dd65f740 100644
+--- a/build/win32/i18n/messages.it.isl
++++ b/build/win32/i18n/messages.it.isl
+@@ -9,2 +9,2 @@ SourceFile=File di origine %1
+ OpenWithCodeContextMenu=Apri con %1
+-UpdatingVisualStudioCode=Aggiornamento di Visual Studio Code...
+\ No newline at end of file
++UpdatingVisualStudioCode=Aggiornamento di !!APP_NAME!!...
+\ No newline at end of file
+diff --git a/build/win32/i18n/messages.pt-br.isl b/build/win32/i18n/messages.pt-br.isl
+index 08c77290..584ac529 100644
+--- a/build/win32/i18n/messages.pt-br.isl
++++ b/build/win32/i18n/messages.pt-br.isl
+@@ -9,2 +9,2 @@ SourceFile=Arquivo Fonte %1
+ OpenWithCodeContextMenu=Abrir com %1
+-UpdatingVisualStudioCode=Atualizando o Visual Studio Code...
+\ No newline at end of file
++UpdatingVisualStudioCode=Atualizando o !!APP_NAME!!...
+\ No newline at end of file
diff --git a/extensions/configuration-editing/src/configurationEditingMain.ts b/extensions/configuration-editing/src/configurationEditingMain.ts
-index 2578270..99c8ca5 100644
+index 2578270c..99c8ca5b 100644
--- a/extensions/configuration-editing/src/configurationEditingMain.ts
+++ b/extensions/configuration-editing/src/configurationEditingMain.ts
@@ -54,4 +54,4 @@ function registerVariableCompletions(pattern: string): vscode.Disposable {
@@ -10,7 +48,7 @@ index 2578270..99c8ca5 100644
+ { label: 'workspaceFolderBasename', detail: vscode.l10n.t("The name of the folder opened in !!APP_NAME!! without any slashes (/)") },
{ label: 'fileWorkspaceFolderBasename', detail: vscode.l10n.t("The current opened file workspace folder name without any slashes (/)") },
diff --git a/extensions/configuration-editing/src/settingsDocumentHelper.ts b/extensions/configuration-editing/src/settingsDocumentHelper.ts
-index 12b50f3..7cb0d1b 100644
+index 12b50f31..7cb0d1bd 100644
--- a/extensions/configuration-editing/src/settingsDocumentHelper.ts
+++ b/extensions/configuration-editing/src/settingsDocumentHelper.ts
@@ -123,3 +123,3 @@ export class SettingsDocument {
@@ -19,7 +57,7 @@ index 12b50f3..7cb0d1b 100644
+ completions.push(this.newSimpleCompletionItem(getText('appName'), range, vscode.l10n.t("e.g. !!APP_NAME!!")));
completions.push(this.newSimpleCompletionItem(getText('remoteName'), range, vscode.l10n.t("e.g. SSH")));
diff --git a/extensions/css-language-features/package.nls.json b/extensions/css-language-features/package.nls.json
-index d3de224..94eea2f 100644
+index d3de2241..94eea2fb 100644
--- a/extensions/css-language-features/package.nls.json
+++ b/extensions/css-language-features/package.nls.json
@@ -4,4 +4,4 @@
@@ -45,7 +83,7 @@ index d3de224..94eea2f 100644
+ "scss.completion.triggerPropertyValueCompletion.desc": "By default, !!APP_NAME!! triggers property value completion after selecting a CSS property. Use this setting to disable this behavior.",
"scss.completion.completePropertyWithSemicolon.desc": "Insert semicolon at end of line when completing CSS properties.",
diff --git a/extensions/emmet/package.nls.json b/extensions/emmet/package.nls.json
-index 683bcc7..312b4b2 100644
+index 683bcc7f..312b4b25 100644
--- a/extensions/emmet/package.nls.json
+++ b/extensions/emmet/package.nls.json
@@ -1,3 +1,3 @@
@@ -54,7 +92,7 @@ index 683bcc7..312b4b2 100644
+ "description": "Emmet support for !!APP_NAME!!",
"command.wrapWithAbbreviation": "Wrap with Abbreviation",
diff --git a/extensions/extension-editing/src/constants.ts b/extensions/extension-editing/src/constants.ts
-index 1be4d0e..647b147 100644
+index 1be4d0e1..647b1474 100644
--- a/extensions/extension-editing/src/constants.ts
+++ b/extensions/extension-editing/src/constants.ts
@@ -8,2 +8,2 @@ import { l10n } from 'vscode';
@@ -62,16 +100,16 @@ index 1be4d0e..647b147 100644
-export const redundantImplicitActivationEvent = l10n.t("This activation event can be removed as VS Code generates these automatically from your package.json contribution declarations.");
+export const redundantImplicitActivationEvent = l10n.t("This activation event can be removed as !!APP_NAME!! generates these automatically from your package.json contribution declarations.");
diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts
-index 6249500..6d89804 100644
+index a6ab287a..6cd79323 100644
--- a/extensions/extension-editing/src/extensionLinter.ts
+++ b/extensions/extension-editing/src/extensionLinter.ts
@@ -34,3 +34,3 @@ const relativeUrlRequiresHttpsRepository = l10n.t("Relative image URLs require a
const relativeBadgeUrlRequiresHttpsRepository = l10n.t("Relative badge URLs require a repository with HTTPS protocol to be specified in this package.json.");
-const apiProposalNotListed = l10n.t("This proposal cannot be used because for this extension the product defines a fixed set of API proposals. You can test your extension but before publishing you MUST reach out to the VS Code team.");
+const apiProposalNotListed = l10n.t("This proposal cannot be used because for this extension the product defines a fixed set of API proposals. You can test your extension but before publishing you MUST reach out to the !!APP_NAME!! team.");
-
+ const apiProposalVersionNotSupported = l10n.t("API proposal versions are no longer supported. Remove the '@' suffix.");
diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json
-index 147a75f..565109e 100644
+index 147a75f9..565109ec 100644
--- a/extensions/git/package.nls.json
+++ b/extensions/git/package.nls.json
@@ -259,3 +259,3 @@
@@ -195,7 +233,7 @@ index 147a75f..565109e 100644
+ "view.workbench.learnMore": "To learn more about how to use Git and source control in !!APP_NAME!! [read our docs](https://aka.ms/vscode-scm)."
}
diff --git a/extensions/github/package.nls.json b/extensions/github/package.nls.json
-index 0449759..70a7c7c 100644
+index 04497595..70a7c7ce 100644
--- a/extensions/github/package.nls.json
+++ b/extensions/github/package.nls.json
@@ -2,3 +2,3 @@
@@ -219,7 +257,7 @@ index 0449759..70a7c7c 100644
+ "Do not translate the 'command:*' part inside of the '(..)'. It is an internal command syntax for !!APP_NAME!!",
"Please make sure there is no space between the right bracket and left parenthesis: ]( this is an internal syntax for links"
diff --git a/extensions/grunt/package.nls.json b/extensions/grunt/package.nls.json
-index 789a579..12e230e 100644
+index 789a579c..12e230e8 100644
--- a/extensions/grunt/package.nls.json
+++ b/extensions/grunt/package.nls.json
@@ -1,4 +1,4 @@
@@ -230,7 +268,7 @@ index 789a579..12e230e 100644
+ "displayName": "Grunt support for !!APP_NAME!!",
"config.grunt.autoDetect": "Controls enablement of Grunt task detection. Grunt task detection can cause files in any open workspace to be executed.",
diff --git a/extensions/html-language-features/client/src/htmlClient.ts b/extensions/html-language-features/client/src/htmlClient.ts
-index 250b340..8f53898 100644
+index cfb91c1f..e19b59fe 100644
--- a/extensions/html-language-features/client/src/htmlClient.ts
+++ b/extensions/html-language-features/client/src/htmlClient.ts
@@ -109,3 +109,3 @@ export async function startClient(context: ExtensionContext, newLanguageClient:
@@ -239,7 +277,7 @@ index 250b340..8f53898 100644
+ const res = await window.showInformationMessage(l10n.t('!!APP_NAME!! now has built-in support for auto-renaming tags. Do you want to enable it?'), configure);
if (res === configure) {
diff --git a/extensions/html-language-features/package.nls.json b/extensions/html-language-features/package.nls.json
-index d839070..b3ea638 100644
+index d8390703..b3ea6389 100644
--- a/extensions/html-language-features/package.nls.json
+++ b/extensions/html-language-features/package.nls.json
@@ -3,3 +3,3 @@
@@ -253,7 +291,7 @@ index d839070..b3ea638 100644
+ "html.trace.server.desc": "Traces the communication between !!APP_NAME!! and the HTML language server.",
"html.validate.scripts": "Controls whether the built-in HTML language support validates embedded scripts.",
diff --git a/extensions/html-language-features/schemas/package.schema.json b/extensions/html-language-features/schemas/package.schema.json
-index 205143c..cc9f918 100644
+index 205143c3..cc9f918a 100644
--- a/extensions/html-language-features/schemas/package.schema.json
+++ b/extensions/html-language-features/schemas/package.schema.json
@@ -9,3 +9,3 @@
@@ -262,7 +300,7 @@ index 205143c..cc9f918 100644
+ "markdownDescription": "A list of relative file paths pointing to JSON files following the [custom data format](https://github.com/microsoft/vscode-html-languageservice/blob/master/docs/customData.md).\n\n!!APP_NAME!! loads custom data on startup to enhance its HTML support for the custom HTML tags, attributes and attribute values you specify in the JSON files.\n\nThe file paths are relative to workspace and only workspace folder settings are considered.",
"items": {
diff --git a/extensions/jake/package.nls.json b/extensions/jake/package.nls.json
-index e82030e..ac999f6 100644
+index e82030ef..ac999f61 100644
--- a/extensions/jake/package.nls.json
+++ b/extensions/jake/package.nls.json
@@ -1,4 +1,4 @@
@@ -273,7 +311,7 @@ index e82030e..ac999f6 100644
+ "displayName": "Jake support for !!APP_NAME!!",
"jake.taskDefinition.type.description": "The Jake task to customize.",
diff --git a/extensions/json-language-features/package.nls.json b/extensions/json-language-features/package.nls.json
-index 30199b2..008aed7 100644
+index 30199b2b..008aed75 100644
--- a/extensions/json-language-features/package.nls.json
+++ b/extensions/json-language-features/package.nls.json
@@ -11,3 +11,3 @@
@@ -282,21 +320,21 @@ index 30199b2..008aed7 100644
+ "json.tracing.desc": "Traces the communication between !!APP_NAME!! and the JSON language server.",
"json.colorDecorators.enable.desc": "Enables or disables color decorators",
diff --git a/extensions/markdown-language-features/package.nls.json b/extensions/markdown-language-features/package.nls.json
-index 45df470..0957c55 100644
+index cb292ba5..1eaf331e 100644
--- a/extensions/markdown-language-features/package.nls.json
+++ b/extensions/markdown-language-features/package.nls.json
-@@ -22,3 +22,3 @@
+@@ -30,3 +30,3 @@
"markdown.trace.extension.desc": "Enable debug logging for the Markdown extension.",
- "markdown.trace.server.desc": "Traces the communication between VS Code and the Markdown language server.",
+ "markdown.trace.server.desc": "Traces the communication between !!APP_NAME!! and the Markdown language server.",
"markdown.server.log.desc": "Controls the logging level of the Markdown language server.",
-@@ -76,3 +76,3 @@
+@@ -88,3 +88,3 @@
"comment": [
- "This setting is use the user drops or pastes image data into the editor. In this case, VS Code automatically creates a new image file in the workspace containing the dropped/pasted image.",
+ "This setting is use the user drops or pastes image data into the editor. In this case, !!APP_NAME!! automatically creates a new image file in the workspace containing the dropped/pasted image.",
"It's easier to explain this setting with an example. For example, let's say the setting value was:",
diff --git a/extensions/media-preview/package.nls.json b/extensions/media-preview/package.nls.json
-index 920ced7..755a166 100644
+index 920ced76..755a1669 100644
--- a/extensions/media-preview/package.nls.json
+++ b/extensions/media-preview/package.nls.json
@@ -2,3 +2,3 @@
@@ -305,16 +343,16 @@ index 920ced7..755a166 100644
+ "description": "Provides !!APP_NAME!!'s built-in previews for images, audio, and video",
"customEditor.audioPreview.displayName": "Audio Preview",
diff --git a/extensions/media-preview/src/audioPreview.ts b/extensions/media-preview/src/audioPreview.ts
-index 282d579..e3dfb4b 100644
+index 01aaf33a..47b7065d 100644
--- a/extensions/media-preview/src/audioPreview.ts
+++ b/extensions/media-preview/src/audioPreview.ts
-@@ -83,3 +83,3 @@ class AudioPreview extends MediaPreview {
+@@ -85,3 +85,3 @@ class AudioPreview extends MediaPreview {
${vscode.l10n.t("An error occurred while loading the audio file.")}
- ${vscode.l10n.t("Open file using VS Code's standard text/binary editor?")}
+ ${vscode.l10n.t("Open file using !!APP_NAME!!'s standard text/binary editor?")}
diff --git a/extensions/media-preview/src/imagePreview/index.ts b/extensions/media-preview/src/imagePreview/index.ts
-index 6c2c8a7..064afc6 100644
+index 79cb70c9..abe67371 100644
--- a/extensions/media-preview/src/imagePreview/index.ts
+++ b/extensions/media-preview/src/imagePreview/index.ts
@@ -210,3 +210,3 @@ class ImagePreview extends MediaPreview {
@@ -323,16 +361,16 @@ index 6c2c8a7..064afc6 100644
+ ${vscode.l10n.t("Open file using !!APP_NAME!!'s standard text/binary editor?")}
diff --git a/extensions/media-preview/src/videoPreview.ts b/extensions/media-preview/src/videoPreview.ts
-index 1cb74c5..3f5f892 100644
+index 2ee1169f..0489215c 100644
--- a/extensions/media-preview/src/videoPreview.ts
+++ b/extensions/media-preview/src/videoPreview.ts
-@@ -87,3 +87,3 @@ class VideoPreview extends MediaPreview {
+@@ -89,3 +89,3 @@ class VideoPreview extends MediaPreview {
${vscode.l10n.t("An error occurred while loading the video file.")}
- ${vscode.l10n.t("Open file using VS Code's standard text/binary editor?")}
+ ${vscode.l10n.t("Open file using !!APP_NAME!!'s standard text/binary editor?")}
diff --git a/extensions/notebook-renderers/package.json b/extensions/notebook-renderers/package.json
-index fad11bc..64e48ce 100644
+index 032dd35d..e38bc488 100644
--- a/extensions/notebook-renderers/package.json
+++ b/extensions/notebook-renderers/package.json
@@ -22,3 +22,3 @@
@@ -341,7 +379,7 @@ index fad11bc..64e48ce 100644
+ "displayName": "!!APP_NAME!! Builtin Notebook Output Renderer",
"requiresMessaging": "never",
diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json
-index 1235a55..b647563 100644
+index 5c77708d..6f092001 100644
--- a/extensions/npm/package.nls.json
+++ b/extensions/npm/package.nls.json
@@ -2,3 +2,3 @@
@@ -350,7 +388,7 @@ index 1235a55..b647563 100644
+ "displayName": "NPM support for !!APP_NAME!!",
"workspaceTrust": "This extension executes tasks, which require trust to run.",
diff --git a/extensions/swift/syntaxes/swift.tmLanguage.json b/extensions/swift/syntaxes/swift.tmLanguage.json
-index d52cabb..eb3a76c 100644
+index d52cabb8..eb3a76c1 100644
--- a/extensions/swift/syntaxes/swift.tmLanguage.json
+++ b/extensions/swift/syntaxes/swift.tmLanguage.json
@@ -260,3 +260,3 @@
@@ -359,7 +397,7 @@ index d52cabb..eb3a76c 100644
+ "comment": "The simpler (?<=\\bProcess\\.|\\bCommandLine\\.) breaks !!APP_NAME!! / Atom, see https://github.com/textmate/swift.tmbundle/issues/29",
"name": "support.variable.swift",
diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json
-index 48955c3..0ff7003 100644
+index a697f8c0..2ba1dab8 100644
--- a/extensions/typescript-language-features/package.nls.json
+++ b/extensions/typescript-language-features/package.nls.json
@@ -136,5 +136,5 @@
@@ -406,7 +444,7 @@ index 48955c3..0ff7003 100644
+ "walkthroughs.nodejsWelcome.learnMoreAboutJs.altText": "Learn more about JavaScript and Node.js in !!APP_NAME!!."
}
diff --git a/extensions/typescript-language-features/src/tsServer/versionManager.ts b/extensions/typescript-language-features/src/tsServer/versionManager.ts
-index 8d99637..a8d9986 100644
+index 1154a29c..08545028 100644
--- a/extensions/typescript-language-features/src/tsServer/versionManager.ts
+++ b/extensions/typescript-language-features/src/tsServer/versionManager.ts
@@ -112,3 +112,3 @@ export class TypeScriptVersionManager extends Disposable {
@@ -415,7 +453,7 @@ index 8d99637..a8d9986 100644
+ : '') + vscode.l10n.t("Use !!APP_NAME!!'s Version"),
description: bundledVersion.displayName,
diff --git a/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts b/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts
-index 12cb1cc..bfaa57e 100644
+index 12cb1cca..bfaa57ed 100644
--- a/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts
+++ b/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts
@@ -70,3 +70,3 @@ export class DiskTypeScriptVersionProvider implements ITypeScriptVersionProvider
@@ -424,16 +462,16 @@ index 12cb1cc..bfaa57e 100644
+ vscode.window.showErrorMessage(vscode.l10n.t("!!APP_NAME!!\'s tsserver was deleted by another application such as a misbehaving virus detection tool. Please reinstall !!APP_NAME!!."));
throw new Error('Could not find bundled tsserver.js');
diff --git a/extensions/typescript-language-features/src/tsconfig.ts b/extensions/typescript-language-features/src/tsconfig.ts
-index 9905fd5..62c2e3c 100644
+index 823985e9..f22a314e 100644
--- a/extensions/typescript-language-features/src/tsconfig.ts
+++ b/extensions/typescript-language-features/src/tsconfig.ts
-@@ -159,3 +159,3 @@ export async function openProjectConfigForFile(
+@@ -146,3 +146,3 @@ export async function openProjectConfigForFile(
vscode.window.showInformationMessage(
- vscode.l10n.t("Please open a folder in VS Code to use a TypeScript or JavaScript project"));
+ vscode.l10n.t("Please open a folder in !!APP_NAME!! to use a TypeScript or JavaScript project"));
return;
diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts
-index 507f9e6..067fb79 100644
+index ae18dff7..9d158d2b 100644
--- a/extensions/typescript-language-features/src/typescriptServiceClient.ts
+++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts
@@ -660,3 +660,3 @@ export default class TypeScriptServiceClient extends Disposable implements IType
@@ -452,7 +490,7 @@ index 507f9e6..067fb79 100644
+ vscode.l10n.t("The JS/TS language service crashed.\nThis may be caused by a plugin contributed by one of these extensions: {0}.\nPlease try disabling these extensions before filing an issue against !!APP_NAME!!.", pluginExtensionList));
} else {
diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json
-index 0ba8a2d..db93abf 100644
+index d56cbf59..47bdd32c 100644
--- a/extensions/vscode-api-tests/package.json
+++ b/extensions/vscode-api-tests/package.json
@@ -2,3 +2,3 @@
@@ -461,7 +499,7 @@ index 0ba8a2d..db93abf 100644
+ "description": "API tests for !!APP_NAME!!",
"version": "0.0.1",
diff --git a/extensions/vscode-colorize-tests/package.json b/extensions/vscode-colorize-tests/package.json
-index 1abff3d..5d87461 100644
+index f3253b70..13d4ee3e 100644
--- a/extensions/vscode-colorize-tests/package.json
+++ b/extensions/vscode-colorize-tests/package.json
@@ -2,3 +2,3 @@
@@ -470,7 +508,7 @@ index 1abff3d..5d87461 100644
+ "description": "Colorize tests for !!APP_NAME!!",
"version": "0.0.1",
diff --git a/extensions/vscode-colorize-tests/test/colorize-fixtures/14119.less b/extensions/vscode-colorize-tests/test/colorize-fixtures/14119.less
-index a0006d8..132b67e 100644
+index a0006d85..132b67ea 100644
--- a/extensions/vscode-colorize-tests/test/colorize-fixtures/14119.less
+++ b/extensions/vscode-colorize-tests/test/colorize-fixtures/14119.less
@@ -1,2 +1,2 @@
@@ -478,16 +516,16 @@ index a0006d8..132b67e 100644
+#f(@hm: "broken highlighting in !!APP_NAME!!") {
content: "";
diff --git a/extensions/vscode-colorize-tests/test/colorize-results/14119_less.json b/extensions/vscode-colorize-tests/test/colorize-results/14119_less.json
-index 6680753..da1795a 100644
+index 313fe87c..24ba85c7 100644
--- a/extensions/vscode-colorize-tests/test/colorize-results/14119_less.json
+++ b/extensions/vscode-colorize-tests/test/colorize-results/14119_less.json
-@@ -114,3 +114,3 @@
+@@ -130,3 +130,3 @@
{
- "c": "broken highlighting in VS Code",
+ "c": "broken highlighting in !!APP_NAME!!",
"t": "source.css.less meta.selector.less meta.group.less meta.property-value.less string.quoted.double.less",
diff --git a/extensions/vscode-test-resolver/package.json b/extensions/vscode-test-resolver/package.json
-index 0990d7c..e34d7c4 100644
+index 9b0de50d..b0318720 100644
--- a/extensions/vscode-test-resolver/package.json
+++ b/extensions/vscode-test-resolver/package.json
@@ -2,3 +2,3 @@
@@ -496,7 +534,7 @@ index 0990d7c..e34d7c4 100644
+ "description": "Test resolver for !!APP_NAME!!",
"version": "0.0.1",
diff --git a/extensions/vscode-test-resolver/src/download.ts b/extensions/vscode-test-resolver/src/download.ts
-index a351aa7..c32e3ef 100644
+index a351aa77..c32e3efd 100644
--- a/extensions/vscode-test-resolver/src/download.ts
+++ b/extensions/vscode-test-resolver/src/download.ts
@@ -32,3 +32,3 @@ async function downloadVSCodeServerArchive(updateUrl: string, commit: string, qu
@@ -530,24 +568,24 @@ index a351aa7..c32e3ef 100644
+ throw Error(`Failed to download and unzip !!APP_NAME!! ${quality} - ${commit}`);
}
diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts
-index c342647..17af7ae 100644
+index 5c9b4785..d35897b2 100644
--- a/extensions/vscode-test-resolver/src/extension.ts
+++ b/extensions/vscode-test-resolver/src/extension.ts
-@@ -180,3 +180,3 @@ export function activate(context: vscode.ExtensionContext) {
+@@ -215,3 +215,3 @@ export function activate(context: vscode.ExtensionContext) {
const serverBin = path.join(remoteDataDir, 'bin');
- progress.report({ message: 'Installing VSCode Server' });
+ progress.report({ message: 'Installing !!APP_NAME!! Server' });
serverLocation = await downloadAndUnzipVSCodeServer(updateUrl, commit, quality, serverBin, m => outputChannel.appendLine(m));
diff --git a/src/main.ts b/src/main.ts
-index 42f599c..1f90b59 100644
+index f70cf87e..c6ad520f 100644
--- a/src/main.ts
+++ b/src/main.ts
-@@ -413,3 +413,3 @@ function createDefaultArgvConfigSync(argvConfigPath: string): void {
+@@ -421,3 +421,3 @@ function createDefaultArgvConfigSync(argvConfigPath: string): void {
const defaultArgvConfigContent = [
- '// This configuration file allows you to pass permanent command line arguments to VS Code.',
+ '// This configuration file allows you to pass permanent command line arguments to !!APP_NAME!!.',
'// Only a subset of arguments is currently supported to reduce the likelihood of breaking',
-@@ -419,6 +419,6 @@ function createDefaultArgvConfigSync(argvConfigPath: string): void {
+@@ -427,6 +427,6 @@ function createDefaultArgvConfigSync(argvConfigPath: string): void {
'//',
- '// NOTE: Changing this file requires a restart of VS Code.',
+ '// NOTE: Changing this file requires a restart of !!APP_NAME!!.',
@@ -557,16 +595,16 @@ index 42f599c..1f90b59 100644
+ ' // This can help in cases where you see rendering issues in !!APP_NAME!!.',
' // "disable-hardware-acceleration": true',
diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts
-index c2c70d3..44941e9 100644
+index 811673d0..f49ee713 100644
--- a/src/vs/code/electron-main/app.ts
+++ b/src/vs/code/electron-main/app.ts
-@@ -550,3 +550,3 @@ export class CodeApplication extends Disposable {
+@@ -610,3 +610,3 @@ export class CodeApplication extends Disposable {
async startup(): Promise {
- this.logService.debug('Starting VS Code');
+ this.logService.debug('Starting !!APP_NAME!!');
this.logService.debug(`from: ${this.environmentMainService.appRoot}`);
diff --git a/src/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.ts b/src/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.ts
-index a200bf8..425936a 100644
+index a200bf81..425936a8 100644
--- a/src/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.ts
+++ b/src/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.ts
@@ -19,3 +19,3 @@ export class ToggleTabFocusModeAction extends Action2 {
@@ -575,7 +613,7 @@ index a200bf8..425936a 100644
+ title: nls.localize2({ key: 'toggle.tabMovesFocus', comment: ['Turn on/off use of tab key for moving focus around !!APP_NAME!!'] }, 'Toggle Tab Key Moves Focus'),
precondition: undefined,
diff --git a/src/vs/platform/contextkey/common/contextkeys.ts b/src/vs/platform/contextkey/common/contextkeys.ts
-index c256dba..10a79c8 100644
+index c256dba0..10a79c82 100644
--- a/src/vs/platform/contextkey/common/contextkeys.ts
+++ b/src/vs/platform/contextkey/common/contextkeys.ts
@@ -19,3 +19,3 @@ export const IsMobileContext = new RawContextKey('isMobile', isMobile,
@@ -584,7 +622,7 @@ index c256dba..10a79c8 100644
+export const ProductQualityContext = new RawContextKey('productQualityType', '', localize('productQualityType', "Quality type of !!APP_NAME!!"));
diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts
-index cef0d3c..e6016ae 100644
+index 6eefd716..e6cafc5d 100644
--- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts
+++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts
@@ -153,3 +153,3 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi
@@ -592,30 +630,18 @@ index cef0d3c..e6016ae 100644
- throw new Error(nls.localize('incompatible', "Unable to install extension '{0}' as it is not compatible with VS Code '{1}'.", extensionId, this.productService.version));
+ throw new Error(nls.localize('incompatible', "Unable to install extension '{0}' as it is not compatible with !!APP_NAME!! '{1}'.", extensionId, this.productService.version));
}
-@@ -1065,3 +1065,3 @@ class InstallExtensionInProfileTask extends AbstractExtensionTask `'${p}'`).join(', '),
diff --git a/src/vs/platform/externalTerminal/node/externalTerminalService.ts b/src/vs/platform/externalTerminal/node/externalTerminalService.ts
-index e7cf3f5..4424cc7 100644
+index e7cf3f54..4424cc7f 100644
--- a/src/vs/platform/externalTerminal/node/externalTerminalService.ts
+++ b/src/vs/platform/externalTerminal/node/externalTerminalService.ts
@@ -17,3 +17,3 @@ import { ITerminalEnvironment } from '../../terminal/common/terminal.js';
@@ -624,52 +650,57 @@ index e7cf3f5..4424cc7 100644
+const TERMINAL_TITLE = nls.localize('console.title', "!!APP_NAME!! Console");
diff --git a/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts b/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts
-index 27fd88b..ad97d7b 100644
+index cf059eab..16a69a47 100644
--- a/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts
+++ b/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts
-@@ -339,3 +339,3 @@ const terminalPlatformConfiguration: IConfigurationNode = {
+@@ -396,3 +396,3 @@ const terminalPlatformConfiguration: IConfigurationNode = {
scope: ConfigurationScope.APPLICATION,
- description: localize('terminal.integrated.inheritEnv', "Whether new shells should inherit their environment from VS Code, which may source a login shell to ensure $PATH and other development variables are initialized. This has no effect on Windows."),
+ description: localize('terminal.integrated.inheritEnv', "Whether new shells should inherit their environment from !!APP_NAME!!, which may source a login shell to ensure $PATH and other development variables are initialized. This has no effect on Windows."),
type: 'boolean',
diff --git a/src/vs/platform/update/common/update.config.contribution.ts b/src/vs/platform/update/common/update.config.contribution.ts
-index 53e3a78..888a549 100644
+index 2c63e9e6..db27f74e 100644
--- a/src/vs/platform/update/common/update.config.contribution.ts
+++ b/src/vs/platform/update/common/update.config.contribution.ts
-@@ -71,3 +71,3 @@ configurationRegistry.registerConfiguration({
+@@ -70,3 +70,3 @@ configurationRegistry.registerConfiguration({
title: localize('enableWindowsBackgroundUpdatesTitle', "Enable Background Updates"),
- description: localize('enableWindowsBackgroundUpdates', "Enable to download and install new VS Code versions in the background."),
+ description: localize('enableWindowsBackgroundUpdates', "Enable to download and install new !!APP_NAME!! versions in the background."),
included: isWindows && !isWeb
diff --git a/src/vs/platform/update/electron-main/abstractUpdateService.ts b/src/vs/platform/update/electron-main/abstractUpdateService.ts
-index c943bca..d5c8506 100644
+index 8cf5dceb..611001b3 100644
--- a/src/vs/platform/update/electron-main/abstractUpdateService.ts
+++ b/src/vs/platform/update/electron-main/abstractUpdateService.ts
-@@ -69,3 +69,3 @@ export type UpdateErrorClassification = {
+@@ -74,3 +74,3 @@ export type UpdateErrorClassification = {
messageHash: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The hash of the error message.' };
- comment: 'This is used to know how often VS Code updates have failed.';
+ comment: 'This is used to know how often !!APP_NAME!! updates have failed.';
};
diff --git a/src/vs/server/node/server.cli.ts b/src/vs/server/node/server.cli.ts
-index 58ff362..9bf7ed9 100644
+index 58ff362b..54815f3c 100644
--- a/src/vs/server/node/server.cli.ts
+++ b/src/vs/server/node/server.cli.ts
+@@ -93,3 +93,3 @@ export async function main(desc: ProductDescription, args: string[]): Promise('columnOrOptions', 'Either the column in which to open or editor options, see vscode.TextDocumentShowOptions',
diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts
-index 92e874d..d59e726 100644
+index 92e874dc..d59e726e 100644
--- a/src/vs/workbench/api/common/extHostCommands.ts
+++ b/src/vs/workbench/api/common/extHostCommands.ts
@@ -464,4 +464,4 @@ export class ApiCommandArgument {
@@ -697,8 +728,20 @@ index 92e874d..d59e726 100644
+ static readonly TestItem = new ApiCommandArgument('testItem', 'A !!APP_NAME!! TestItem', v => v instanceof TestItemImpl, extHostTypeConverter.TestItem.from);
+ static readonly TestProfile = new ApiCommandArgument('testProfile', 'A !!APP_NAME!! test profile', v => v instanceof extHostTypes.TestRunProfileBase, extHostTypeConverter.TestRunProfile.from);
+diff --git a/src/vs/workbench/api/node/loopbackServer.ts b/src/vs/workbench/api/node/loopbackServer.ts
+index 1d32a486..ae5c4c7e 100644
+--- a/src/vs/workbench/api/node/loopbackServer.ts
++++ b/src/vs/workbench/api/node/loopbackServer.ts
+@@ -190,7 +190,2 @@ export class LoopbackAuthServer implements ILoopbackServer {
+ let backgroundImage = 'url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQABAMAAACNMzawAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAJ1BMVEUAAAD///9Qm8+ozed8tNsWer+Lvd9trNfF3u9Ck8slgsMzi8eZxeM/Qa6mAAAAAXRSTlMAQObYZgAAAAFiS0dEAf8CLd4AAAAHdElNRQfiCwYULRt0g+ZLAAAJRUlEQVR42u3SUY0CQRREUSy0hSZtBA+wfOwv4wAPYwAJSMAfAthkB6YD79HnKqikzmYjSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk6cmKhg4AAASAABAAAkAACAABIAAEgAAQAAJAAAgAAaBvBVAjtV2wfFe1ogcA+0gdFgBoe60IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAjAP/1MkWoAvBvAsUTqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAgAASAABIAAEAACQAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKA7gDlbFwC6AijZagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDM2boA0BXAqAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIATARAAAkAAvF7N1hWArgBKthoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfBrAlK0bAF0BjBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4EQABIAAEwOtN2boB0BVAyVYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgE8DqNm6AtAVwKgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEwEQAAJAAPzd7xypMwDvBnAskToBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAIAAkAACAABIAAEgAAQAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAkAACAABIAAEgAAQAAJAAAgAASAABIAAEAACQAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBKBGarsAwK5qRQ8ANGYAACAABIAAEAACQAAIAAEgAASAABAAAkDfCUCSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJC3uDtO80OSql+i8AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTExLTA2VDIwOjQ1OjI3KzAwOjAwEjLurQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0xMS0wNlQyMDo0NToyNyswMDowMGNvVhEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAAElFTkSuQmCC\')';
+- if (this._appName === 'Visual Studio Code') {
+- backgroundImage = 'url(\'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI1NiIgdmlld0JveD0iMCAwIDI1NiAyNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS41MzQgMjU0LjI1MkMxODUuNTY2IDI1NS44MjMgMTkwLjE2NCAyNTUuNzIyIDE5NC4yMzQgMjUzLjc2NEwyNDYuOTQgMjI4LjQwM0MyNTIuNDc4IDIyNS43MzggMjU2IDIyMC4xMzIgMjU2IDIxMy45ODNWNDIuMDE4MUMyNTYgMzUuODY4OSAyNTIuNDc4IDMwLjI2MzggMjQ2Ljk0IDI3LjU5ODhMMTk0LjIzNCAyLjIzNjgxQzE4OC44OTMgLTAuMzMzMTMyIDE4Mi42NDIgMC4yOTYzNDQgMTc3Ljk1NSAzLjcwNDE4QzE3Ny4yODUgNC4xOTEgMTc2LjY0NyA0LjczNDU0IDE3Ni4wNDkgNS4zMzM1NEw3NS4xNDkgOTcuMzg2MkwzMS4xOTkyIDY0LjAyNDdDMjcuMTA3OSA2MC45MTkxIDIxLjM4NTMgNjEuMTczNSAxNy41ODU1IDY0LjYzTDMuNDg5MzYgNzcuNDUyNUMtMS4xNTg1MyA4MS42ODA1IC0xLjE2Mzg2IDg4Ljk5MjYgMy40Nzc4NSA5My4yMjc0TDQxLjU5MjYgMTI4TDMuNDc3ODUgMTYyLjc3M0MtMS4xNjM4NiAxNjcuMDA4IC0xLjE1ODUzIDE3NC4zMiAzLjQ4OTM2IDE3OC41NDhMMTcuNTg1NSAxOTEuMzdDMjEuMzg1MyAxOTQuODI3IDI3LjEwNzkgMTk1LjA4MSAzMS4xOTkyIDE5MS45NzZMNzUuMTQ5IDE1OC42MTRMMTc2LjA0OSAyNTAuNjY3QzE3Ny42NDUgMjUyLjI2NCAxNzkuNTE5IDI1My40NjcgMTgxLjUzNCAyNTQuMjUyWk0xOTIuMDM5IDY5Ljg4NTNMMTE1LjQ3OSAxMjhMMTkyLjAzOSAxODYuMTE1VjY5Ljg4NTNaIiBmaWxsPSJ3aGl0ZSIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazApIj4KPHBhdGggZD0iTTI0Ni45NCAyNy42MzgzTDE5NC4xOTMgMi4yNDEzOEMxODguMDg4IC0wLjY5ODMwMiAxODAuNzkxIDAuNTQxNzIxIDE3NS45OTkgNS4zMzMzMkwzLjMyMzcxIDE2Mi43NzNDLTEuMzIwODIgMTY3LjAwOCAtMS4zMTU0OCAxNzQuMzIgMy4zMzUyMyAxNzguNTQ4TDE3LjQzOTkgMTkxLjM3QzIxLjI0MjEgMTk0LjgyNyAyNi45NjgyIDE5NS4wODEgMzEuMDYxOSAxOTEuOTc2TDIzOS4wMDMgMzQuMjI2OUMyNDUuOTc5IDI4LjkzNDcgMjU1Ljk5OSAzMy45MTAzIDI1NS45OTkgNDIuNjY2N1Y0Mi4wNTQzQzI1NS45OTkgMzUuOTA3OCAyNTIuNDc4IDMwLjMwNDcgMjQ2Ljk0IDI3LjYzODNaIiBmaWxsPSIjMDA2NUE5Ii8+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2QpIj4KPHBhdGggZD0iTTI0Ni45NCAyMjguMzYyTDE5NC4xOTMgMjUzLjc1OUMxODguMDg4IDI1Ni42OTggMTgwLjc5MSAyNTUuNDU4IDE3NS45OTkgMjUwLjY2N0wzLjMyMzcxIDkzLjIyNzJDLTEuMzIwODIgODguOTkyNSAtMS4zMTU0OCA4MS42ODAyIDMuMzM1MjMgNzcuNDUyM0wxNy40Mzk5IDY0LjYyOThDMjEuMjQyMSA2MS4xNzMzIDI2Ljk2ODIgNjAuOTE4OCAzMS4wNjE5IDY0LjAyNDVMMjM5LjAwMyAyMjEuNzczQzI0NS45NzkgMjI3LjA2NSAyNTUuOTk5IDIyMi4wOSAyNTUuOTk5IDIxMy4zMzNWMjEzLjk0NkMyNTUuOTk5IDIyMC4wOTIgMjUyLjQ3OCAyMjUuNjk1IDI0Ni45NCAyMjguMzYyWiIgZmlsbD0iIzAwN0FDQyIvPgo8L2c+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2QpIj4KPHBhdGggZD0iTTE5NC4xOTYgMjUzLjc2M0MxODguMDg5IDI1Ni43IDE4MC43OTIgMjU1LjQ1OSAxNzYgMjUwLjY2N0MxODEuOTA0IDI1Ni41NzEgMTkyIDI1Mi4zODkgMTkyIDI0NC4wMzlWMTEuOTYwNkMxOTIgMy42MTA1NyAxODEuOTA0IC0wLjU3MTE3NSAxNzYgNS4zMzMyMUMxODAuNzkyIDAuNTQxMTY2IDE4OC4wODkgLTAuNzAwNjA3IDE5NC4xOTYgMi4yMzY0OEwyNDYuOTM0IDI3LjU5ODVDMjUyLjQ3NiAzMC4yNjM1IDI1NiAzNS44Njg2IDI1NiA0Mi4wMTc4VjIxMy45ODNDMjU2IDIyMC4xMzIgMjUyLjQ3NiAyMjUuNzM3IDI0Ni45MzQgMjI4LjQwMkwxOTQuMTk2IDI1My43NjNaIiBmaWxsPSIjMUY5Q0YwIi8+CjwvZz4KPGcgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm92ZXJsYXkiIG9wYWNpdHk9IjAuMjUiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS4zNzggMjU0LjI1MkMxODUuNDEgMjU1LjgyMiAxOTAuMDA4IDI1NS43MjIgMTk0LjA3NyAyNTMuNzY0TDI0Ni43ODMgMjI4LjQwMkMyNTIuMzIyIDIyNS43MzcgMjU1Ljg0NCAyMjAuMTMyIDI1NS44NDQgMjEzLjk4M1Y0Mi4wMTc5QzI1NS44NDQgMzUuODY4NyAyNTIuMzIyIDMwLjI2MzYgMjQ2Ljc4NCAyNy41OTg2TDE5NC4wNzcgMi4yMzY2NUMxODguNzM3IC0wLjMzMzI5OSAxODIuNDg2IDAuMjk2MTc3IDE3Ny43OTggMy43MDQwMUMxNzcuMTI5IDQuMTkwODMgMTc2LjQ5MSA0LjczNDM3IDE3NS44OTIgNS4zMzMzN0w3NC45OTI3IDk3LjM4NkwzMS4wNDI5IDY0LjAyNDVDMjYuOTUxNyA2MC45MTg5IDIxLjIyOSA2MS4xNzM0IDE3LjQyOTIgNjQuNjI5OEwzLjMzMzExIDc3LjQ1MjNDLTEuMzE0NzggODEuNjgwMyAtMS4zMjAxMSA4OC45OTI1IDMuMzIxNiA5My4yMjczTDQxLjQzNjQgMTI4TDMuMzIxNiAxNjIuNzczQy0xLjMyMDExIDE2Ny4wMDggLTEuMzE0NzggMTc0LjMyIDMuMzMzMTEgMTc4LjU0OEwxNy40MjkyIDE5MS4zN0MyMS4yMjkgMTk0LjgyNyAyNi45NTE3IDE5NS4wODEgMzEuMDQyOSAxOTEuOTc2TDc0Ljk5MjcgMTU4LjYxNEwxNzUuODkyIDI1MC42NjdDMTc3LjQ4OCAyNTIuMjY0IDE3OS4zNjMgMjUzLjQ2NyAxODEuMzc4IDI1NC4yNTJaTTE5MS44ODMgNjkuODg1MUwxMTUuMzIzIDEyOEwxOTEuODgzIDE4Ni4xMTVWNjkuODg1MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2QiIHg9Ii0yMS40ODk2IiB5PSI0MC41MjI1IiB3aWR0aD0iMjk4LjgyMiIgaGVpZ2h0PSIyMzYuMTQ5IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjY2NjciLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZCIgeD0iMTU0LjY2NyIgeT0iLTIwLjY3MzUiIHdpZHRoPSIxMjIuNjY3IiBoZWlnaHQ9IjI5Ny4zNDciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im92ZXJsYXkiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvdyIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyIiB4MT0iMTI3Ljg0NCIgeTE9IjAuNjU5OTg4IiB4Mj0iMTI3Ljg0NCIgeTI9IjI1NS4zNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K\')';
+- } else if (this._appName === 'Visual Studio Code - Insiders') {
+- backgroundImage = 'url(\'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI1NiIgdmlld0JveD0iMCAwIDI1NiAyNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPgo8cGF0aCBkPSJNMTc2LjA0OSAyNTAuNjY5QzE4MC44MzggMjU1LjQ1OSAxODguMTMgMjU2LjcgMTk0LjIzNCAyNTMuNzY0TDI0Ni45NCAyMjguNDE5QzI1Mi40NzggMjI1Ljc1NSAyNTYgMjIwLjE1NCAyNTYgMjE0LjAwOFY0Mi4xNDc5QzI1NiAzNi4wMDI1IDI1Mi40NzggMzAuNDAwOCAyNDYuOTQgMjcuNzM3NEwxOTQuMjM0IDIuMzkwODlDMTg4LjEzIC0wLjU0NDQxNiAxODAuODM4IDAuNjk2NjA3IDE3Ni4wNDkgNS40ODU3MkMxODEuOTUgLTAuNDE1MDYgMTkyLjAzOSAzLjc2NDEzIDE5Mi4wMzkgMTIuMTA5MVYyNDQuMDQ2QzE5Mi4wMzkgMjUyLjM5MSAxODEuOTUgMjU2LjU3IDE3Ni4wNDkgMjUwLjY2OVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0xODEuMzc5IDE4MC42NDZMMTE0LjMzIDEyOC42MzNMMTgxLjM3OSA3NS41MTE0VjE3Ljc5NEMxODEuMzc5IDEwLjg0NzcgMTczLjEyOCA3LjIwNjczIDE2Ny45OTYgMTEuODg2Mkw3NC42NTE0IDk3Ljg1MThMMzEuMTk5NCA2NC4xNDM4QzI3LjEwODEgNjEuMDM5IDIxLjM4NTEgNjEuMjk0IDE3LjU4NTMgNjQuNzQ3NkwzLjQ4OTc0IDc3LjU2MjdDLTEuMTU4NDcgODEuNzg5MyAtMS4xNjM2NyA4OS4wOTQ4IDMuNDc2NzIgOTMuMzI5MkwxNjcuOTggMjQ0LjE4NUMxNzMuMTA3IDI0OC44ODcgMTgxLjM3OSAyNDUuMjQ5IDE4MS4zNzkgMjM4LjI5MlYxODAuNjQ2WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTM2LjY5MzcgMTM0LjE5NUwzLjQ3NjcyIDE2Mi44MjhDLTEuMTYzNjcgMTY3LjA2MiAtMS4xNTg0NyAxNzQuMzcgMy40ODk3NCAxNzguNTk0TDE3LjU4NTMgMTkxLjQwOUMyMS4zODUxIDE5NC44NjMgMjcuMTA4MSAxOTUuMTE4IDMxLjE5OTQgMTkyLjAxM0w2OS40NDcyIDE2NC4wNTdMMzYuNjkzNyAxMzQuMTk1WiIgZmlsbD0id2hpdGUiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swKSI+CjxwYXRoIGQ9Ik0xNjcuOTk2IDExLjg4NTdDMTczLjEyOCA3LjIwNjI3IDE4MS4zNzkgMTAuODQ3MyAxODEuMzc5IDE3Ljc5MzZWNzUuNTEwOUwxMDQuOTM4IDEzNi4wNzNMNjUuNTc0MiAxMDYuMjExTDE2Ny45OTYgMTEuODg1N1oiIGZpbGw9IiMwMDlBN0MiLz4KPHBhdGggZD0iTTM2LjY5MzcgMTM0LjE5NEwzLjQ3NjcyIDE2Mi44MjdDLTEuMTYzNjcgMTY3LjA2MiAtMS4xNTg0NyAxNzQuMzcgMy40ODk3NCAxNzguNTk0TDE3LjU4NTMgMTkxLjQwOUMyMS4zODUxIDE5NC44NjMgMjcuMTA4MSAxOTUuMTE4IDMxLjE5OTQgMTkyLjAxM0w2OS40NDcyIDE2NC4wNTZMMzYuNjkzNyAxMzQuMTk0WiIgZmlsbD0iIzAwOUE3QyIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kKSI+CjxwYXRoIGQ9Ik0xODEuMzc5IDE4MC42NDVMMzEuMTk5NCA2NC4xNDI3QzI3LjEwODEgNjEuMDM3OSAyMS4zODUxIDYxLjI5MjkgMTcuNTg1MyA2NC43NDY1TDMuNDg5NzQgNzcuNTYxNkMtMS4xNTg0NyA4MS43ODgyIC0xLjE2MzY3IDg5LjA5MzcgMy40NzY3MiA5My4zMjgxTDE2Ny45NzIgMjQ0LjE3NkMxNzMuMTAyIDI0OC44ODEgMTgxLjM3OSAyNDUuMjQxIDE4MS4zNzkgMjM4LjI4VjE4MC42NDVaIiBmaWxsPSIjMDBCMjk0Ii8+CjwvZz4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZCkiPgo8cGF0aCBkPSJNMTk0LjIzMyAyNTMuNzY2QzE4OC4xMyAyNTYuNzAxIDE4MC44MzcgMjU1LjQ2IDE3Ni4wNDggMjUwLjY3MUMxODEuOTQ5IDI1Ni41NzEgMTkyLjAzOSAyNTIuMzkyIDE5Mi4wMzkgMjQ0LjA0N1YxMi4xMTAzQzE5Mi4wMzkgMy43NjUzNSAxODEuOTQ5IC0wLjQxMzgzOSAxNzYuMDQ4IDUuNDg2OTRDMTgwLjgzNyAwLjY5NzgyNCAxODguMTI5IC0wLjU0MzE5MSAxOTQuMjMzIDIuMzkyMUwyNDYuOTM5IDI3LjczODZDMjUyLjQ3OCAzMC40MDIgMjU2IDM2LjAwMzcgMjU2IDQyLjE0OTFWMjE0LjAwOUMyNTYgMjIwLjE1NSAyNTIuNDc4IDIyNS43NTcgMjQ2LjkzOSAyMjguNDJMMTk0LjIzMyAyNTMuNzY2WiIgZmlsbD0iIzI0QkZBNSIvPgo8L2c+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZCIgeD0iLTIxLjMzMzMiIHk9IjQwLjY0MTMiIHdpZHRoPSIyMjQuMDQ1IiBoZWlnaHQ9IjIyNi45ODgiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4xNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2QiIHg9IjE1NC43MTUiIHk9Ii0yMC41MTY5IiB3aWR0aD0iMTIyLjYxOCIgaGVpZ2h0PSIyOTcuMTkxIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjY2NjciLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg==\')';
+- }
+ return `
diff --git a/src/vs/workbench/api/test/browser/extHostNotebook.test.ts b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts
-index 0d71384..ae8d169 100644
+index 0d713847..ae8d169b 100644
--- a/src/vs/workbench/api/test/browser/extHostNotebook.test.ts
+++ b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts
@@ -364,3 +364,3 @@ suite('NotebookCell#Document', function () {
@@ -707,25 +750,25 @@ index 0d71384..ae8d169 100644
+ test('Opening a notebook results in !!APP_NAME!! firing the event onDidChangeActiveNotebookEditor twice #118470', function () {
let count = 0;
diff --git a/src/vs/workbench/browser/actions/developerActions.ts b/src/vs/workbench/browser/actions/developerActions.ts
-index 91f52f5..dbb0ad4 100644
+index ee85640c..4b1bb35f 100644
--- a/src/vs/workbench/browser/actions/developerActions.ts
+++ b/src/vs/workbench/browser/actions/developerActions.ts
-@@ -688,3 +688,3 @@ class PolicyDiagnosticsAction extends Action2 {
+@@ -690,3 +690,3 @@ class PolicyDiagnosticsAction extends Action2 {
- let content = '# VS Code Policy Diagnostics\n\n';
+ let content = '# !!APP_NAME!! Policy Diagnostics\n\n';
content += '*WARNING: This file may contain sensitive information.*\n\n';
diff --git a/src/vs/workbench/browser/actions/helpActions.ts b/src/vs/workbench/browser/actions/helpActions.ts
-index 7e4fb7b..b459421 100644
+index 8251c4a4..b236d547 100644
--- a/src/vs/workbench/browser/actions/helpActions.ts
+++ b/src/vs/workbench/browser/actions/helpActions.ts
-@@ -163,3 +163,3 @@ class OpenNewsletterSignupUrlAction extends Action2 {
+@@ -164,3 +164,3 @@ class OpenNewsletterSignupUrlAction extends Action2 {
id: OpenNewsletterSignupUrlAction.ID,
- title: localize2('newsletterSignup', 'Signup for the VS Code Newsletter'),
+ title: localize2('newsletterSignup', 'Signup for the !!APP_NAME!! Newsletter'),
category: Categories.Help,
diff --git a/src/vs/workbench/browser/web.factory.ts b/src/vs/workbench/browser/web.factory.ts
-index e342f83..7c314e6 100644
+index e342f838..7c314e6b 100644
--- a/src/vs/workbench/browser/web.factory.ts
+++ b/src/vs/workbench/browser/web.factory.ts
@@ -35,3 +35,3 @@ export function create(domElement: HTMLElement, options: IWorkbenchConstructionO
@@ -734,47 +777,47 @@ index e342f83..7c314e6 100644
+ throw new Error('Unable to create the !!APP_NAME!! workbench more than once.');
} else {
diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts
-index 058693c..9c3afe3 100644
+index f2a3b35e..b52ae385 100644
--- a/src/vs/workbench/browser/workbench.contribution.ts
+++ b/src/vs/workbench/browser/workbench.contribution.ts
-@@ -806,3 +806,3 @@ const registry = Registry.as(ConfigurationExtensions.Con
+@@ -835,3 +835,3 @@ const registry = Registry.as(ConfigurationExtensions.Con
localize('profileName', "`${profileName}`: name of the profile in which the workspace is opened (e.g. Data Science (Profile)). Ignored if default profile is used."),
- localize('appName', "`${appName}`: e.g. VS Code."),
+ localize('appName', "`${appName}`: e.g. !!APP_NAME!!."),
localize('remoteName', "`${remoteName}`: e.g. SSH"),
diff --git a/src/vs/workbench/common/contextkeys.ts b/src/vs/workbench/common/contextkeys.ts
-index c034874..b0bb4a0 100644
+index 51a4a3f2..e83d47da 100644
--- a/src/vs/workbench/common/contextkeys.ts
+++ b/src/vs/workbench/common/contextkeys.ts
-@@ -41,3 +41,3 @@ export const EmbedderIdentifierContext = new RawContextKey('
+@@ -40,3 +40,3 @@ export const EmbedderIdentifierContext = new RawContextKey('
-export const InAutomationContext = new RawContextKey('inAutomation', false, localize('inAutomation', "Whether VS Code is running under automation/smoke test"));
+export const InAutomationContext = new RawContextKey('inAutomation', false, localize('inAutomation', "Whether !!APP_NAME!! is running under automation/smoke test"));
-diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts
-index ae0171f..060350f 100644
---- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts
-+++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts
-@@ -558,3 +558,3 @@ configurationRegistry.registerConfiguration({
+diff --git a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts
+index 883dab9e..825ebc1f 100644
+--- a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts
++++ b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts
+@@ -804,3 +804,3 @@ configurationRegistry.registerConfiguration({
nls.localize('chat.mcp.access.none', "No access to MCP servers."),
- nls.localize('chat.mcp.access.registry', "Allows access to MCP servers installed from the registry that VS Code is connected to."),
+ nls.localize('chat.mcp.access.registry', "Allows access to MCP servers installed from the registry that !!APP_NAME!! is connected to."),
nls.localize('chat.mcp.access.any', "Allow access to any installed MCP server.")
-@@ -585,3 +585,3 @@ configurationRegistry.registerConfiguration({
+@@ -831,3 +831,3 @@ configurationRegistry.registerConfiguration({
{
- key: 'chat.mcp.access.registry', value: nls.localize('chat.mcp.access.registry', "Allows access to MCP servers installed from the registry that VS Code is connected to."),
+ key: 'chat.mcp.access.registry', value: nls.localize('chat.mcp.access.registry', "Allows access to MCP servers installed from the registry that !!APP_NAME!! is connected to."),
},
diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.ts b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.ts
-index 1936819..8f3bd30 100644
+index 1417e0dc..24d713d2 100644
--- a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.ts
+++ b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.ts
-@@ -119,3 +119,3 @@ export class SetupAgent extends Disposable implements IChatAgentImplementation {
+@@ -120,3 +120,3 @@ export class SetupAgent extends Disposable implements IChatAgentImplementation {
// Register VSCode agent
- const { disposable: vscodeDisposable } = SetupAgent.doRegisterAgent(instantiationService, chatAgentService, 'setup.vscode', 'vscode', false, localize2('vscodeAgentDescription', "Ask questions about VS Code").value, ChatAgentLocation.Chat, ChatModeKind.Agent, context, controller);
+ const { disposable: vscodeDisposable } = SetupAgent.doRegisterAgent(instantiationService, chatAgentService, 'setup.vscode', 'vscode', false, localize2('vscodeAgentDescription', "Ask questions about !!APP_NAME!!").value, ChatAgentLocation.Chat, ChatModeKind.Agent, context, controller);
disposables.add(vscodeDisposable);
-@@ -136,4 +136,4 @@ export class SetupAgent extends Disposable implements IChatAgentImplementation {
+@@ -137,4 +137,4 @@ export class SetupAgent extends Disposable implements IChatAgentImplementation {
displayName: localize('setupToolDisplayName', "New Workspace"),
- modelDescription: 'Scaffold a new workspace in VS Code',
- userDescription: localize('setupToolsDescription', "Scaffold a new workspace in VS Code"),
@@ -782,19 +825,34 @@ index 1936819..8f3bd30 100644
+ userDescription: localize('setupToolsDescription', "Scaffold a new workspace in !!APP_NAME!!"),
canBeReferencedInPrompt: true,
diff --git a/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.ts b/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.ts
-index d814c0b..66237e0 100644
+index d3be4e1e..7390a174 100644
--- a/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.ts
+++ b/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.ts
-@@ -248,5 +248,5 @@ export class PromptValidator {
+@@ -290,5 +290,5 @@ export class PromptValidator {
if (validGithubCopilotAttributeNames.value.has(attribute.key)) {
-- report(toMarker(localize('promptValidator.ignoredAttribute.vscode-agent', "Attribute '{0}' is ignored when running locally in VS Code.", attribute.key), attribute.range, MarkerSeverity.Info));
-+ report(toMarker(localize('promptValidator.ignoredAttribute.vscode-agent', "Attribute '{0}' is ignored when running locally in !!APP_NAME!!.", attribute.key), attribute.range, MarkerSeverity.Info));
+- report(toMarker(localize('promptValidator.ignoredAttribute.vscode-agent', "Attribute '{0}' is ignored when running locally in VS Code.", attribute.key), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
++ report(toMarker(localize('promptValidator.ignoredAttribute.vscode-agent', "Attribute '{0}' is ignored when running locally in !!APP_NAME!!.", attribute.key), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
} else {
-- report(toMarker(localize('promptValidator.unknownAttribute.vscode-agent', "Attribute '{0}' is not supported in VS Code agent files. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Warning));
-+ report(toMarker(localize('promptValidator.unknownAttribute.vscode-agent', "Attribute '{0}' is not supported in !!APP_NAME!! agent files. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Warning));
+- report(toMarker(localize('promptValidator.unknownAttribute.vscode-agent', "Attribute '{0}' is not supported in VS Code agent files. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
++ report(toMarker(localize('promptValidator.unknownAttribute.vscode-agent', "Attribute '{0}' is not supported in !!APP_NAME!! agent files. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
}
+@@ -298,3 +298,3 @@ export class PromptValidator {
+ if (target === Target.Claude) {
+- report(toMarker(localize('promptValidator.unknownAttribute.rules', "Attribute '{0}' is not supported in rules files by VS Code agents. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
++ report(toMarker(localize('promptValidator.unknownAttribute.rules', "Attribute '{0}' is not supported in rules files by !!APP_NAME!! agents. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
+ } else {
+@@ -304,3 +304,3 @@ export class PromptValidator {
+ case PromptsType.skill:
+- report(toMarker(localize('promptValidator.unknownAttribute.skill', "Attribute '{0}' is not supported by VS Code agents. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
++ report(toMarker(localize('promptValidator.unknownAttribute.skill', "Attribute '{0}' is not supported by !!APP_NAME!! agents. Supported: {1}.", attribute.key, supportedNames.value), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
+ break;
+@@ -1107,3 +1107,3 @@ export function mapClaudeModels(claudeModelNames: readonly string[]): readonly s
+ /**
+- * Maps Claude tool names to their VS Code tool equivalents.
++ * Maps Claude tool names to their !!APP_NAME!! tool equivalents.
+ */
diff --git a/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts b/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts
-index 0b9ced3..731d952 100644
+index 0b9ced32..731d9526 100644
--- a/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts
+++ b/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts
@@ -177,3 +177,3 @@ export class AdapterManager extends Disposable implements IAdapterManager {
@@ -803,30 +861,30 @@ index 0b9ced3..731d952 100644
+ description: nls.localize('debugServer', "For debug extension development only: if a port is specified !!APP_NAME!! tries to connect to a debug adapter running in server mode"),
default: 4711
diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts
-index 6e2b340..dfcfccb 100644
+index 0c0965d3..9b9876ee 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts
-@@ -363,3 +363,3 @@ CommandsRegistry.registerCommand({
+@@ -419,3 +419,3 @@ CommandsRegistry.registerCommand({
description: '(optional) Options for installing the extension. Object with the following properties: ' +
- '`installOnlyNewlyAddedFromExtensionPackVSIX`: When enabled, VS Code installs only newly added extensions from the extension pack VSIX. This option is considered only when installing VSIX. ',
+ '`installOnlyNewlyAddedFromExtensionPackVSIX`: When enabled, !!APP_NAME!! installs only newly added extensions from the extension pack VSIX. This option is considered only when installing VSIX. ',
isOptional: true,
-@@ -370,3 +370,3 @@ CommandsRegistry.registerCommand({
+@@ -426,3 +426,3 @@ CommandsRegistry.registerCommand({
'type': 'boolean',
- 'description': localize('workbench.extensions.installExtension.option.installOnlyNewlyAddedFromExtensionPackVSIX', "When enabled, VS Code installs only newly added extensions from the extension pack VSIX. This option is considered only while installing a VSIX."),
+ 'description': localize('workbench.extensions.installExtension.option.installOnlyNewlyAddedFromExtensionPackVSIX', "When enabled, !!APP_NAME!! installs only newly added extensions from the extension pack VSIX. This option is considered only while installing a VSIX."),
default: false
-@@ -375,3 +375,3 @@ CommandsRegistry.registerCommand({
+@@ -431,3 +431,3 @@ CommandsRegistry.registerCommand({
'type': 'boolean',
- 'description': localize('workbench.extensions.installExtension.option.installPreReleaseVersion', "When enabled, VS Code installs the pre-release version of the extension if available."),
+ 'description': localize('workbench.extensions.installExtension.option.installPreReleaseVersion', "When enabled, !!APP_NAME!! installs the pre-release version of the extension if available."),
default: false
-@@ -380,3 +380,3 @@ CommandsRegistry.registerCommand({
+@@ -436,3 +436,3 @@ CommandsRegistry.registerCommand({
'type': 'boolean',
- 'description': localize('workbench.extensions.installExtension.option.donotSync', "When enabled, VS Code do not sync this extension when Settings Sync is on."),
+ 'description': localize('workbench.extensions.installExtension.option.donotSync', "When enabled, !!APP_NAME!! do not sync this extension when Settings Sync is on."),
default: false
-@@ -909,4 +909,4 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
+@@ -961,4 +961,4 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
Severity.Info,
- vsixs.length > 1 ? localize('InstallVSIXs.successReload', "Completed installing extensions. Please reload Visual Studio Code to enable them.")
- : localize('InstallVSIXAction.successReload', "Completed installing extension. Please reload Visual Studio Code to enable it."),
@@ -834,7 +892,7 @@ index 6e2b340..dfcfccb 100644
+ : localize('InstallVSIXAction.successReload', "Completed installing extension. Please reload VSCodium to enable it."),
[{
diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts
-index d1dacd0..035239a 100644
+index 452db88d..cd67d238 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts
@@ -109,3 +109,3 @@ export class PromptExtensionInstallFailureAction extends Action {
@@ -852,27 +910,27 @@ index d1dacd0..035239a 100644
- alert(localize('uninstallExtensionComplete', "Please reload Visual Studio Code to complete the uninstallation of the extension {0}.", this.extension.displayName));
+ alert(localize('uninstallExtensionComplete', "Please reload !!APP_NAME!! to complete the uninstallation of the extension {0}.", this.extension.displayName));
} catch (error) {
-@@ -2598,3 +2598,3 @@ export class ExtensionStatusAction extends ExtensionAction {
+@@ -2825,3 +2825,3 @@ export class ExtensionStatusAction extends ExtensionAction {
const link = `[${localize('settings', "settings")}](${createCommandUri('workbench.action.openSettings', this.extension.deprecationInfo.settings.map(setting => `@id:${setting}`).join(' '))}})`;
- this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated with alternate settings tooltip', "This extension is deprecated as this functionality is now built-in to VS Code. Configure these {0} to use this functionality.", link)) }, true);
+ this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated with alternate settings tooltip', "This extension is deprecated as this functionality is now built-in to !!APP_NAME!!. Configure these {0} to use this functionality.", link)) }, true);
} else {
diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
-index de71064..d0035cc 100644
+index a58d77d1..7c1aae76 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
-@@ -478,3 +478,3 @@ export class Extension implements IExtension {
+@@ -479,3 +479,3 @@ export class Extension implements IExtension {
return Promise.resolve(`# ${this.displayName || this.name}
-**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled.
+**Notice:** This extension is bundled with !!APP_NAME!!. It can be disabled but not uninstalled.
## Features
-@@ -516,3 +516,3 @@ ${this.description}
+@@ -517,3 +517,3 @@ ${this.description}
if (this.type === ExtensionType.System) {
- return Promise.resolve(`Please check the [VS Code Release Notes](command:${ShowCurrentReleaseNotesActionId}) for changes to the built-in extensions.`);
+ return Promise.resolve(`Please check the [!!APP_NAME!! Release Notes](command:${ShowCurrentReleaseNotesActionId}) for changes to the built-in extensions.`);
}
diff --git a/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate.ts b/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate.ts
-index 818e662..2d2ead7 100644
+index 818e6628..2d2ead7a 100644
--- a/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate.ts
+++ b/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate.ts
@@ -29,3 +29,3 @@ export const ExtensionsConfigurationSchema: IJSONSchema = {
@@ -885,17 +943,28 @@ index 818e662..2d2ead7 100644
- '\t// List of extensions recommended by VS Code that should not be recommended for users of this workspace.',
+ '\t// List of extensions recommended by !!APP_NAME!! that should not be recommended for users of this workspace.',
'\t"unwantedRecommendations": [',
+diff --git a/src/vs/workbench/contrib/extensions/common/installExtensionsTool.ts b/src/vs/workbench/contrib/extensions/common/installExtensionsTool.ts
+index d174c8c9..a7160f60 100644
+--- a/src/vs/workbench/contrib/extensions/common/installExtensionsTool.ts
++++ b/src/vs/workbench/contrib/extensions/common/installExtensionsTool.ts
+@@ -19,3 +19,3 @@ export const InstallExtensionsToolData: IToolData = {
+ displayName: localize('installExtensionsTool.displayName', 'Install Extensions'),
+- modelDescription: 'This is a tool for installing extensions in Visual Studio Code. You should provide the list of extension ids to install. The identifier of an extension is \'\${ publisher }.\${ name }\' for example: \'vscode.csharp\'.',
++ modelDescription: 'This is a tool for installing extensions in !!APP_NAME!!. You should provide the list of extension ids to install. The identifier of an extension is \'\${ publisher }.\${ name }\' for example: \'vscode.csharp\'.',
+ userDescription: localize('installExtensionsTool.userDescription', 'Tool for installing extensions'),
diff --git a/src/vs/workbench/contrib/extensions/common/searchExtensionsTool.ts b/src/vs/workbench/contrib/extensions/common/searchExtensionsTool.ts
-index 91541b6..ccb9414 100644
+index 91541b6a..6e2e8207 100644
--- a/src/vs/workbench/contrib/extensions/common/searchExtensionsTool.ts
+++ b/src/vs/workbench/contrib/extensions/common/searchExtensionsTool.ts
-@@ -23,3 +23,3 @@ export const SearchExtensionsToolData: IToolData = {
- modelDescription: 'This is a tool for browsing Visual Studio Code Extensions Marketplace. It allows the model to search for extensions and retrieve detailed information about them. The model should use this tool whenever it needs to discover extensions or resolve information about known ones. To use the tool, the model has to provide the category of the extensions, relevant search keywords, or known extension IDs. Note that search results may include false positives, so reviewing and filtering is recommended.',
+@@ -22,4 +22,4 @@ export const SearchExtensionsToolData: IToolData = {
+ displayName: localize('searchExtensionsTool.displayName', 'Search Extensions'),
+- modelDescription: 'This is a tool for browsing Visual Studio Code Extensions Marketplace. It allows the model to search for extensions and retrieve detailed information about them. The model should use this tool whenever it needs to discover extensions or resolve information about known ones. To use the tool, the model has to provide the category of the extensions, relevant search keywords, or known extension IDs. Note that search results may include false positives, so reviewing and filtering is recommended.',
- userDescription: localize('searchExtensionsTool.userDescription', 'Search for VS Code extensions'),
++ modelDescription: 'This is a tool for browsing OpenVSX. It allows the model to search for extensions and retrieve detailed information about them. The model should use this tool whenever it needs to discover extensions or resolve information about known ones. To use the tool, the model has to provide the category of the extensions, relevant search keywords, or known extension IDs. Note that search results may include false positives, so reviewing and filtering is recommended.',
+ userDescription: localize('searchExtensionsTool.userDescription', 'Search for !!APP_NAME!! extensions'),
source: ToolDataSource.Internal,
diff --git a/src/vs/workbench/contrib/externalUriOpener/common/configuration.ts b/src/vs/workbench/contrib/externalUriOpener/common/configuration.ts
-index f54ddfe..946de6b 100644
+index f54ddfe2..946de6be 100644
--- a/src/vs/workbench/contrib/externalUriOpener/common/configuration.ts
+++ b/src/vs/workbench/contrib/externalUriOpener/common/configuration.ts
@@ -57,3 +57,3 @@ export const externalUriOpenersConfigurationNode: IConfigurationNode = {
@@ -904,7 +973,7 @@ index f54ddfe..946de6b 100644
+ enumDescriptions: [nls.localize('externalUriOpeners.defaultId', "Open using !!APP_NAME!!'s standard opener.")],
},
diff --git a/src/vs/workbench/contrib/localization/common/localization.contribution.ts b/src/vs/workbench/contrib/localization/common/localization.contribution.ts
-index bd73995..61b7d12 100644
+index bd739953..61b7d124 100644
--- a/src/vs/workbench/contrib/localization/common/localization.contribution.ts
+++ b/src/vs/workbench/contrib/localization/common/localization.contribution.ts
@@ -58,5 +58,5 @@ export class BaseLocalizationWorkbenchContribution extends Disposable implements
@@ -916,7 +985,7 @@ index bd73995..61b7d12 100644
+ patternErrorMessage: localize('vscode.extension.contributes.localizations.translations.id.pattern', "Id should be `vscode` or in format `publisherId.extensionName` for translating !!APP_NAME!! or an extension respectively.")
},
diff --git a/src/vs/workbench/contrib/localization/common/localizationsActions.ts b/src/vs/workbench/contrib/localization/common/localizationsActions.ts
-index 050dde4..a8a61bd 100644
+index 050dde41..a8a61bd2 100644
--- a/src/vs/workbench/contrib/localization/common/localizationsActions.ts
+++ b/src/vs/workbench/contrib/localization/common/localizationsActions.ts
@@ -25,3 +25,3 @@ export class ConfigureDisplayLanguageAction extends Action2 {
@@ -925,7 +994,7 @@ index 050dde4..a8a61bd 100644
+ description: localize2('configureLocaleDescription', "Changes the locale of !!APP_NAME!! based on installed language packs. Common languages include French, Chinese, Spanish, Japanese, German, Korean, and more.")
}
diff --git a/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts b/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
-index 864cc4f..b0b431a 100644
+index dc231e44..c47eeb39 100644
--- a/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
+++ b/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
@@ -276,3 +276,3 @@ export class McpServersListView extends AbstractExtensionsListView = {
+@@ -322,3 +322,3 @@ const terminalConfiguration: IStringDictionary = {
[TerminalSettingId.DetectLocale]: {
- markdownDescription: localize('terminal.integrated.detectLocale', "Controls whether to detect and set the `$LANG` environment variable to a UTF-8 compliant option since VS Code's terminal only supports UTF-8 encoded data coming from the shell."),
+ markdownDescription: localize('terminal.integrated.detectLocale', "Controls whether to detect and set the `$LANG` environment variable to a UTF-8 compliant option since !!APP_NAME!!'s terminal only supports UTF-8 encoded data coming from the shell."),
type: 'string',
-@@ -330,3 +330,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -336,3 +336,3 @@ const terminalConfiguration: IStringDictionary = {
markdownEnumDescriptions: [
- localize('terminal.integrated.gpuAcceleration.auto', "Let VS Code detect which renderer will give the best experience."),
+ localize('terminal.integrated.gpuAcceleration.auto', "Let !!APP_NAME!! detect which renderer will give the best experience."),
localize('terminal.integrated.gpuAcceleration.on', "Enable GPU acceleration within the terminal."),
-@@ -418,3 +418,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -424,3 +424,3 @@ const terminalConfiguration: IStringDictionary = {
'terminal.integrated.commandsToSkipShell',
- "A set of command IDs whose keybindings will not be sent to the shell but instead always be handled by VS Code. This allows keybindings that would normally be consumed by the shell to act instead the same as when the terminal is not focused, for example `Ctrl+P` to launch Quick Open.\n\n \n\nMany commands are skipped by default. To override a default and pass that command's keybinding to the shell instead, add the command prefixed with the `-` character. For example add `-workbench.action.quickOpen` to allow `Ctrl+P` to reach the shell.\n\n \n\nThe following list of default skipped commands is truncated when viewed in Settings Editor. To see the full list, {1} and search for the first command from the list below.\n\n \n\nDefault Skipped Commands:\n\n{0}",
+ "A set of command IDs whose keybindings will not be sent to the shell but instead always be handled by !!APP_NAME!!. This allows keybindings that would normally be consumed by the shell to act instead the same as when the terminal is not focused, for example `Ctrl+P` to launch Quick Open.\n\n \n\nMany commands are skipped by default. To override a default and pass that command's keybinding to the shell instead, add the command prefixed with the `-` character. For example add `-workbench.action.quickOpen` to allow `Ctrl+P` to reach the shell.\n\n \n\nThe following list of default skipped commands is truncated when viewed in Settings Editor. To see the full list, {1} and search for the first command from the list below.\n\n \n\nDefault Skipped Commands:\n\n{0}",
DEFAULT_COMMANDS_TO_SKIP_SHELL.sort().map(command => `- ${command}`).join('\n'),
-@@ -430,3 +430,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -436,3 +436,3 @@ const terminalConfiguration: IStringDictionary = {
[TerminalSettingId.AllowChords]: {
- markdownDescription: localize('terminal.integrated.allowChords', "Whether or not to allow chord keybindings in the terminal. Note that when this is true and the keystroke results in a chord it will bypass {0}, setting this to false is particularly useful when you want ctrl+k to go to your shell (not VS Code).", '`#terminal.integrated.commandsToSkipShell#`'),
+ markdownDescription: localize('terminal.integrated.allowChords', "Whether or not to allow chord keybindings in the terminal. Note that when this is true and the keystroke results in a chord it will bypass {0}, setting this to false is particularly useful when you want ctrl+k to go to your shell (not !!APP_NAME!!).", '`#terminal.integrated.commandsToSkipShell#`'),
type: 'boolean',
-@@ -441,3 +441,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -447,3 +447,3 @@ const terminalConfiguration: IStringDictionary = {
restricted: true,
- markdownDescription: localize('terminal.integrated.env.osx', "Object with environment variables that will be added to the VS Code process to be used by the terminal on macOS. Set to `null` to delete the environment variable."),
+ markdownDescription: localize('terminal.integrated.env.osx', "Object with environment variables that will be added to the !!APP_NAME!! process to be used by the terminal on macOS. Set to `null` to delete the environment variable."),
type: 'object',
-@@ -450,3 +450,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -456,3 +456,3 @@ const terminalConfiguration: IStringDictionary = {
restricted: true,
- markdownDescription: localize('terminal.integrated.env.linux', "Object with environment variables that will be added to the VS Code process to be used by the terminal on Linux. Set to `null` to delete the environment variable."),
+ markdownDescription: localize('terminal.integrated.env.linux', "Object with environment variables that will be added to the !!APP_NAME!! process to be used by the terminal on Linux. Set to `null` to delete the environment variable."),
type: 'object',
-@@ -459,3 +459,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -465,3 +465,3 @@ const terminalConfiguration: IStringDictionary = {
restricted: true,
- markdownDescription: localize('terminal.integrated.env.windows', "Object with environment variables that will be added to the VS Code process to be used by the terminal on Windows. Set to `null` to delete the environment variable."),
+ markdownDescription: localize('terminal.integrated.env.windows', "Object with environment variables that will be added to the !!APP_NAME!! process to be used by the terminal on Windows. Set to `null` to delete the environment variable."),
type: 'object',
-@@ -478,3 +478,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -484,3 +484,3 @@ const terminalConfiguration: IStringDictionary = {
restricted: true,
-- markdownDescription: localize('terminal.integrated.windowsUseConptyDll', "Whether to use the experimental conpty.dll (v1.23.251008001) shipped with VS Code, instead of the one bundled with Windows."),
-+ markdownDescription: localize('terminal.integrated.windowsUseConptyDll', "Whether to use the experimental conpty.dll (v1.23.251008001) shipped with !!APP_NAME!!, instead of the one bundled with Windows."),
+- markdownDescription: localize('terminal.integrated.windowsUseConptyDll', "Whether to use the conpty.dll (v1.25.260303002) shipped with VS Code, instead of the one bundled with Windows."),
++ markdownDescription: localize('terminal.integrated.windowsUseConptyDll', "Whether to use the conpty.dll (v1.25.260303002) shipped with !!APP_NAME!!, instead of the one bundled with Windows."),
type: 'boolean',
-@@ -617,3 +617,3 @@ const terminalConfiguration: IStringDictionary = {
+@@ -610,3 +610,3 @@ const terminalConfiguration: IStringDictionary = {
restricted: true,
- markdownDescription: localize('terminal.integrated.shellIntegration.enabled', "Determines whether or not shell integration is auto-injected to support features like enhanced command tracking and current working directory detection. \n\nShell integration works by injecting the shell with a startup script. The script gives VS Code insight into what is happening within the terminal.\n\nSupported shells:\n\n- Linux/macOS: bash, fish, pwsh, zsh\n - Windows: pwsh, git bash\n\nThis setting applies only when terminals are created, so you will need to restart your terminals for it to take effect.\n\n Note that the script injection may not work if you have custom arguments defined in the terminal profile, have enabled {1}, have a [complex bash `PROMPT_COMMAND`](https://code.visualstudio.com/docs/editor/integrated-terminal#_complex-bash-promptcommand), or other unsupported setup. To disable decorations, see {0}", '`#terminal.integrated.shellIntegration.decorationsEnabled#`', '`#editor.accessibilitySupport#`'),
+ markdownDescription: localize('terminal.integrated.shellIntegration.enabled', "Determines whether or not shell integration is auto-injected to support features like enhanced command tracking and current working directory detection. \n\nShell integration works by injecting the shell with a startup script. The script gives !!APP_NAME!! insight into what is happening within the terminal.\n\nSupported shells:\n\n- Linux/macOS: bash, fish, pwsh, zsh\n - Windows: pwsh, git bash\n\nThis setting applies only when terminals are created, so you will need to restart your terminals for it to take effect.\n\n Note that the script injection may not work if you have custom arguments defined in the terminal profile, have enabled {1}, have a [complex bash `PROMPT_COMMAND`](https://code.visualstudio.com/docs/editor/integrated-terminal#_complex-bash-promptcommand), or other unsupported setup. To disable decorations, see {0}", '`#terminal.integrated.shellIntegration.decorationsEnabled#`', '`#editor.accessibilitySupport#`'),
type: 'boolean',
diff --git a/src/vs/workbench/contrib/terminalContrib/autoReplies/common/terminalAutoRepliesConfiguration.ts b/src/vs/workbench/contrib/terminalContrib/autoReplies/common/terminalAutoRepliesConfiguration.ts
-index dc20533..2d2d488 100644
+index dc20533b..2d2d4886 100644
--- a/src/vs/workbench/contrib/terminalContrib/autoReplies/common/terminalAutoRepliesConfiguration.ts
+++ b/src/vs/workbench/contrib/terminalContrib/autoReplies/common/terminalAutoRepliesConfiguration.ts
@@ -19,3 +19,3 @@ export const terminalAutoRepliesConfiguration: IStringDictionary commandService.executeCommand('workbench.extensions.installExtension', 'ms-vscode.vscode-speech');
diff --git a/src/vs/workbench/contrib/update/browser/update.ts b/src/vs/workbench/contrib/update/browser/update.ts
-index 36f7d09..e6b14db 100644
+index c182b9c2..7090ac01 100644
--- a/src/vs/workbench/contrib/update/browser/update.ts
+++ b/src/vs/workbench/contrib/update/browser/update.ts
-@@ -639,4 +639,4 @@ export class SwitchProductQualityContribution extends Disposable implements IWor
+@@ -385,4 +385,4 @@ export class SwitchProductQualityContribution extends Disposable implements IWor
detail: newQuality === 'insider' ?
- nls.localize('relaunchDetailInsiders', "Press the reload button to switch to the Insiders version of VS Code.") :
- nls.localize('relaunchDetailStable', "Press the reload button to switch to the Stable version of VS Code."),
+ nls.localize('relaunchDetailInsiders', "Press the reload button to switch to the Insiders version of !!APP_NAME!!.") :
+ nls.localize('relaunchDetailStable', "Press the reload button to switch to the Stable version of !!APP_NAME!!."),
primaryButton: nls.localize({ key: 'reload', comment: ['&& denotes a mnemonic'] }, "&&Reload")
-@@ -675,3 +675,3 @@ export class SwitchProductQualityContribution extends Disposable implements IWor
+@@ -421,3 +421,3 @@ export class SwitchProductQualityContribution extends Disposable implements IWor
message: nls.localize('selectSyncService.message', "Choose the settings sync service to use after changing the version"),
- detail: nls.localize('selectSyncService.detail', "The Insiders version of VS Code will synchronize your settings, keybindings, extensions, snippets and UI State using separate insiders settings sync service by default."),
+ detail: nls.localize('selectSyncService.detail', "The Insiders version of !!APP_NAME!! will synchronize your settings, keybindings, extensions, snippets and UI State using separate insiders settings sync service by default."),
buttons: [
diff --git a/src/vs/workbench/contrib/url/browser/trustedDomainsFileSystemProvider.ts b/src/vs/workbench/contrib/url/browser/trustedDomainsFileSystemProvider.ts
-index 393c8c3..9268a6c 100644
+index 393c8c36..9268a6c2 100644
--- a/src/vs/workbench/contrib/url/browser/trustedDomainsFileSystemProvider.ts
+++ b/src/vs/workbench/contrib/url/browser/trustedDomainsFileSystemProvider.ts
@@ -55,3 +55,3 @@ function computeTrustedDomainContent(defaultTrustedDomains: string[], trustedDom
@@ -1142,7 +1211,7 @@ index 393c8c3..9268a6c 100644
+ content += `// By default, !!APP_NAME!! trusts "localhost".\n`;
}
diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
-index f6e28df..86b8e78 100644
+index 067580a4..591d9b0d 100644
--- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
+++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
@@ -52,3 +52,3 @@ registerAction2(class extends Action2 {
@@ -1156,7 +1225,7 @@ index f6e28df..86b8e78 100644
+ localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.welcomePage' }, "Open the Welcome page, with content to aid in getting started with !!APP_NAME!! and extensions."),
localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.readme' }, "Open the README when opening a folder that contains one, fallback to 'welcomePage' otherwise. Note: This is only observed as a global configuration, it will be ignored if set in a workspace or folder configuration."),
diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint.ts
-index 297598e..1fc5b45 100644
+index 297598ef..1fc5b45c 100644
--- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint.ts
+++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint.ts
@@ -161,3 +161,3 @@ export const walkthroughsExtensionPoint = ExtensionsRegistry.registerExtensionPo
@@ -1165,24 +1234,35 @@ index 297598e..1fc5b45 100644
+ description: localize('walkthroughs.steps.completionEvents.onCommand', 'Check off step when a given command is executed anywhere in !!APP_NAME!!.'),
body: 'onCommand:${1:commandId}'
diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.ts b/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.ts
-index 60f47c9..eb2c4b8 100644
+index 168a3d01..d64d47ba 100644
--- a/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.ts
+++ b/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.ts
-@@ -211,13 +211,2 @@ export const startEntries: GettingStartedStartEntryContent = [
+@@ -201,24 +201,2 @@ export const startEntries: GettingStartedStartEntryContent = [
},
- {
+- id: 'topLevelOpenTunnel',
+- title: localize('gettingStarted.topLevelOpenTunnel.title', "Open Tunnel..."),
+- description: localize('gettingStarted.topLevelOpenTunnel.description', "Connect to a remote machine through a Tunnel"),
+- when: 'isWeb && showRemoteStartEntryInWeb',
+- icon: Codicon.remote,
+- content: {
+- type: 'startEntry',
+- command: 'command:workbench.action.remote.showWebStartEntryActions',
+- }
+- },
+- {
- id: 'topLevelNewWorkspaceChat',
- title: localize('gettingStarted.newWorkspaceChat.title', "Generate New Workspace..."),
- description: localize('gettingStarted.newWorkspaceChat.description', "Chat to create a new workspace"),
- icon: Codicon.chatSparkle,
-- when: '!isWeb && !chatSetupHidden',
+- when: '!isWeb && !chatSetupHidden && !chatSetupDisabledInWorkspace',
- content: {
- type: 'startEntry',
- command: 'command:welcome.newWorkspaceChat',
- }
- },
];
-@@ -226,26 +215,2 @@ const Button = (title: string, href: string) => `[${title}](${href})`;
+@@ -227,26 +205,2 @@ const Button = (title: string, href: string) => `[${title}](${href})`;
-const CopilotStepTitle = localize('gettingStarted.copilotSetup.title', "Use AI features with Copilot for free");
-const CopilotDescription = localize({ key: 'gettingStarted.copilotSetup.description', comment: ['{Locked="["}', '{Locked="]({0})"}'] }, "You can use [Copilot]({0}) to generate code across multiple files, fix errors, ask questions about your code, and much more using natural language.", defaultChat.documentationUrl ?? '');
@@ -1201,7 +1281,7 @@ index 60f47c9..eb2c4b8 100644
- id,
- title: CopilotStepTitle,
- description,
-- when: `${when} && !chatSetupHidden`,
+- when: `${when} && !chatSetupHidden && !chatSetupDisabledInWorkspace`,
- media: {
- type: 'svg', altText: 'VS Code Copilot multi file edits', path: 'multi-file-edits.svg'
- },
@@ -1209,41 +1289,51 @@ index 60f47c9..eb2c4b8 100644
-}
-
export const walkthroughs: GettingStartedWalkthroughContent = [
-@@ -253,3 +218,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -254,3 +208,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
id: 'Setup',
- title: localize('gettingStarted.setup.title', "Get started with VS Code"),
+ title: localize('gettingStarted.setup.title', "Get started with !!APP_NAME!!"),
description: localize('gettingStarted.setup.description', "Customize your editor, learn the basics, and start coding"),
-@@ -258,3 +223,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -259,3 +213,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
when: '!isWeb',
- walkthroughPageTitle: localize('gettingStarted.setup.walkthroughPageTitle', 'Setup VS Code'),
+ walkthroughPageTitle: localize('gettingStarted.setup.walkthroughPageTitle', 'Setup !!APP_NAME!!'),
next: 'Beginner',
-@@ -263,6 +228,2 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -264,16 +218,2 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
steps: [
-- createCopilotSetupStep('CopilotSetupAnonymous', CopilotAnonymousButton, 'chatAnonymous && !chatSetupInstalled', true),
-- createCopilotSetupStep('CopilotSetupSignedOut', CopilotSignedOutButton, 'chatEntitlementSignedOut && !chatAnonymous', false),
-- createCopilotSetupStep('CopilotSetupComplete', CopilotCompleteButton, 'chatSetupInstalled && !chatSetupDisabled && (chatAnonymous || chatPlanPro || chatPlanProPlus || chatPlanBusiness || chatPlanEnterprise || chatPlanFree)', false),
-- createCopilotSetupStep('CopilotSetupSignedIn', CopilotSignedInButton, '!chatEntitlementSignedOut && (!chatSetupInstalled || chatSetupDisabled || chatPlanCanSignUp)', false),
+- createCopilotSetupStep('CopilotSetupAnonymous', CopilotAnonymousButton, 'chatAnonymous && !chatSetupCompleted', true),
+- createCopilotSetupStep('CopilotSetupSignedOut', CopilotSignedOutButton, 'chatEntitlementSignedOut && !chatAnonymous && !github.copilot.hasByokModels', false),
+- createCopilotSetupStep('CopilotSetupComplete', CopilotCompleteButton, 'chatSetupCompleted && !chatSetupDisabled && (chatAnonymous || chatPlanPro || chatPlanProPlus || chatPlanMax || chatPlanBusiness || chatPlanEnterprise || chatPlanFree)', false),
+- createCopilotSetupStep('CopilotSetupSignedIn', CopilotSignedInButton, '!chatEntitlementSignedOut && (!chatSetupCompleted || chatSetupDisabled || chatPlanCanSignUp)', false),
+- {
+- id: 'pickColorTheme',
+- title: localize('gettingStarted.pickColor.title', "Choose your theme"),
+- description: localize('gettingStarted.pickColor.description.interpolated', "The right theme helps you focus on your code, is easy on your eyes, and is simply more fun to use.\n{0}", Button(localize('titleID', "Browse Color Themes"), 'command:workbench.action.selectTheme')),
+- completionEvents: [
+- 'onSettingChanged:workbench.colorTheme',
+- 'onCommand:workbench.action.selectTheme'
+- ],
+- media: { type: 'markdown', path: 'theme_picker', }
+- },
{
-@@ -280,4 +241,4 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -281,4 +221,4 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.videoTutorial.title', "Watch video tutorials"),
- description: localize('gettingStarted.videoTutorial.description.interpolated', "Watch the first in a series of short & practical video tutorials for VS Code's key features.\n{0}", Button(localize('watch', "Watch Tutorial"), 'https://aka.ms/vscode-getting-started-video')),
- media: { type: 'svg', altText: 'VS Code Settings', path: 'learn.svg' },
+ description: localize('gettingStarted.videoTutorial.description.interpolated', "Watch the first in a series of short & practical video tutorials for !!APP_NAME!!'s key features.\n{0}", Button(localize('watch', "Watch Tutorial"), 'https://aka.ms/vscode-getting-started-video')),
+ media: { type: 'svg', altText: '!!APP_NAME!! Settings', path: 'learn.svg' },
}
-@@ -289,3 +250,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -290,3 +230,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
id: 'SetupWeb',
- title: localize('gettingStarted.setupWeb.title', "Get Started with VS Code for the Web"),
+ title: localize('gettingStarted.setupWeb.title', "Get Started with !!APP_NAME!! for the Web"),
description: localize('gettingStarted.setupWeb.description', "Customize your editor, learn the basics, and start coding"),
-@@ -295,3 +256,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -296,3 +236,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
next: 'Beginner',
- walkthroughPageTitle: localize('gettingStarted.setupWeb.walkthroughPageTitle', 'Setup VS Code Web'),
+ walkthroughPageTitle: localize('gettingStarted.setupWeb.walkthroughPageTitle', 'Setup !!APP_NAME!! Web'),
content: {
-@@ -321,6 +282,6 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -322,6 +262,6 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.extensions.title', "Code with extensions"),
- description: localize('gettingStarted.extensionsWeb.description.interpolated', "Extensions are VS Code's power-ups. A growing number are becoming available in the web.\n{0}", Button(localize('browsePopularWeb', "Browse Popular Web Extensions"), 'command:workbench.extensions.action.showPopularExtensions')),
+ description: localize('gettingStarted.extensionsWeb.description.interpolated', "Extensions are !!APP_NAME!!'s power-ups. A growing number are becoming available in the web.\n{0}", Button(localize('browsePopularWeb', "Browse Popular Web Extensions"), 'command:workbench.extensions.action.showPopularExtensions')),
@@ -1252,7 +1342,7 @@ index 60f47c9..eb2c4b8 100644
- type: 'svg', altText: 'VS Code extension marketplace with featured language extensions', path: 'extensions-web.svg'
+ type: 'svg', altText: '!!APP_NAME!! extension marketplace with featured language extensions', path: 'extensions-web.svg'
},
-@@ -336,12 +297,2 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -337,12 +277,2 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
},
- {
- id: 'settingsSyncWeb',
@@ -1265,42 +1355,42 @@ index 60f47c9..eb2c4b8 100644
- },
- },
{
-@@ -349,3 +300,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -350,3 +280,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.commandPalette.title', "Unlock productivity with the Command Palette "),
- description: localize('gettingStarted.commandPalette.description.interpolated', "Run commands without reaching for your mouse to accomplish any task in VS Code.\n{0}", Button(localize('commandPalette', "Open Command Palette"), 'command:workbench.action.showCommands')),
+ description: localize('gettingStarted.commandPalette.description.interpolated', "Run commands without reaching for your mouse to accomplish any task in !!APP_NAME!!.\n{0}", Button(localize('commandPalette', "Open Command Palette"), 'command:workbench.action.showCommands')),
media: { type: 'svg', altText: 'Command Palette overlay for searching and executing commands.', path: 'commandPalette.svg' },
-@@ -355,3 +306,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -356,3 +286,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.setup.OpenFolder.title', "Open up your code"),
- description: localize('gettingStarted.setup.OpenFolderWeb.description.interpolated', "You're all set to start coding. You can open a local project or a remote repository to get your files into VS Code.\n{0}\n{1}", Button(localize('openFolder', "Open Folder"), 'command:workbench.action.addRootFolder'), Button(localize('openRepository', "Open Repository"), 'command:remoteHub.openRepository')),
+ description: localize('gettingStarted.setup.OpenFolderWeb.description.interpolated', "You're all set to start coding. You can open a local project or a remote repository to get your files into !!APP_NAME!!.\n{0}\n{1}", Button(localize('openFolder', "Open Folder"), 'command:workbench.action.addRootFolder'), Button(localize('openRepository', "Open Repository"), 'command:remoteHub.openRepository')),
when: 'workspaceFolderCount == 0',
-@@ -376,3 +327,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -377,3 +307,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.setupAccessibility.title', "Get Started with Accessibility Features"),
- description: localize('gettingStarted.setupAccessibility.description', "Learn the tools and shortcuts that make VS Code accessible. Note that some actions are not actionable from within the context of the walkthrough."),
+ description: localize('gettingStarted.setupAccessibility.description', "Learn the tools and shortcuts that make !!APP_NAME!! accessible. Note that some actions are not actionable from within the context of the walkthrough."),
isFeatured: true,
-@@ -381,3 +332,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -382,3 +312,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
next: 'Setup',
- walkthroughPageTitle: localize('gettingStarted.setupAccessibility.walkthroughPageTitle', 'Setup VS Code Accessibility'),
+ walkthroughPageTitle: localize('gettingStarted.setupAccessibility.walkthroughPageTitle', 'Setup !!APP_NAME!! Accessibility'),
content: {
-@@ -412,3 +363,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -413,3 +343,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.commandPaletteAccessibility.title', "Unlock productivity with the Command Palette "),
- description: localize('gettingStarted.commandPaletteAccessibility.description.interpolated', "Run commands without reaching for your mouse to accomplish any task in VS Code.\n{0}", Button(localize('commandPalette', "Open Command Palette"), 'command:workbench.action.showCommands')),
+ description: localize('gettingStarted.commandPaletteAccessibility.description.interpolated', "Run commands without reaching for your mouse to accomplish any task in !!APP_NAME!!.\n{0}", Button(localize('commandPalette', "Open Command Palette"), 'command:workbench.action.showCommands')),
media: { type: 'markdown', path: 'empty' },
-@@ -492,3 +443,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -493,3 +423,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.settings.title', "Tune your settings"),
- description: localize('gettingStarted.settingsAndSync.description.interpolated', "Customize every aspect of VS Code and [sync](command:workbench.userDataSync.actions.turnOn) customizations across devices.\n{0}", Button(localize('tweakSettings', "Open Settings"), 'command:toSide:workbench.action.openSettings')),
+ description: localize('gettingStarted.settingsAndSync.description.interpolated', "Customize every aspect of !!APP_NAME!! and [sync](command:workbench.userDataSync.actions.turnOn) customizations across devices.\n{0}", Button(localize('tweakSettings', "Open Settings"), 'command:toSide:workbench.action.openSettings')),
when: 'workspacePlatform != \'webworker\' && syncStatus != uninitialized',
-@@ -496,3 +447,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -497,3 +427,3 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
media: {
- type: 'svg', altText: 'VS Code Settings', path: 'settings.svg'
+ type: 'svg', altText: '!!APP_NAME!! Settings', path: 'settings.svg'
},
-@@ -502,6 +453,6 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
+@@ -503,6 +433,6 @@ export const walkthroughs: GettingStartedWalkthroughContent = [
title: localize('gettingStarted.extensions.title', "Code with extensions"),
- description: localize('gettingStarted.extensions.description.interpolated', "Extensions are VS Code's power-ups. They range from handy productivity hacks, expanding out-of-the-box features, to adding completely new capabilities.\n{0}", Button(localize('browsePopular', "Browse Popular Extensions"), 'command:workbench.extensions.action.showPopularExtensions')),
+ description: localize('gettingStarted.extensions.description.interpolated', "Extensions are !!APP_NAME!!'s power-ups. They range from handy productivity hacks, expanding out-of-the-box features, to adding completely new capabilities.\n{0}", Button(localize('browsePopular', "Browse Popular Extensions"), 'command:workbench.extensions.action.showPopularExtensions')),
@@ -1310,7 +1400,7 @@ index 60f47c9..eb2c4b8 100644
+ type: 'svg', altText: '!!APP_NAME!! extension marketplace with featured language extensions', path: 'extensions.svg'
},
diff --git a/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts
-index bdd30bf..317d11c 100644
+index bdd30bf2..317d11c8 100644
--- a/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts
+++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts
@@ -13,3 +13,3 @@ export default function content(accessor: ServicesAccessor) {
@@ -1334,35 +1424,35 @@ index bdd30bf..317d11c 100644
+Well if you have got this far then you will have touched on some of the editing features in !!APP_NAME!!. But don't stop now :) We have lots of additional [documentation](https://code.visualstudio.com/docs), [introductory videos](https://code.visualstudio.com/docs/getstarted/introvideos) and [tips and tricks](https://go.microsoft.com/fwlink/?linkid=852118) for the product that will help you learn how to use it. And while you are here, here are a few additional things you can try:
- Open the Integrated Terminal by pressing kb(workbench.action.terminal.toggleTerminal), then see what's possible by [reviewing the terminal documentation](https://code.visualstudio.com/docs/editor/integrated-terminal)
diff --git a/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts b/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts
-index 1159e4c..d8ebb47 100644
+index 6cccbced..877669a3 100644
--- a/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts
+++ b/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts
-@@ -765,3 +765,3 @@ Registry.as(ConfigurationExtensions.Configuration)
+@@ -801,3 +801,3 @@ Registry.as(ConfigurationExtensions.Configuration)
default: true,
- description: localize('workspace.trust.description', "Controls whether or not Workspace Trust is enabled within VS Code."),
+ description: localize('workspace.trust.description', "Controls whether or not Workspace Trust is enabled within !!APP_NAME!!."),
tags: [WORKSPACE_TRUST_SETTING_TAG],
-@@ -811,3 +811,3 @@ Registry.as(ConfigurationExtensions.Configuration)
+@@ -847,3 +847,3 @@ Registry.as(ConfigurationExtensions.Configuration)
default: true,
- markdownDescription: localize('workspace.trust.emptyWindow.description', "Controls whether or not the empty window is trusted by default within VS Code. When used with `#{0}#`, you can enable the full functionality of VS Code without prompting in an empty window.", WORKSPACE_TRUST_UNTRUSTED_FILES),
+ markdownDescription: localize('workspace.trust.emptyWindow.description', "Controls whether or not the empty window is trusted by default within !!APP_NAME!!. When used with `#{0}#`, you can enable the full functionality of !!APP_NAME!! without prompting in an empty window.", WORKSPACE_TRUST_UNTRUSTED_FILES),
tags: [WORKSPACE_TRUST_SETTING_TAG],
diff --git a/src/vs/workbench/electron-browser/desktop.contribution.ts b/src/vs/workbench/electron-browser/desktop.contribution.ts
-index 4c3893a..9c3267a 100644
+index 9db62d8f..074209e5 100644
--- a/src/vs/workbench/electron-browser/desktop.contribution.ts
+++ b/src/vs/workbench/electron-browser/desktop.contribution.ts
-@@ -448,3 +448,3 @@ import product from '../../platform/product/common/product.js';
+@@ -453,3 +453,3 @@ import product from '../../platform/product/common/product.js';
type: 'boolean',
- description: localize('argv.disableChromiumSandbox', "Disables the Chromium sandbox. This is useful when running VS Code as elevated on Linux and running under Applocker on Windows.")
+ description: localize('argv.disableChromiumSandbox', "Disables the Chromium sandbox. This is useful when running !!APP_NAME!! as elevated on Linux and running under Applocker on Windows.")
},
-@@ -452,3 +452,3 @@ import product from '../../platform/product/common/product.js';
+@@ -457,3 +457,3 @@ import product from '../../platform/product/common/product.js';
type: 'boolean',
- description: localize('argv.useInMemorySecretStorage', "Ensures that an in-memory store will be used for secret storage instead of using the OS's credential store. This is often used when running VS Code extension tests or when you're experiencing difficulties with the credential store.")
+ description: localize('argv.useInMemorySecretStorage', "Ensures that an in-memory store will be used for secret storage instead of using the OS's credential store. This is often used when running !!APP_NAME!! extension tests or when you're experiencing difficulties with the credential store.")
},
diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts
-index ea7f364..25c4fda 100644
+index e60991aa..bbea4f92 100644
--- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts
+++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts
@@ -1044,3 +1044,3 @@ export class ExtensionManagementService extends CommontExtensionManagementServic
@@ -1371,7 +1461,7 @@ index ea7f364..25c4fda 100644
+ const productName = localize('!!APP_NAME!! for Web', "{0} for the Web", this.productService.nameLong);
const virtualWorkspaceSupport = this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(manifest);
diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts
-index f9d57d5..73d4c66 100644
+index 09dd590e..c4877b48 100644
--- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts
+++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts
@@ -181,3 +181,3 @@ export const schema: IJSONSchema = {
@@ -1429,7 +1519,7 @@ index f9d57d5..73d4c66 100644
+ description: nls.localize('vscode.extension.scripts.uninstall', 'Uninstall hook for !!APP_NAME!! extension. Script that gets executed when the extension is completely uninstalled from !!APP_NAME!! which is when !!APP_NAME!! is restarted (shutdown and start) after the extension is uninstalled. Only Node scripts are supported.'),
type: 'string'
diff --git a/src/vs/workbench/services/extensions/electron-browser/nativeExtensionService.ts b/src/vs/workbench/services/extensions/electron-browser/nativeExtensionService.ts
-index 2b6104a..9d2dffd 100644
+index 4340604b..3c5f770a 100644
--- a/src/vs/workbench/services/extensions/electron-browser/nativeExtensionService.ts
+++ b/src/vs/workbench/services/extensions/electron-browser/nativeExtensionService.ts
@@ -167,3 +167,3 @@ export class NativeExtensionService extends AbstractExtensionService implements
@@ -1438,7 +1528,7 @@ index 2b6104a..9d2dffd 100644
+ label: nls.localize('relaunch', "Relaunch !!APP_NAME!!"),
run: () => {
diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts
-index 43da461..c7d4149 100644
+index 43da4619..c7d4149e 100644
--- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts
+++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts
@@ -199,3 +199,3 @@ export class UserDataProfileManagementService extends Disposable implements IUse
diff --git a/patches/00-build-disable-esbuild.patch b/patches/00-build-disable-esbuild.patch
new file mode 100644
index 00000000000..8843a668ef1
--- /dev/null
+++ b/patches/00-build-disable-esbuild.patch
@@ -0,0 +1,8 @@
+diff --git a/build/buildConfig.ts b/build/buildConfig.ts
+index a4299d26..a815dd51 100644
+--- a/build/buildConfig.ts
++++ b/build/buildConfig.ts
+@@ -11,2 +11,2 @@
+ */
+-export const useEsbuildTranspile = true;
++export const useEsbuildTranspile = false;
diff --git a/patches/remove-mangle.patch b/patches/00-build-disable-mangle.patch
similarity index 90%
rename from patches/remove-mangle.patch
rename to patches/00-build-disable-mangle.patch
index 41904451c00..096b3215aa7 100644
--- a/patches/remove-mangle.patch
+++ b/patches/00-build-disable-mangle.patch
@@ -1,8 +1,8 @@
diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts
-index 948c6b4..66ecdd3 100644
+index 32e3e25e..6e9396d2 100644
--- a/build/lib/compilation.ts
+++ b/build/lib/compilation.ts
-@@ -131,27 +131,3 @@ export function compileTask(src: string, out: string, build: boolean, options: {
+@@ -139,27 +139,3 @@ export function compileTask(src: string, out: string, build: boolean, options: {
- // mangle: TypeScript to TypeScript
- let mangleStream = es.through();
@@ -27,6 +27,6 @@ index 948c6b4..66ecdd3 100644
- });
- }
-
- return srcPipe
+ const emit = util.streamToPromise(srcPipe
- .pipe(mangleStream)
.pipe(generator.stream)
diff --git a/patches/ext-from-gh.patch b/patches/00-build-download-extensions-from-gh.patch
similarity index 100%
rename from patches/ext-from-gh.patch
rename to patches/00-build-download-extensions-from-gh.patch
diff --git a/patches/00-build-replace-unicode.patch b/patches/00-build-replace-unicode.patch
new file mode 100644
index 00000000000..8f710e6bac6
--- /dev/null
+++ b/patches/00-build-replace-unicode.patch
@@ -0,0 +1,9 @@
+diff --git a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.ts b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.ts
+index 3de86060..875de670 100644
+--- a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.ts
++++ b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.ts
+@@ -657,3 +657,3 @@ export function detectsHighConfidenceInputPattern(cursorLine: string): boolean {
+ // allow-any-unicode-next-line
+- /^(?:\s|\x1b\[[0-9;]*m)*\?.*[›❯▸▶]\s*$/,
++ /^(?:\s|\x1b\[[0-9;]*m)*\?.*[\u{203A}\u{276F}\u{25B8}\u{25B6}]\s*$/u,
+ ].some(e => e.test(cursorLine));
diff --git a/patches/00-build-update-electron.patch.no b/patches/00-build-update-electron.patch.no
new file mode 100644
index 00000000000..d428ae359c3
--- /dev/null
+++ b/patches/00-build-update-electron.patch.no
@@ -0,0 +1,203 @@
+diff --git a/.npmrc b/.npmrc
+index a275846..e31402c 100644
+--- a/.npmrc
++++ b/.npmrc
+@@ -1,3 +1,3 @@
+ disturl="https://electronjs.org/headers"
+-target="39.8.0"
++target="39.8.4"
+ ms_build_id="13470701"
+diff --git a/build/checksums/electron.txt b/build/checksums/electron.txt
+index 5d8343f..1fd0e54 100644
+--- a/build/checksums/electron.txt
++++ b/build/checksums/electron.txt
+@@ -1,75 +1,75 @@
+-d70954386008ad2c65d9849bb89955ab3c7dd08763256ae0d91d8604e8894d64 *chromedriver-v39.8.0-darwin-arm64.zip
+-2f6b654337133c13440aafdaf9e8b15f5ebb244e7d49f20977f03438e9bb8adb *chromedriver-v39.8.0-darwin-x64.zip
+-ef8681bb6b6af42cdf0e14c9ce188f035e01620781308c06cd3c6b922aaea2e6 *chromedriver-v39.8.0-linux-arm64.zip
+-c03fea6ac2b743d771407dc5f58809f44d2a885b1830b847957823cac2e7b222 *chromedriver-v39.8.0-linux-armv7l.zip
+-4bb7c6d9b3a7bfdd89edd0db98e63599ebf6dacdb888d5985bbb73f6153acc0c *chromedriver-v39.8.0-linux-x64.zip
+-aad1f6f970b5636d637c1c242766fbaa5bebe2707a605a38aadc7b40724b3d11 *chromedriver-v39.8.0-mas-arm64.zip
+-e89ebebe3a135d3ce40168152a0aabfd055b9fa6b118262a6df18405fd2ea433 *chromedriver-v39.8.0-mas-x64.zip
+-232e1a0460f6a59056499cccfff3265bf92eae22f20f02f2419e5e49552aaed7 *chromedriver-v39.8.0-win32-arm64.zip
+-ab92f46cc55da7c719175b50203c734781828389b8b3a1a535204bf0dc7d1296 *chromedriver-v39.8.0-win32-ia32.zip
+-a40eb521063e4ea6791ed4005815fa8ac259c1febc850246a83a47ce120121ce *chromedriver-v39.8.0-win32-x64.zip
+-d6a33b4c3c0de845ea23d1e2614c6c6d3bbe35b771bb63ae521c4db11373b021 *electron-api.json
+-5425323fdb23167870075e944ec6cf3ae383fbe45ad141d08b1d9689030ccd05 *electron-v39.8.0-darwin-arm64-dsym-snapshot.zip
+-aa32ab00ee58d8827cd53ca561b8c26b7cb7e2ad8cb0801acdda117ee728388e *electron-v39.8.0-darwin-arm64-dsym.zip
+-f94e589804a3394a4735543b888927be873f8f402899d0debe32a9dc570d6285 *electron-v39.8.0-darwin-arm64-symbols.zip
+-681d82c2ec6677ff0bf12f5bb1808b5a51dcbf10894bd0298641015119a3e04d *electron-v39.8.0-darwin-arm64.zip
+-a95e83b5cde762a37e64229e5669b0c19b95aac148689d96ca344535109eb983 *electron-v39.8.0-darwin-x64-dsym-snapshot.zip
+-8c989d8ca835ecdd93d49d9627f5548272c0ed03e263392b21ed287960b29e41 *electron-v39.8.0-darwin-x64-dsym.zip
+-b4b6fda9c5b9063a104318645aa29ef4738dd099da2b722e3e9b6dde5e098418 *electron-v39.8.0-darwin-x64-symbols.zip
+-ec53f2ba79498410323bb96a19ce98741bf28666cc9d83e07d11dadcc5506f38 *electron-v39.8.0-darwin-x64.zip
+-9141e64f9d4ea7f0e6a43ae364c8232a0dac79ecec44de2d4a0e5d688fbb742c *electron-v39.8.0-linux-arm64-debug.zip
+-5fac949d5331abaff0643dbcda7cc187e548cd4bf9d198c1ffc361383bfaa79f *electron-v39.8.0-linux-arm64-symbols.zip
+-c9db883fa671237fbc16256cf89aba55b9fcfbd9825fec32a6d57724a6446fe1 *electron-v39.8.0-linux-arm64.zip
+-b26ac10e84f6b7d338c13a38547aa66b5e9afbe2f1355b183ebc2ff8f428cfa9 *electron-v39.8.0-linux-armv7l-debug.zip
+-16c47c008a8783f6c8d6387fe01ea15425161befbf4211e4667bbdd6bb806ef0 *electron-v39.8.0-linux-armv7l-symbols.zip
+-b1b37fd450a5081a876c2b00b6ca007d454747a7d1d8f04feb16119d6ace94c6 *electron-v39.8.0-linux-armv7l.zip
+-1e8039cdf60b27785771c9e3f3c4c39fad37602bb0e6b75a30f83c57fdbef069 *electron-v39.8.0-linux-x64-debug.zip
+-ff9ca169c6e79649dd4c5a49a82a8d4b1761b62fbe14c15c61bf534381a9f653 *electron-v39.8.0-linux-x64-symbols.zip
+-854076cc4c63d6d6c320df1ca3f4bd7084ef9f9bb47c7b75d80feb2c2ed920b4 *electron-v39.8.0-linux-x64.zip
+-91bc313cbd009435552d8d5efff5d6ed0ff15465743c2629dac1cfe99ac34e4d *electron-v39.8.0-mas-arm64-dsym-snapshot.zip
+-974f10f80ec6c65f8d9f2ac1ccd8c4395bb34e24e2b09dc0ff80bd351099692e *electron-v39.8.0-mas-arm64-dsym.zip
+-b3878bc9198cff324b7c829ce2fbea7a4ee505f2f99b0bb3c11ac5e60651be59 *electron-v39.8.0-mas-arm64-symbols.zip
+-48dac99c757a850b0db7b38c1b95e08270f690a7ea1b58872e45308c2f7c8c93 *electron-v39.8.0-mas-arm64.zip
+-1a6e4df1092f89ed46833938d6dd1b3036640037bd09f0630a369ae386a7c872 *electron-v39.8.0-mas-x64-dsym-snapshot.zip
+-81425eb867527341af64c00726bd462957fec4d5f073922df891d830addbc5bc *electron-v39.8.0-mas-x64-dsym.zip
+-748ce154e894a27b117b46354cc288dc9442fade844c637b59fe1c1f3f7c625d *electron-v39.8.0-mas-x64-symbols.zip
+-91f8f7d4eb1a42ac4fa0eaa93034c8e6155ccb50718f9f55541ce2be4a4ed6d0 *electron-v39.8.0-mas-x64.zip
+-b775b7584afb84e52b0a770e1e63a2f17384b66eeebe845e0c5c82beacaf7e93 *electron-v39.8.0-win32-arm64-pdb.zip
+-ac62373d11ed682b4fcdae27de2bd72ebf7d46d3b569f5fcf242de01786d0948 *electron-v39.8.0-win32-arm64-symbols.zip
+-b701e63ca5d443d9bd1b653ea0e2b7479f0d834a3d1bd9f10a3b745d29607154 *electron-v39.8.0-win32-arm64-toolchain-profile.zip
+-08b79fa5deabbcace447f1e15eb99b3b117b42a84b71ad5b0f52d2da68a34192 *electron-v39.8.0-win32-arm64.zip
+-f4fb798d76a0c2f80717ef1607571537dbbb07f1cc5f177048bcfd17046c2255 *electron-v39.8.0-win32-ia32-pdb.zip
+-37c1d2988793604294724b648589fca6459472021189abab1550d5e1eecff1a7 *electron-v39.8.0-win32-ia32-symbols.zip
+-b701e63ca5d443d9bd1b653ea0e2b7479f0d834a3d1bd9f10a3b745d29607154 *electron-v39.8.0-win32-ia32-toolchain-profile.zip
+-59b70a12abedb550795614bc74c5803787e824da3529a631fdb5c2b5aad00196 *electron-v39.8.0-win32-ia32.zip
+-0357c6fb0d7198c45cba0e8c939473ea1d971e1efe801bc84e2c559141b368e7 *electron-v39.8.0-win32-x64-pdb.zip
+-8e6f4e8516d15aecde5244beac315067c13513c7074383086523eef2638a5e8d *electron-v39.8.0-win32-x64-symbols.zip
+-b701e63ca5d443d9bd1b653ea0e2b7479f0d834a3d1bd9f10a3b745d29607154 *electron-v39.8.0-win32-x64-toolchain-profile.zip
+-9edc111b22aee1a0efb5103d6d3b48645af57b48214eeb48f75f9edfc3e271d6 *electron-v39.8.0-win32-x64.zip
+-b6eca0e05fcff2464382278dff52367f6f21eb1a580dd8a0a954fc16397ab085 *electron.d.ts
+-27cf8e375bc22ceea6b3d42132f2927ea544edac2b8b2c5dc3c10b5df8dfb027 *ffmpeg-v39.8.0-darwin-arm64.zip
+-321d9c07f74c6cf77027ec07d888fb7b634d6589207e3c9e016c43e277ca9944 *ffmpeg-v39.8.0-darwin-x64.zip
+-52ae6eccbdb4a9403a6c3eb46b356a28940ec25958b6b9181fb2f38e612e40ed *ffmpeg-v39.8.0-linux-arm64.zip
+-622cb781fb1e3b9617e7e60c36384427f7b0d9b5ad888e9bc356a83b050e13f1 *ffmpeg-v39.8.0-linux-armv7l.zip
+-ba441851788008362f013bf2983b22b0042af8df31bf90123328f928cc067492 *ffmpeg-v39.8.0-linux-x64.zip
+-27cf8e375bc22ceea6b3d42132f2927ea544edac2b8b2c5dc3c10b5df8dfb027 *ffmpeg-v39.8.0-mas-arm64.zip
+-321d9c07f74c6cf77027ec07d888fb7b634d6589207e3c9e016c43e277ca9944 *ffmpeg-v39.8.0-mas-x64.zip
+-3ba7c7507181e0d4836f70f3d8800b4e9ba379e1086e9e89fda7ff9b3b9ad2cb *ffmpeg-v39.8.0-win32-arm64.zip
+-f37e7d51b8403e2ed8ca192bc6ae759cf63d80010e747b15eeb7120b575578b2 *ffmpeg-v39.8.0-win32-ia32.zip
+-b252e232438010f9683e8fd10c3bf0631df78e42a6ae11d6cb7aa7e6ac11185f *ffmpeg-v39.8.0-win32-x64.zip
+-365735192f58a7f7660100227ec348ba3df604415ff5264b54d93cb6cf5f6f6f *hunspell_dictionaries.zip
+-6384ee31daa39de4dd4bd3aa225cdb14cdddb7f463a2c1663b38a79e122a13e2 *libcxx-objects-v39.8.0-linux-arm64.zip
+-9748b3272e52a8274fe651def2d6ae2dad7a3771b520dd105f46f4020ba9d63b *libcxx-objects-v39.8.0-linux-armv7l.zip
+-74d47a155ecc6c2054418c7c3e0540f32b983ebdc65e8b4ea5d3e257d29b3f4f *libcxx-objects-v39.8.0-linux-x64.zip
+-c0755fbb84011664bd36459fc6e06a603078dccd3b7b260f6ed6ad1d409f79f7 *libcxx_headers.zip
+-3ea41e9bd56e8f52ab8562c1406ba9416abe3993640935e981cbbd77c0f2654b *libcxxabi_headers.zip
+-befcd6067f35d911a6a87b927e79dc531cb7bea39e85f86a65e9ab82ef0cece1 *mksnapshot-v39.8.0-darwin-arm64.zip
+-f0e692655298ffed60630c3e6490ced69e9d8726e85bcaecfa34485f3a991469 *mksnapshot-v39.8.0-darwin-x64.zip
+-d5d0901cd1eafdf921d2a0d1565829cf60f454a71ce74fa60db98780fd8a1a96 *mksnapshot-v39.8.0-linux-arm64-x64.zip
+-1bc0a3294d258a59846aa5c5359cd8b0f43831ebd7c3e1dde9a6cfaa39d845bf *mksnapshot-v39.8.0-linux-armv7l-x64.zip
+-4e414dbe75f460cb34508608db984aa6f4d274f333fa327a3d631da4a516da8f *mksnapshot-v39.8.0-linux-x64.zip
+-c51c86e3a11ad75fb4f7559798f6d64ec7def19583c96ce08de7ee5796568841 *mksnapshot-v39.8.0-mas-arm64.zip
+-6544d1e93adea1e9a694f9b9f539d96f84df647d9c9319b29d4fc88751ff9075 *mksnapshot-v39.8.0-mas-x64.zip
+-372b4685c53f19ccc72c33d78c1283d9389c72f42cd48224439fe4f89199caa0 *mksnapshot-v39.8.0-win32-arm64-x64.zip
+-199e9244f4522a4a02aece09a6a33887b24d7ec837640d39c930170e4b3caa57 *mksnapshot-v39.8.0-win32-ia32.zip
+-970e979e7a8b70f300f7854cb571756d9049bc42b44a6153a9ce3a18e1a83243 *mksnapshot-v39.8.0-win32-x64.zip
++1e91e08b27242bfa38e3321eac27a76b4527b5240d9b7fa55b34b27272c7d20d *chromedriver-v39.8.4-darwin-arm64.zip
++e6036542dea19cf60b0d1ae6b7be1cdfb741363f7af8243720566363a9d04a23 *chromedriver-v39.8.4-darwin-x64.zip
++464e5f0c7ae0dcf4817436d6289bcee5cd655e7da96debf8e4723a10f2545362 *chromedriver-v39.8.4-linux-arm64.zip
++2be3059d746a33bf3e4c0cf89131401294ef270e152a0e567ffb279a77cd3bba *chromedriver-v39.8.4-linux-armv7l.zip
++dfce0407bf9304f1df3f053e305d8c7660ab7ac2b6f4b81bedab343d16bcc48d *chromedriver-v39.8.4-linux-x64.zip
++28c4f1b14580fc2a0b35cb9a9b29e8742e117311df8843c1ba31439249b368c3 *chromedriver-v39.8.4-mas-arm64.zip
++381581e0ba9ca49682d39b7cdf05d5f3c2c477c2db7878738103051bffb02c5d *chromedriver-v39.8.4-mas-x64.zip
++22c4c9e1fdbb80b02bfca06de84407ff4fae79072f192b4e4c9260ccd2d55ded *chromedriver-v39.8.4-win32-arm64.zip
++d2771daa0fdd9375b6b82b8fbdc61781fba3ab3aa104a57d0e4a5262b8aa7baa *chromedriver-v39.8.4-win32-ia32.zip
++984738998aa9f5947f11446386d5c26dc5836de5869be4a11a8db6c1a21a9801 *chromedriver-v39.8.4-win32-x64.zip
++21469b4c0fba6ff2470f3ca046c4fedaa0e7169de6849d3a515df1229583e72b *electron-api.json
++4ef051701b2d01f19f8d3d29d41d27e3a9c6881c9defefc3883b35157234ffb0 *electron-v39.8.4-darwin-arm64-dsym-snapshot.zip
++115a40e2f14a492cc5ea9948e61e8c00ad758c568a74c94551acde0a0c6ff892 *electron-v39.8.4-darwin-arm64-dsym.zip
++d744d733681a36a242abb8b997c58571b49edb12db616bbd966111b1ff9f2114 *electron-v39.8.4-darwin-arm64-symbols.zip
++47636d2c4e07dc587fad991d2e682a8a8aa42281732e33323418e16e4d31245d *electron-v39.8.4-darwin-arm64.zip
++8196638bd34cc5815bd91de60f2d5eaa1119c8d473519c208e640cf68a1d9410 *electron-v39.8.4-darwin-x64-dsym-snapshot.zip
++f6cc6d79870acb14efda0bfb33f1e78b96fcab3bdbecc6d91c505dddb519f09f *electron-v39.8.4-darwin-x64-dsym.zip
++14204efe7f170b82e9c369d060f8b05d5a32aceb9800330861dbc05482ada505 *electron-v39.8.4-darwin-x64-symbols.zip
++48bc4c03e3dab5678ddc447378ec639803d687d75939575675a273f054b98237 *electron-v39.8.4-darwin-x64.zip
++8c5e0eb3e15b90b2397dc641255c8bac797a0e4a2f999ea77e4461d667add977 *electron-v39.8.4-linux-arm64-debug.zip
++25df0c1a03bdad3a19f5a9d6385efadc249b48a512cbb7967bccffe1a123a007 *electron-v39.8.4-linux-arm64-symbols.zip
++67d9c084e664ee2a5f76dce2efb13f79aff60e014deb06174af82b6cfd43b101 *electron-v39.8.4-linux-arm64.zip
++514dbca9bf81f82f6574ae906057b78f13c4bd781eba9033ed58d6609ce944a8 *electron-v39.8.4-linux-armv7l-debug.zip
++3baa152b9ae413da46ced437291b7bd65dca390168a62f9ba01b7f8c9bc76ed4 *electron-v39.8.4-linux-armv7l-symbols.zip
++a2d835231443afc8022a99a3ab94b7b4a90ebfbda77c2fbefafca430753174fe *electron-v39.8.4-linux-armv7l.zip
++8ea7223c43a03779fafc6272742ebca104f584b3952abcf17b186af3624803d7 *electron-v39.8.4-linux-x64-debug.zip
++4d834e7574dda95f1bd10a7758ed93fbc12d2aa4aa6cc6fad091a37ea422d196 *electron-v39.8.4-linux-x64-symbols.zip
++66f1ea702595deda724f6c6246acfddc84a317c7f0262bd7fd350af50dbbe4e9 *electron-v39.8.4-linux-x64.zip
++ce85bfbd66c6731004e7d035a2bf65b2c0cb95a9716ee7e156061c791bd723a7 *electron-v39.8.4-mas-arm64-dsym-snapshot.zip
++b745d57275df62904d779fe757446adfe515252edc00fe8e8667fe63e9975dda *electron-v39.8.4-mas-arm64-dsym.zip
++14706a26e78fcdc34be2f12229920cc178b6b773eeede0aee87875336e4a6a0c *electron-v39.8.4-mas-arm64-symbols.zip
++9a30bfe87c8d62f39798a5a69a63085429f6f1ba1975e7d552dc35c6c7c41a59 *electron-v39.8.4-mas-arm64.zip
++8ee820ece1f08d637ddbea9dae1b9fbe014be88fa20feb1e261a6921c2977e6c *electron-v39.8.4-mas-x64-dsym-snapshot.zip
++044c25405f83c6012c238990b534f47430e308c2c787e1f6d7fe0fb41728b818 *electron-v39.8.4-mas-x64-dsym.zip
++05c1f4fc148222481dc3e88388cbd5451bffdd436293cc0613a9ab1904e76cfa *electron-v39.8.4-mas-x64-symbols.zip
++51c310921e5740a91a75d89819f89757210707a913691fe07d60e84100102d42 *electron-v39.8.4-mas-x64.zip
++3aacf6f224b5438350c1ea5524cb0c962f6d60f8e00f297fc872dce9633aed7d *electron-v39.8.4-win32-arm64-pdb.zip
++180f870fbe3aff8d4ca837ff41b5e1dd04d63b0ae0cc2fcf8d7e20e518f4fcb6 *electron-v39.8.4-win32-arm64-symbols.zip
++b701e63ca5d443d9bd1b653ea0e2b7479f0d834a3d1bd9f10a3b745d29607154 *electron-v39.8.4-win32-arm64-toolchain-profile.zip
++4316324e59d8bceee77366a4ed7a8d3f087ccdf2232b9cac61d600c28fcf0876 *electron-v39.8.4-win32-arm64.zip
++110fa00b9defb546e6110022be00c2f8ef2306b7104e2a1f749dc2b74d467e57 *electron-v39.8.4-win32-ia32-pdb.zip
++ae8c656e2d43493a6c245235ca17f1ddd8ae9632f73348a8f76d76240c5f33f6 *electron-v39.8.4-win32-ia32-symbols.zip
++b701e63ca5d443d9bd1b653ea0e2b7479f0d834a3d1bd9f10a3b745d29607154 *electron-v39.8.4-win32-ia32-toolchain-profile.zip
++f260df3274199f29e32e89efb7bcd846db30d6ccdcc46cc3be9c19be9bc16566 *electron-v39.8.4-win32-ia32.zip
++2e37fd5956a3b73d99e569ea71cc463ba550440835f7672d0651c309d2489c52 *electron-v39.8.4-win32-x64-pdb.zip
++b1601c04324691324b2943aeda1309dbd8dac20cc5f4df32f4aa12d5a68c4b0c *electron-v39.8.4-win32-x64-symbols.zip
++b701e63ca5d443d9bd1b653ea0e2b7479f0d834a3d1bd9f10a3b745d29607154 *electron-v39.8.4-win32-x64-toolchain-profile.zip
++8acc4bb73f05a32eba18bd08e7bc4636e41b2fd00cb538cb90becffbca997789 *electron-v39.8.4-win32-x64.zip
++3675395eef7139544965c3408f1426e4af36055627c5ec0c2fe5abf4cecf6977 *electron.d.ts
++27cf8e375bc22ceea6b3d42132f2927ea544edac2b8b2c5dc3c10b5df8dfb027 *ffmpeg-v39.8.4-darwin-arm64.zip
++321d9c07f74c6cf77027ec07d888fb7b634d6589207e3c9e016c43e277ca9944 *ffmpeg-v39.8.4-darwin-x64.zip
++52ae6eccbdb4a9403a6c3eb46b356a28940ec25958b6b9181fb2f38e612e40ed *ffmpeg-v39.8.4-linux-arm64.zip
++622cb781fb1e3b9617e7e60c36384427f7b0d9b5ad888e9bc356a83b050e13f1 *ffmpeg-v39.8.4-linux-armv7l.zip
++ba441851788008362f013bf2983b22b0042af8df31bf90123328f928cc067492 *ffmpeg-v39.8.4-linux-x64.zip
++27cf8e375bc22ceea6b3d42132f2927ea544edac2b8b2c5dc3c10b5df8dfb027 *ffmpeg-v39.8.4-mas-arm64.zip
++321d9c07f74c6cf77027ec07d888fb7b634d6589207e3c9e016c43e277ca9944 *ffmpeg-v39.8.4-mas-x64.zip
++71d478432519dda32a53c47eb5fcb97d23265273ff7939da54cccf7a19f6f87e *ffmpeg-v39.8.4-win32-arm64.zip
++3c52c43a62ebf1ebbe0c02611ad4399eb0131257849b707156417ffcbaa144c8 *ffmpeg-v39.8.4-win32-ia32.zip
++5613f1bd387d6c91f4c3901b22643c5400c696e2dacbb7d9893d0e63edc51ae9 *ffmpeg-v39.8.4-win32-x64.zip
++d720519f7417fe58d60d54085a0c32e8e7b65883cad909ee55d1b9b78f86362d *hunspell_dictionaries.zip
++a4c6e3aef474b21e7f002858ddef194da1b64e8b20ecabdaea9533d1d2712738 *libcxx-objects-v39.8.4-linux-arm64.zip
++bd9f1876dddbc413fc3328707f4f7f9daa2df7cb81d4d9e13f520168ec9eb76a *libcxx-objects-v39.8.4-linux-armv7l.zip
++8403bc29cd82a40f422c63fdbaa61b85d28ff58e5e90e378a97c0715133b87c4 *libcxx-objects-v39.8.4-linux-x64.zip
++9bbb19892567a3a9abd0f6288f9f203fa3051387c3e4625fc52eb49adcbe96e5 *libcxx_headers.zip
++9b988e2bb379c6d3094872f600944ad3284510cf225f86368c4f43270b89673c *libcxxabi_headers.zip
++f106faec00f811971cce77bb39a2ef08ddeb3e6b3b6f96991a4ab889c06636a3 *mksnapshot-v39.8.4-darwin-arm64.zip
++23ca2a8fbe7d870c745c6808dced54889883d259fd6a601174b81891dfd1a052 *mksnapshot-v39.8.4-darwin-x64.zip
++23b78843edf3ad2ad2a38eb88578105a75335c397bd4f7cc1fdf54f890fb9d9b *mksnapshot-v39.8.4-linux-arm64-x64.zip
++582d768b97f13d5991fb96dbbba54f7c5da4248634952d77eac342ecd5db29a5 *mksnapshot-v39.8.4-linux-armv7l-x64.zip
++677e242eca2487d1427e035cc9e54750a3bb2528f761af483e5a6d67f81f69dc *mksnapshot-v39.8.4-linux-x64.zip
++fadb9ec8cbf598ef49d5dac34c764a2d2487d41111e3201dd13ad6f09d48c591 *mksnapshot-v39.8.4-mas-arm64.zip
++2a912c91dffeae2e8a97b7e49fe67f7dfb7d13f8e441bb5c2c40d2583ae504ca *mksnapshot-v39.8.4-mas-x64.zip
++fc5478a848c95a1412efdc550d16e4e83c7c2db5f98c658da2430c4275e5f6cb *mksnapshot-v39.8.4-win32-arm64-x64.zip
++b279c6292e1937a9c6aa7421415434e8f40ed7ba818851f57227cdedbdd19e7b *mksnapshot-v39.8.4-win32-ia32.zip
++c5b457d293d35f98d9d548613fce3c6ee111242760d381ed39d6c721b3d09918 *mksnapshot-v39.8.4-win32-x64.zip
+\ No newline at end of file
+diff --git a/cgmanifest.json b/cgmanifest.json
+index 1b1e171..09d805b 100644
+--- a/cgmanifest.json
++++ b/cgmanifest.json
+@@ -531,4 +531,4 @@
+ "repositoryUrl": "https://github.com/electron/electron",
+- "commitHash": "69c8cbf259da0f84e9c1db04958516a68f7170aa",
+- "tag": "39.8.0"
++ "commitHash": "7007907df08d02da98f513dcbdb430ab51be59c7",
++ "tag": "39.8.4"
+ }
+diff --git a/package-lock.json b/package-lock.json
+index 3795213..9d261de 100644
+--- a/package-lock.json
++++ b/package-lock.json
+@@ -104,3 +104,3 @@
+ "deemon": "^1.13.6",
+- "electron": "39.8.0",
++ "electron": "39.8.4",
+ "eslint": "^9.36.0",
+@@ -8389,5 +8389,5 @@
+ "node_modules/electron": {
+- "version": "39.8.0",
+- "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.0.tgz",
+- "integrity": "sha512-K+f3YelSyh9Q4LgUXuIhLB4kq73LJrqnIbe8ih9vpWi+iSdPebj0w7FRYwILCMDoyBQMFC9LicYHuIPmZzdKlg==",
++ "version": "39.8.4",
++ "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.4.tgz",
++ "integrity": "sha512-eXYKxr4y+s31xs78keVJYg+XY20tGQMQzyIhZvc5L0XRDH2Gp08mbeFlbR1OjAeM5h5l/T2JYT2MFK2kYe2fMg==",
+ "dev": true,
+diff --git a/package.json b/package.json
+index 295d4b3..6e707ed 100644
+--- a/package.json
++++ b/package.json
+@@ -174,3 +174,3 @@
+ "deemon": "^1.13.6",
+- "electron": "39.8.0",
++ "electron": "39.8.4",
+ "eslint": "^9.36.0",
diff --git a/patches/sourcemaps.patch b/patches/00-build-update-sourcemap-url.patch
similarity index 100%
rename from patches/sourcemaps.patch
rename to patches/00-build-update-sourcemap-url.patch
diff --git a/patches/disable-cloud.patch b/patches/00-cloud-remove.patch
similarity index 100%
rename from patches/disable-cloud.patch
rename to patches/00-cloud-remove.patch
diff --git a/patches/feat-announcements.patch b/patches/00-community-add-announcements.patch
similarity index 87%
rename from patches/feat-announcements.patch
rename to patches/00-community-add-announcements.patch
index 6710cc9be4c..e7d346e0108 100644
--- a/patches/feat-announcements.patch
+++ b/patches/00-community-add-announcements.patch
@@ -1,8 +1,8 @@
diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
-index e025130..f42db8d 100644
+index 067580a4..2ad8759f 100644
--- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
+++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
-@@ -343,2 +343,9 @@ configurationRegistry.registerConfiguration({
+@@ -316,2 +316,9 @@ configurationRegistry.registerConfiguration({
},
+ 'workbench.welcomePage.extraAnnouncements': {
+ scope: ConfigurationScope.MACHINE,
@@ -13,10 +13,10 @@ index e025130..f42db8d 100644
+ },
'workbench.startupEditor': {
diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts
-index 01778b2..615828d 100644
+index 0cb22b9c..1dfea59f 100644
--- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts
+++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts
-@@ -117,4 +117,8 @@ type GettingStartedActionEvent = {
+@@ -119,4 +119,8 @@ type GettingStartedActionEvent = {
type RecentEntry = (IRecentFolder | IRecentWorkspace) & { id: string };
+type AnnouncementEntry = { id: string, title: string, url: string };
@@ -26,25 +26,25 @@ index 01778b2..615828d 100644
+
export class GettingStartedPage extends EditorPane {
@@ -154,2 +158,4 @@ export class GettingStartedPage extends EditorPane {
- private gettingStartedList?: GettingStartedIndexList;
+ private readonly gettingStartedList = this._register(new MutableDisposable>());
+ private announcementList?: GettingStartedIndexList;
+ private announcementData?: AnnouncementEntry[];
-@@ -880,2 +886,3 @@ export class GettingStartedPage extends EditorPane {
+@@ -936,2 +942,3 @@ export class GettingStartedPage extends EditorPane {
const gettingStartedList = this.buildGettingStartedWalkthroughsList();
+ const announcementList = await this.buildAnnouncementList();
-@@ -890,3 +897,3 @@ export class GettingStartedPage extends EditorPane {
+@@ -960,3 +967,3 @@ export class GettingStartedPage extends EditorPane {
this.container.classList.remove('noWalkthroughs');
- reset(rightColumn, gettingStartedList.getDomElement());
+ reset(rightColumn, gettingStartedList.getDomElement(), announcementList.getDomElement());
}
-@@ -894,3 +901,3 @@ export class GettingStartedPage extends EditorPane {
+@@ -964,3 +971,3 @@ export class GettingStartedPage extends EditorPane {
this.container.classList.add('noWalkthroughs');
- reset(rightColumn);
+ reset(rightColumn, announcementList.getDomElement());
}
-@@ -1047,2 +1054,55 @@ export class GettingStartedPage extends EditorPane {
+@@ -1151,2 +1158,55 @@ export class GettingStartedPage extends EditorPane {
+ private async buildAnnouncementList(): Promise> {
+ const renderAnnouncement = (announcement: AnnouncementEntry) => {
diff --git a/patches/terminal-suggest.patch b/patches/00-copilot-disable-terminal-suggest.patch
similarity index 100%
rename from patches/terminal-suggest.patch
rename to patches/00-copilot-disable-terminal-suggest.patch
diff --git a/patches/00-copilot-fix-action-condition.patch b/patches/00-copilot-fix-action-condition.patch
new file mode 100644
index 00000000000..71050b156ad
--- /dev/null
+++ b/patches/00-copilot-fix-action-condition.patch
@@ -0,0 +1,140 @@
+diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts
+index 55b877bd..9ba4d627 100644
+--- a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts
++++ b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts
+@@ -1169,3 +1169,3 @@ export function registerChatActions() {
+ precondition: ContextKeyExpr.and(
+- ChatContextKeys.Setup.installed,
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.disabled.negate(),
+diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts
+index 00c445ab..f1e87408 100644
+--- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts
++++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts
+@@ -319,3 +319,4 @@ class AttachSelectionToChatAction extends Action2 {
+ ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeUserData)
+- )
++ ),
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ )
+diff --git a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts
+index 74a6b479..3c5ac6bc 100644
+--- a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts
++++ b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts
+@@ -1615,3 +1615,3 @@ configurationRegistry.registerConfiguration({
+ description: nls.localize('chat.disableAIFeatures', "Disable and hide built-in AI features provided by GitHub Copilot, including chat and inline suggestions."),
+- default: false,
++ default: true,
+ scope: ConfigurationScope.WINDOW,
+diff --git a/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts b/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts
+index 8fb472b3..7b26c605 100644
+--- a/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts
++++ b/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts
+@@ -74,2 +74,3 @@ const chatViewDescriptor: IViewDescriptor = {
+ ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.hidden.negate(),
+diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts
+index 90d39a49..72455fa4 100644
+--- a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts
++++ b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts
+@@ -232,8 +232,9 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
+ f1: true,
+- precondition: ContextKeyExpr.or(
+- ChatContextKeys.Setup.hidden,
+- ChatContextKeys.Setup.disabledInWorkspace,
+- ChatContextKeys.Setup.untrusted,
+- ChatContextKeys.Setup.completed.negate(),
+- ChatContextKeys.Entitlement.canSignUp
++ precondition: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
++ ChatContextKeys.Setup.hidden.negate(),
++ ChatContextKeys.Setup.disabledInWorkspace.negate(),
++ ChatContextKeys.Setup.untrusted.negate(),
++ ChatContextKeys.Setup.completed,
++ ChatContextKeys.Entitlement.canSignUp.negate()
+ )
+@@ -370,2 +371,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
+ when: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.hidden.negate(),
+@@ -403,2 +405,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
+ when: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ IsWebContext.negate(),
+@@ -452,2 +455,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
+ precondition: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.hidden.negate(),
+@@ -511,2 +515,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
+ precondition: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.hidden.negate(),
+@@ -609,2 +614,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
+ const internalGenerateCodeContext = ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.hidden.negate(),
+@@ -837,3 +843,7 @@ export class ChatTeardownContribution extends Disposable implements IWorkbenchCo
+ category: CHAT_CATEGORY,
+- precondition: ContextKeyExpr.and(ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate()),
++ precondition: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
++ ChatContextKeys.Setup.hidden.negate(),
++ ChatContextKeys.Setup.disabledInWorkspace.negate()
++ ),
+ menu: {
+diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts
+index 7e5d8f63..e949b389 100644
+--- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts
++++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts
+@@ -44,3 +44,4 @@ const inlineChatContextKey = ContextKeyExpr.and(
+ EditorContextKeys.writable,
+- EditorContextKeys.editorSimpleInput.negate()
++ EditorContextKeys.editorSimpleInput.negate(),
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ );
+diff --git a/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts b/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
+index dc231e44..633de730 100644
+--- a/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
++++ b/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
+@@ -545,3 +545,3 @@ export class McpServersViewsContribution extends Disposable implements IWorkbenc
+ ctorDescriptor: new SyncDescriptor(McpServersListView, [{}]),
+- when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext, ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate()),
++ when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext, ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), ContextKeyExpr.has('config.chat.disableAIFeatures').negate()),
+ weight: 40,
+@@ -554,3 +554,3 @@ export class McpServersViewsContribution extends Disposable implements IWorkbenc
+ ctorDescriptor: new SyncDescriptor(DefaultBrowseMcpServersView, [{}]),
+- when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyExpr.or(ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`), ProductQualityContext.notEqualsTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`))),
++ when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyExpr.or(ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`), ProductQualityContext.notEqualsTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`)), ContextKeyExpr.has('config.chat.disableAIFeatures').negate()),
+ weight: 40,
+@@ -563,3 +563,3 @@ export class McpServersViewsContribution extends Disposable implements IWorkbenc
+ ctorDescriptor: new SyncDescriptor(McpServersListView, [{}]),
+- when: ContextKeyExpr.and(SearchMcpServersContext, ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyExpr.or(ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`), ProductQualityContext.notEqualsTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`))),
++ when: ContextKeyExpr.and(SearchMcpServersContext, ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyExpr.or(ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`), ProductQualityContext.notEqualsTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`)), ContextKeyExpr.has('config.chat.disableAIFeatures').negate()),
+ },
+@@ -569,3 +569,3 @@ export class McpServersViewsContribution extends Disposable implements IWorkbenc
+ ctorDescriptor: new SyncDescriptor(DefaultBrowseMcpServersView, [{ showWelcome: true }]),
+- when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`).negate(), ProductQualityContext.isEqualTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`).negate()),
++ when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`).negate(), ProductQualityContext.isEqualTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`).negate(), ContextKeyExpr.has('config.chat.disableAIFeatures').negate()),
+ weight: 40,
+@@ -578,3 +578,3 @@ export class McpServersViewsContribution extends Disposable implements IWorkbenc
+ ctorDescriptor: new SyncDescriptor(McpServersListView, [{ showWelcome: true }]),
+- when: ContextKeyExpr.and(SearchMcpServersContext, ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`).negate(), ProductQualityContext.isEqualTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`).negate()),
++ when: ContextKeyExpr.and(SearchMcpServersContext, ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`).negate(), ProductQualityContext.isEqualTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`).negate(), ContextKeyExpr.has('config.chat.disableAIFeatures').negate()),
+ }
+diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts
+index 6ee2a32c..c5cdc792 100644
+--- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts
++++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts
+@@ -680,2 +680,3 @@ registerAction2(class extends Action2 {
+ when: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.hidden.negate(),
+diff --git a/src/vs/workbench/contrib/scm/browser/scmInput.ts b/src/vs/workbench/contrib/scm/browser/scmInput.ts
+index 6adf03c6..38a6d42c 100644
+--- a/src/vs/workbench/contrib/scm/browser/scmInput.ts
++++ b/src/vs/workbench/contrib/scm/browser/scmInput.ts
+@@ -848,2 +848,3 @@ registerAction2(class extends Action2 {
+ when: ContextKeyExpr.and(
++ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
+ ChatContextKeys.Setup.hidden.negate(),
diff --git a/patches/00-ext-git-ai-coauthor-off.patch b/patches/00-ext-git-ai-coauthor-off.patch
new file mode 100644
index 00000000000..e18abc514e5
--- /dev/null
+++ b/patches/00-ext-git-ai-coauthor-off.patch
@@ -0,0 +1,8 @@
+diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts
+index 77f1acf2..53d694ba 100644
+--- a/extensions/git/src/repository.ts
++++ b/extensions/git/src/repository.ts
+@@ -1505,2 +1505,3 @@ export class Repository implements Disposable {
+ const config = workspace.getConfiguration('git', Uri.file(this.root));
++ // Make sure that AI CoAuthor is off
+ const addAICoAuthor = config.get<'off' | 'chatAndAgent' | 'all'>('addAICoAuthor', 'off');
diff --git a/patches/use-github-pat.patch b/patches/00-ext-github-authentication-use-pat.patch
similarity index 92%
rename from patches/use-github-pat.patch
rename to patches/00-ext-github-authentication-use-pat.patch
index 8cb15a32c66..48b9c078be5 100644
--- a/patches/use-github-pat.patch
+++ b/patches/00-ext-github-authentication-use-pat.patch
@@ -1,5 +1,5 @@
diff --git a/extensions/github-authentication/src/common/env.ts b/extensions/github-authentication/src/common/env.ts
-index 5456fb8..18fd732 100644
+index 56cad4be..18fd7327 100644
--- a/extensions/github-authentication/src/common/env.ts
+++ b/extensions/github-authentication/src/common/env.ts
@@ -7,24 +7,4 @@ import { AuthProviderType } from '../github';
@@ -8,9 +8,9 @@ index 5456fb8..18fd732 100644
- 'vscode',
- 'vscode-insiders',
- 'vscode-exploration',
-- 'vscode-sessions',
-- 'vscode-sessions-insiders',
-- 'vscode-sessions-exploration',
+- 'vscode-agents',
+- 'vscode-agents-insiders',
+- 'vscode-agents-exploration',
- // On Windows, some browsers don't seem to redirect back to OSS properly.
- // As a result, you get stuck in the auth flow. We exclude this from the
- // list until we can figure out a way to fix this behavior in browsers.
diff --git a/patches/disable-vscodedev.patch b/patches/00-ext-github-remove-vscodedev.patch
similarity index 100%
rename from patches/disable-vscodedev.patch
rename to patches/00-ext-github-remove-vscodedev.patch
diff --git a/patches/disable-signature-verification.patch b/patches/00-extension-disable-signature-verification.patch
similarity index 100%
rename from patches/disable-signature-verification.patch
rename to patches/00-extension-disable-signature-verification.patch
diff --git a/patches/fix-remote-libs.patch b/patches/00-remote-add-missing-dependencies.patch
similarity index 100%
rename from patches/fix-remote-libs.patch
rename to patches/00-remote-add-missing-dependencies.patch
diff --git a/patches/00-remote-add-url.patch b/patches/00-remote-add-url.patch
new file mode 100644
index 00000000000..88bf312dd4a
--- /dev/null
+++ b/patches/00-remote-add-url.patch
@@ -0,0 +1,16 @@
+diff --git a/build/gulpfile.reh.ts b/build/gulpfile.reh.ts
+index 62c30da5..c1163a05 100644
+--- a/build/gulpfile.reh.ts
++++ b/build/gulpfile.reh.ts
+@@ -369,2 +369,3 @@ function packageTask(type: string, platform: string, arch: string, sourceFolderN
+ json.version = version;
++ json.serverDownloadUrlTemplate = 'https://github.com/!!ASSETS_REPOSITORY!!/releases/download/!!RELEASE_VERSION!!/!!APP_NAME_LC!!-reh-${os}-${arch}-!!RELEASE_VERSION!!.tar.gz';
+ // Stamp agentSdks from the per-platform results file produced
+diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
+index 53987f88..661928c2 100644
+--- a/build/gulpfile.vscode.ts
++++ b/build/gulpfile.vscode.ts
+@@ -307,2 +307,3 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
+ json.version = version;
++ json.serverDownloadUrlTemplate = 'https://github.com/!!ASSETS_REPOSITORY!!/releases/download/!!RELEASE_VERSION!!/!!APP_NAME_LC!!-reh-${os}-${arch}-!!RELEASE_VERSION!!.tar.gz';
+ // Stamp agentSdks from the per-platform results file produced
diff --git a/patches/00-remote-disable-client-validation.patch b/patches/00-remote-disable-client-validation.patch
new file mode 100644
index 00000000000..72815f4e8cb
--- /dev/null
+++ b/patches/00-remote-disable-client-validation.patch
@@ -0,0 +1,51 @@
+diff --git a/src/vs/server/node/remoteExtensionHostAgentServer.ts b/src/vs/server/node/remoteExtensionHostAgentServer.ts
+index 5c4f3c2a..91010c0b 100644
+--- a/src/vs/server/node/remoteExtensionHostAgentServer.ts
++++ b/src/vs/server/node/remoteExtensionHostAgentServer.ts
+@@ -77,2 +77,3 @@ class RemoteExtensionHostAgentServer extends Disposable implements IServerAPI {
+ serverBasePath: string | undefined,
++ private readonly _disableClientValidation: boolean | undefined,
+ @IServerEnvironmentService private readonly _environmentService: IServerEnvironmentService,
+@@ -100,3 +101,3 @@ class RemoteExtensionHostAgentServer extends Disposable implements IServerAPI {
+ );
+- this._logService.info(`Extension host agent started.`);
++ this._logService.info(`Extension host agent started. (validation: ${!this._disableClientValidation})`);
+ this._reconnectionGraceTime = this._environmentService.reconnectionGraceTime;
+@@ -334,8 +335,10 @@ class RemoteExtensionHostAgentServer extends Disposable implements IServerAPI {
+
+- const rendererCommit = msg2.commit;
+- const myCommit = this._productService.commit;
+- if (rendererCommit && myCommit) {
+- // Running in the built version where commits are defined
+- if (rendererCommit !== myCommit) {
+- return rejectWebSocketConnection(`Client refused: version mismatch`);
++ if(!this._disableClientValidation) {
++ const rendererCommit = msg2.commit;
++ const myCommit = this._productService.commit;
++ if (rendererCommit && myCommit) {
++ // Running in the built version where commits are defined
++ if (rendererCommit !== myCommit) {
++ return rejectWebSocketConnection(`Client refused: version mismatch`);
++ }
+ }
+@@ -700,3 +703,5 @@ export async function createServer(address: string | net.AddressInfo | null, arg
+
+- const remoteExtensionHostAgentServer = instantiationService.createInstance(RemoteExtensionHostAgentServer, socketServer, connectionToken, vsdaMod, hasWebClient, serverBasePath);
++ let disableClientValidation = args['disable-client-validation'];
++
++ const remoteExtensionHostAgentServer = instantiationService.createInstance(RemoteExtensionHostAgentServer, socketServer, connectionToken, vsdaMod, hasWebClient, serverBasePath, disableClientValidation);
+
+diff --git a/src/vs/server/node/serverEnvironmentService.ts b/src/vs/server/node/serverEnvironmentService.ts
+index bacdd289..194b5485 100644
+--- a/src/vs/server/node/serverEnvironmentService.ts
++++ b/src/vs/server/node/serverEnvironmentService.ts
+@@ -35,2 +35,4 @@ export const serverOptions: OptionDescriptions> = {
+
++ 'disable-client-validation': { type: 'boolean' },
++
+ /* ----- vs code options --- -- */
+@@ -227,2 +229,4 @@ export interface ServerParsedArgs {
+
++ 'disable-client-validation'?: boolean;
++
+ /* ----- server cli ----- */
diff --git a/patches/disable-missing-vsda.patch b/patches/00-remote-remove-missing-vsda.patch
similarity index 100%
rename from patches/disable-missing-vsda.patch
rename to patches/00-remote-remove-missing-vsda.patch
diff --git a/patches/feat-command-filter.patch b/patches/00-security-add-command-filter.patch
similarity index 100%
rename from patches/feat-command-filter.patch
rename to patches/00-security-add-command-filter.patch
diff --git a/patches/fix-gallery.patch b/patches/00-settings-gallery.patch
similarity index 100%
rename from patches/fix-gallery.patch
rename to patches/00-settings-gallery.patch
diff --git a/patches/feat-user-product.patch b/patches/00-settings-user-product.patch
similarity index 100%
rename from patches/feat-user-product.patch
rename to patches/00-settings-user-product.patch
diff --git a/patches/telemetry.patch b/patches/00-telemetry-disable.patch
similarity index 100%
rename from patches/telemetry.patch
rename to patches/00-telemetry-disable.patch
diff --git a/patches/fix-tunnel-extension-recommendation.patch b/patches/00-tunnel-disable-recommendation.patch
similarity index 100%
rename from patches/fix-tunnel-extension-recommendation.patch
rename to patches/00-tunnel-disable-recommendation.patch
diff --git a/patches/feat-experimental-font.patch b/patches/00-ui-custom-font.patch
similarity index 91%
rename from patches/feat-experimental-font.patch
rename to patches/00-ui-custom-font.patch
index 2352c04383d..3d441a7372e 100644
--- a/patches/feat-experimental-font.patch
+++ b/patches/00-ui-custom-font.patch
@@ -1,5 +1,5 @@
diff --git a/src/vs/base/browser/ui/actionbar/actionbar.css b/src/vs/base/browser/ui/actionbar/actionbar.css
-index e9e55ad..0ce9147 100644
+index e9e55ad9..0ce9147c 100644
--- a/src/vs/base/browser/ui/actionbar/actionbar.css
+++ b/src/vs/base/browser/ui/actionbar/actionbar.css
@@ -127 +127,72 @@
@@ -77,10 +77,10 @@ index e9e55ad..0ce9147 100644
+}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/button/button.css b/src/vs/base/browser/ui/button/button.css
-index 8496f1b..964455a 100644
+index f8f02ab6..a7c88ff8 100644
--- a/src/vs/base/browser/ui/button/button.css
+++ b/src/vs/base/browser/ui/button/button.css
-@@ -183 +183,43 @@
+@@ -194 +194,46 @@
}
+
+
@@ -117,6 +117,9 @@ index 8496f1b..964455a 100644
+.monaco-workbench .part.sidebar .monaco-button-dropdown .monaco-button-dropdown-separator > div, .monaco-workbench .part.auxiliarybar .monaco-button-dropdown .monaco-button-dropdown-separator > div {
+ width: 1px
+}
++.monaco-workbench .part.sidebar .monaco-button-dropdown > .monaco-button.monaco-dropdown-button, .monaco-workbench .part.auxiliarybar .monaco-button-dropdown > .monaco-button.monaco-dropdown-button {
++ padding: 0 calc(var(--vscode-workbench-sidebar-font-size) * 0.307692)
++}
+.monaco-workbench .part.sidebar .monaco-description-button, .monaco-workbench .part.auxiliarybar .monaco-description-button {
+ margin: calc(var(--vscode-workbench-sidebar-font-size) * 0.307692) calc(var(--vscode-workbench-sidebar-font-size) * 0.384615)
+}
@@ -126,20 +129,27 @@ index 8496f1b..964455a 100644
+}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/codicons/codicon/codicon.css b/src/vs/base/browser/ui/codicons/codicon/codicon.css
-index d7f257d..af55bdd 100644
+index d7f257db..8d21f859 100644
--- a/src/vs/base/browser/ui/codicons/codicon/codicon.css
+++ b/src/vs/base/browser/ui/codicons/codicon/codicon.css
-@@ -25 +25,7 @@
+@@ -25 +25,14 @@
/* icon rules are dynamically created by the platform theme service (see iconsStyleSheet.ts) */
+
+
+
++/*** Handcrafted for Custom Font Size ***/
++.monaco-workbench .part.titlebar .codicon[class*='codicon-'] {
++ font-size: 16px;
++}
+.monaco-workbench .part.sidebar .codicon[class*='codicon-'], .monaco-workbench .part.auxiliarybar .codicon[class*='codicon-'] {
-+ font: normal normal normal calc(var(--vscode-workbench-sidebar-font-size) * 1.230769)/1 codicon
++ font-size: calc(var(--vscode-workbench-sidebar-font-size) * 1.230769)
++}
++.monaco-workbench .part .codicon[class*='codicon-'] {
++ font-size: calc(var(--vscode-workbench-font-size) * 1.230769)
+}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/iconLabel/iconlabel.css b/src/vs/base/browser/ui/iconLabel/iconlabel.css
-index d3dfd9a..cf59627 100644
+index d3dfd9a5..cf596272 100644
--- a/src/vs/base/browser/ui/iconLabel/iconlabel.css
+++ b/src/vs/base/browser/ui/iconLabel/iconlabel.css
@@ -119 +119,21 @@
@@ -166,7 +176,7 @@ index d3dfd9a..cf59627 100644
+}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/inputbox/inputBox.css b/src/vs/base/browser/ui/inputbox/inputBox.css
-index dc5e637..b580762 100644
+index dc5e637f..b580762b 100644
--- a/src/vs/base/browser/ui/inputbox/inputBox.css
+++ b/src/vs/base/browser/ui/inputbox/inputBox.css
@@ -107 +107,28 @@
@@ -200,7 +210,7 @@ index dc5e637..b580762 100644
+}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/selectBox/selectBox.css b/src/vs/base/browser/ui/selectBox/selectBox.css
-index fd4d00e..92ddc99 100644
+index fd4d00ea..92ddc996 100644
--- a/src/vs/base/browser/ui/selectBox/selectBox.css
+++ b/src/vs/base/browser/ui/selectBox/selectBox.css
@@ -35 +35,16 @@
@@ -222,7 +232,7 @@ index fd4d00e..92ddc99 100644
+}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts
-index b7cbca1..16f531c 100644
+index b7cbca15..16f531cb 100644
--- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts
+++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts
@@ -8,2 +8,3 @@ import * as arrays from '../../../common/arrays.js';
@@ -235,10 +245,10 @@ index b7cbca1..16f531c 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/base/browser/ui/splitview/paneview.css b/src/vs/base/browser/ui/splitview/paneview.css
-index 7bb4282..92c027a 100644
+index ab4d9495..fba44ec9 100644
--- a/src/vs/base/browser/ui/splitview/paneview.css
+++ b/src/vs/base/browser/ui/splitview/paneview.css
-@@ -153 +153,38 @@
+@@ -154 +154,38 @@
}
+
+
@@ -279,42 +289,43 @@ index 7bb4282..92c027a 100644
+}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/splitview/paneview.ts b/src/vs/base/browser/ui/splitview/paneview.ts
-index fb2e1f4..3b1e23f 100644
+index 024b2147..19790a0b 100644
--- a/src/vs/base/browser/ui/splitview/paneview.ts
+++ b/src/vs/base/browser/ui/splitview/paneview.ts
@@ -21,2 +21,3 @@ import { IView, Sizing, SplitView } from './splitview.js';
import { applyDragImage } from '../dnd/dnd.js';
+import { FONT } from '../../../common/font.js';
-@@ -50,4 +51,2 @@ export abstract class Pane extends Disposable implements IView {
+@@ -50,8 +51,2 @@ export abstract class Pane extends Disposable implements IView {
+- /**
+- * Fallback header size (in px) used when the `--pane-header-size` CSS variable
+- * is not resolvable (e.g. before the element is attached to the document).
+- */
- private static readonly HEADER_SIZE = 22;
-
readonly element: HTMLElement;
-@@ -121,3 +120,3 @@ export abstract class Pane extends Disposable implements IView {
- private get headerSize(): number {
-- return this.headerVisible ? Pane.HEADER_SIZE : 0;
-+ return this.headerVisible ? FONT.sidebarSize22 : 0;
- }
-@@ -300,3 +299,3 @@ export abstract class Pane extends Disposable implements IView {
- layout(size: number): void {
-- const headerSize = this.headerVisible ? Pane.HEADER_SIZE : 0;
-+ const headerSize = this.headerSize;
-
+@@ -151,3 +146,3 @@ export abstract class Pane extends Disposable implements IView {
+ const size = parseInt(getWindow(this.element).getComputedStyle(this.element).getPropertyValue('--pane-header-size'), 10);
+- this._headerSize = isNaN(size) ? Pane.HEADER_SIZE : size;
++ this._headerSize = isNaN(size) ? FONT.sidebarSize22 : size;
+ }
diff --git a/src/vs/base/browser/ui/toggle/toggle.css b/src/vs/base/browser/ui/toggle/toggle.css
-index e2d206d..e69352c 100644
+index 14516fc5..40a4410d 100644
--- a/src/vs/base/browser/ui/toggle/toggle.css
+++ b/src/vs/base/browser/ui/toggle/toggle.css
-@@ -69 +69,27 @@
+@@ -75 +75,52 @@
}
+
+
+
++/*** Generated for Custom Font Size ***/
++
+.monaco-workbench .part.sidebar .monaco-custom-toggle, .monaco-workbench .part.auxiliarybar .monaco-custom-toggle {
+ margin-left: calc(var(--vscode-workbench-sidebar-font-size) * 0.153846);
+ width: calc(var(--vscode-workbench-sidebar-font-size) * 1.538462);
+ height: calc(var(--vscode-workbench-sidebar-font-size) * 1.538462);
-+ padding: calc(var(--vscode-workbench-sidebar-font-size) * 0.076923)
++ padding: 1px
+}
+.monaco-workbench .part.sidebar .monaco-custom-toggle.monaco-checkbox, .monaco-workbench .part.auxiliarybar .monaco-custom-toggle.monaco-checkbox {
+ height: calc(var(--vscode-workbench-sidebar-font-size) * 1.384615);
@@ -333,9 +344,32 @@ index e2d206d..e69352c 100644
+.monaco-workbench .part.sidebar .monaco-action-bar .checkbox-action-item > .checkbox-label, .monaco-workbench .part.auxiliarybar .monaco-action-bar .checkbox-action-item > .checkbox-label {
+ font-size: calc(var(--vscode-workbench-sidebar-font-size) * 0.923077)
+}
++.monaco-workbench .part .monaco-custom-toggle {
++ margin-left: calc(var(--vscode-workbench-font-size) * 0.153846);
++ width: calc(var(--vscode-workbench-font-size) * 1.538462);
++ height: calc(var(--vscode-workbench-font-size) * 1.538462);
++ padding: 1px
++}
++.monaco-workbench .part .monaco-custom-toggle.monaco-checkbox {
++ height: calc(var(--vscode-workbench-font-size) * 1.384615);
++ width: calc(var(--vscode-workbench-font-size) * 1.384615);
++ margin-right: calc(var(--vscode-workbench-font-size) * 0.692308);
++ margin-left: calc(var(--vscode-workbench-font-size) * 0);
++ padding: calc(var(--vscode-workbench-font-size) * 0);
++ background-size: calc(var(--vscode-workbench-font-size) * 1.230769)
++}
++.monaco-workbench .part .monaco-action-bar .checkbox-action-item {
++ padding-right: calc(var(--vscode-workbench-font-size) * 0.153846)
++}
++.monaco-workbench .part .monaco-action-bar .checkbox-action-item > .monaco-custom-toggle.monaco-checkbox {
++ margin-right: calc(var(--vscode-workbench-font-size) * 0.307692)
++}
++.monaco-workbench .part .monaco-action-bar .checkbox-action-item > .checkbox-label {
++ font-size: calc(var(--vscode-workbench-font-size) * 0.923077)
++}
\ No newline at end of file
diff --git a/src/vs/base/browser/ui/toggle/toggle.ts b/src/vs/base/browser/ui/toggle/toggle.ts
-index 0b2fcbb..6370e6f 100644
+index 2a5e4a99..63a3f8d0 100644
--- a/src/vs/base/browser/ui/toggle/toggle.ts
+++ b/src/vs/base/browser/ui/toggle/toggle.ts
@@ -5,2 +5,3 @@
@@ -350,10 +384,10 @@ index 0b2fcbb..6370e6f 100644
}
diff --git a/src/vs/base/common/font.ts b/src/vs/base/common/font.ts
new file mode 100644
-index 0000000..8b9689c
+index 00000000..20d0b27e
--- /dev/null
+++ b/src/vs/base/common/font.ts
-@@ -0,0 +1,187 @@
+@@ -0,0 +1,191 @@
+import { IConfigurationService } from '../../platform/configuration/common/configuration.js';
+
+export const FONT = {
@@ -402,6 +436,8 @@ index 0000000..8b9689c
+ tabsSize38: 38,
+ tabsSize80: 80,
+ tabsSize120: 120,
++
++ workbenchCoefficient: 1,
+};
+
+// Activity bar coefficients (base 16)
@@ -500,6 +536,8 @@ index 0000000..8b9689c
+ FONT.defaultSidebarSize = size
+ FONT.defaultStatusBarSize = size * DEFAULT_COEFF_12
+ FONT.defaultTabsSize = size
++
++ FONT.workbenchCoefficient = size / 13
+}
+
+export function updatePanelSize(size: number): void {
@@ -544,7 +582,7 @@ index 0000000..8b9689c
\ No newline at end of file
diff --git a/src/vs/base/test/common/font.test.ts b/src/vs/base/test/common/font.test.ts
new file mode 100644
-index 0000000..62a49d5
+index 00000000..62a49d53
--- /dev/null
+++ b/src/vs/base/test/common/font.test.ts
@@ -0,0 +1,482 @@
@@ -1030,8 +1068,231 @@ index 0000000..62a49d5
+ assert.strictEqual(FONT.tabsSize35, 35);
+ });
+});
+diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css
+index 62c6056c..3d893baa 100644
+--- a/src/vs/editor/contrib/find/browser/findWidget.css
++++ b/src/vs/editor/contrib/find/browser/findWidget.css
+@@ -281 +281,104 @@
+ }
++
++
++
++/*** Handcrafted for Custom Font Size ***/
++
++.monaco-workbench .part .monaco-editor .find-widget.visible {
++ transform: translateY(0);
++}
++
++.monaco-workbench .part .monaco-editor .find-widget .codicon[class*='codicon-'] {
++ font-size: calc(var(--vscode-workbench-font-size) * 1.230769);
++}
++
++
++
++/*** Generated for Custom Font Size ***/
++
++.monaco-workbench .part .monaco-editor .find-widget {
++ height: calc(var(--vscode-workbench-font-size) * 2.615385);
++ line-height: calc(var(--vscode-workbench-font-size) * 1.461538);
++ padding: 0 calc(var(--vscode-workbench-font-size) * 0.307692) 0 calc(var(--vscode-workbench-font-size) * 0.692308);
++ margin-top: calc(var(--vscode-workbench-font-size) * 0.307692);
++ transform: translateY(calc(-100% - calc(var(--vscode-workbench-font-size) * 0.769231)))
++}
++.monaco-workbench .part .monaco-editor .find-widget textarea {
++ margin: calc(var(--vscode-workbench-font-size) * 0)
++}
++.monaco-workbench .part .monaco-editor .find-widget .monaco-inputbox.synthetic-focus {
++ outline: 1px solid -webkit-focus-ring-color;
++ outline-offset: calc(var(--vscode-workbench-font-size) * -0.076923)
++}
++.monaco-workbench .part .monaco-editor .find-widget .monaco-findInput .input {
++ font-size: calc(var(--vscode-workbench-font-size) * 1)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .find-part, .monaco-workbench .part .monaco-editor .find-widget > .replace-part {
++ margin: calc(var(--vscode-workbench-font-size) * 0.230769) calc(var(--vscode-workbench-font-size) * 1.923077) 0 calc(var(--vscode-workbench-font-size) * 1.307692);
++ font-size: calc(var(--vscode-workbench-font-size) * 0.923077)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .find-part .monaco-inputbox, .monaco-workbench .part .monaco-editor .find-widget > .replace-part .monaco-inputbox {
++ min-height: calc(var(--vscode-workbench-font-size) * 1.923077)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .replace-part .monaco-inputbox > .ibwrapper > .mirror {
++ padding-right: calc(var(--vscode-workbench-font-size) * 1.692308)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .find-part .monaco-inputbox > .ibwrapper > .input, .monaco-workbench .part .monaco-editor .find-widget > .find-part .monaco-inputbox > .ibwrapper > .mirror, .monaco-workbench .part .monaco-editor .find-widget > .replace-part .monaco-inputbox > .ibwrapper > .input, .monaco-workbench .part .monaco-editor .find-widget > .replace-part .monaco-inputbox > .ibwrapper > .mirror {
++ padding-top: calc(var(--vscode-workbench-font-size) * 0.153846);
++ padding-bottom: calc(var(--vscode-workbench-font-size) * 0.153846)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .find-part .find-actions {
++ height: calc(var(--vscode-workbench-font-size) * 1.923077)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .replace-part .replace-actions {
++ height: calc(var(--vscode-workbench-font-size) * 1.923077)
++}
++.monaco-workbench .part .monaco-editor .find-widget .matchesCount {
++ margin: 0 0 0 calc(var(--vscode-workbench-font-size) * 0.230769);
++ padding: calc(var(--vscode-workbench-font-size) * 0.153846) 0 0 calc(var(--vscode-workbench-font-size) * 0.153846);
++ height: calc(var(--vscode-workbench-font-size) * 1.923077);
++ line-height: calc(var(--vscode-workbench-font-size) * 1.769231)
++}
++.monaco-workbench .part .monaco-editor .find-widget .button {
++ width: calc(var(--vscode-workbench-font-size) * 1.230769);
++ height: calc(var(--vscode-workbench-font-size) * 1.230769);
++ padding: calc(var(--vscode-workbench-font-size) * 0.230769);
++ margin-left: calc(var(--vscode-workbench-font-size) * 0.230769)
++}
++.monaco-workbench .part .monaco-editor .find-widget .codicon-find-selection {
++ width: calc(var(--vscode-workbench-font-size) * 1.692308);
++ height: calc(var(--vscode-workbench-font-size) * 1.692308);
++ padding: calc(var(--vscode-workbench-font-size) * 0.230769)
++}
++.monaco-workbench .part .monaco-editor .find-widget .button.left {
++ margin: calc(var(--vscode-workbench-font-size) * 0.307692) 0 calc(var(--vscode-workbench-font-size) * 0.307692) calc(var(--vscode-workbench-font-size) * 0.384615)
++}
++.monaco-workbench .part .monaco-editor .find-widget .button.wide {
++ width: auto;
++ padding: 1px calc(var(--vscode-workbench-font-size) * 0.461538);
++ top: calc(var(--vscode-workbench-font-size) * -0.076923)
++}
++.monaco-workbench .part .monaco-editor .find-widget .button.toggle {
++ width: calc(var(--vscode-workbench-font-size) * 1.384615)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .replace-part > .monaco-findInput > .controls {
++ top: calc(var(--vscode-workbench-font-size) * 0.230769);
++ right: calc(var(--vscode-workbench-font-size) * 0.153846)
++}
++.monaco-workbench .part .monaco-editor .find-widget.narrow-find-widget {
++ max-width: calc(var(--vscode-workbench-font-size) * 19.769231)
++}
++.monaco-workbench .part .monaco-editor .find-widget.collapsed-find-widget {
++ max-width: calc(var(--vscode-workbench-font-size) * 13.076923)
++}
++.monaco-workbench .part .monaco-editor .currentFindMatch {
++ padding: 1px
++}
++.monaco-workbench .part .monaco-editor.hc-black .find-widget .button:before {
++ top: 1px;
++ left: calc(var(--vscode-workbench-font-size) * 0.153846)
++}
++.monaco-workbench .part .monaco-editor .find-widget > .button.codicon-widget-close {
++ top: calc(var(--vscode-workbench-font-size) * 0.384615);
++ right: calc(var(--vscode-workbench-font-size) * 0.307692)
++}
+\ No newline at end of file
+diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts
+index 03e698c3..7d6f5afa 100644
+--- a/src/vs/editor/contrib/find/browser/findWidget.ts
++++ b/src/vs/editor/contrib/find/browser/findWidget.ts
+@@ -47,2 +47,3 @@ import { HoverStyle, type IHoverLifecycleOptions } from '../../../../base/browse
+ import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
++import { FONT } from '../../../../base/common/font.js';
+
+@@ -82,2 +83,3 @@ const PART_WIDTH = 275;
+ const FIND_INPUT_AREA_WIDTH = PART_WIDTH - 54;
++const FLEXIBLE_MAX_HEIGHT = 118;
+
+@@ -98,3 +100,3 @@ export class FindWidgetViewZone implements IViewZone {
+
+- this.heightInPx = FIND_INPUT_AREA_HEIGHT;
++ this.heightInPx = FIND_INPUT_AREA_HEIGHT * FONT.workbenchCoefficient;
+ this.suppressMouseDown = false;
+@@ -767,3 +769,3 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+
+- if (widgetWidth > FIND_WIDGET_INITIAL_WIDTH) {
++ if (widgetWidth > (FIND_WIDGET_INITIAL_WIDTH * FONT.workbenchCoefficient)) {
+ // as the widget is resized by users, we may need to change the max width of the widget as the editor width changes.
+@@ -775,9 +777,12 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+
+- if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth >= editorWidth) {
++ const initialWidth = (FIND_WIDGET_INITIAL_WIDTH + 28) * FONT.workbenchCoefficient
++ const maxMatchesWidth = MAX_MATCHES_COUNT_WIDTH * FONT.workbenchCoefficient
++
++ if (initialWidth + minimapWidth >= editorWidth) {
+ reducedFindWidget = true;
+ }
+- if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth) {
++ if (initialWidth * FONT.workbenchCoefficient + minimapWidth - maxMatchesWidth >= editorWidth) {
+ narrowFindWidget = true;
+ }
+- if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth + 50) {
++ if (initialWidth + minimapWidth - maxMatchesWidth >= editorWidth + 50) {
+ collapsedFindWidget = true;
+@@ -805,2 +810,5 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ private _getHeight(): number {
++ const size2 = 2 * FONT.workbenchCoefficient
++ const size4 = 4 * FONT.workbenchCoefficient
++
+ let totalheight = 0;
+@@ -808,6 +816,6 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ // find input margin top
+- totalheight += 4;
++ totalheight += size4;
+
+ // find input height
+- totalheight += this._findInput.inputBox.height + 2 /** input box border */;
++ totalheight += this._findInput.inputBox.height + size2 /** input box border */;
+
+@@ -815,5 +823,5 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ // replace input margin
+- totalheight += 4;
++ totalheight += size4;
+
+- totalheight += this._replaceInput.inputBox.height + 2 /** input box border */;
++ totalheight += this._replaceInput.inputBox.height + size2 /** input box border */;
+ }
+@@ -821,3 +829,3 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ // margin bottom
+- totalheight += 4;
++ totalheight += size4;
+ return totalheight;
+@@ -990,3 +998,3 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ this._findInput = this._register(new ContextScopedFindInput(null, this._contextViewProvider, {
+- width: FIND_INPUT_AREA_WIDTH,
++ width: FIND_INPUT_AREA_WIDTH * FONT.workbenchCoefficient,
+ label: NLS_FIND_INPUT_LABEL,
+@@ -1010,3 +1018,3 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ flexibleWidth,
+- flexibleMaxHeight: 118,
++ flexibleMaxHeight: FLEXIBLE_MAX_HEIGHT * FONT.workbenchCoefficient,
+ showCommonFindToggles: true,
+@@ -1166,3 +1174,3 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ flexibleWidth,
+- flexibleMaxHeight: 118,
++ flexibleMaxHeight: FLEXIBLE_MAX_HEIGHT,
+ showHistoryHint: () => showHistoryKeybindingHint(this._keybindingService),
+@@ -1262,4 +1270,6 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+
++ let initialWidth = FIND_WIDGET_INITIAL_WIDTH * FONT.workbenchCoefficient;
++
+ // We need to set this explicitly, otherwise on IE11, the width inheritence of flex doesn't work.
+- this._domNode.style.width = `${FIND_WIDGET_INITIAL_WIDTH}px`;
++ this._domNode.style.width = `${initialWidth}px`;
+
+@@ -1272,3 +1282,4 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+ this._resized = false;
+- let originalWidth = FIND_WIDGET_INITIAL_WIDTH;
++
++ let originalWidth = initialWidth;
+
+@@ -1282,3 +1293,3 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+
+- if (width < FIND_WIDGET_INITIAL_WIDTH) {
++ if (width < initialWidth) {
+ // narrow down the find widget should be handled by CSS.
+@@ -1304,3 +1315,3 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+
+- if (currentWidth < FIND_WIDGET_INITIAL_WIDTH) {
++ if (currentWidth < initialWidth) {
+ // The editor is narrow and the width of the find widget is controlled fully by CSS.
+@@ -1309,5 +1320,5 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL
+
+- let width = FIND_WIDGET_INITIAL_WIDTH;
++ let width = initialWidth;
+
+- if (!this._resized || currentWidth === FIND_WIDGET_INITIAL_WIDTH) {
++ if (!this._resized || currentWidth === initialWidth) {
+ // 1. never resized before, double click should maximizes it
diff --git a/src/vs/platform/quickinput/browser/tree/quickInputDelegate.ts b/src/vs/platform/quickinput/browser/tree/quickInputDelegate.ts
-index 328285f..0735dfa 100644
+index 328285f0..0735dfa2 100644
--- a/src/vs/platform/quickinput/browser/tree/quickInputDelegate.ts
+++ b/src/vs/platform/quickinput/browser/tree/quickInputDelegate.ts
@@ -6,2 +6,3 @@
@@ -1044,7 +1305,7 @@ index 328285f..0735dfa 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/browser/media/style.css b/src/vs/workbench/browser/media/style.css
-index 0d6a2da..6127a14 100644
+index b04b3c70..8c7a7a5f 100644
--- a/src/vs/workbench/browser/media/style.css
+++ b/src/vs/workbench/browser/media/style.css
@@ -11,20 +11,20 @@
@@ -1089,7 +1350,7 @@ index 0d6a2da..6127a14 100644
+ font-family: var(--vscode-workbench-font-family, var(--monaco-font));
+ font-size: var(--vscode-workbench-font-size, 13px);
-@@ -335 +337,41 @@ body {
+@@ -355 +357,41 @@ body {
}
+
+
@@ -1133,33 +1394,31 @@ index 0d6a2da..6127a14 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts
-index 0307cab..5e5f6f3 100644
+index ee371523..fea72aba 100644
--- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts
+++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts
-@@ -40,2 +40,3 @@ import { IViewsService } from '../../../services/views/common/viewsService.js';
+@@ -41,2 +41,3 @@ import { IViewsService } from '../../../services/views/common/viewsService.js';
import { SwitchCompositeViewAction } from '../compositeBarActions.js';
+import { FONT, getFontSize, updateActivityBarSize } from '../../../../base/common/font.js';
-@@ -45,2 +46,3 @@ export class ActivitybarPart extends Part {
+@@ -46,2 +47,3 @@ export class ActivitybarPart extends Part {
static readonly COMPACT_ACTION_HEIGHT = 32;
+ static readonly COMPACT_ACTION_HEIGHT_RATIO = 32/48;
-@@ -48,2 +50,3 @@ export class ActivitybarPart extends Part {
+@@ -49,2 +51,3 @@ export class ActivitybarPart extends Part {
static readonly COMPACT_ACTIVITYBAR_WIDTH = 36;
+ static readonly COMPACT_ACTIVITYBAR_WIDTH_RATIO = 36/48;
-@@ -51,2 +54,3 @@ export class ActivitybarPart extends Part {
+@@ -52,2 +55,3 @@ export class ActivitybarPart extends Part {
static readonly COMPACT_ICON_SIZE = 16;
+ static readonly COMPACT_ICON_SIZE_RATIO = 16/24;
-@@ -58,4 +62,4 @@ export class ActivitybarPart extends Part {
+@@ -75,3 +79,3 @@ export class ActivitybarPart extends Part {
+ /** The intrinsic activity bar width (excludes any floating gutter). */
+- private get baseWidth(): number { return this._isCompact ? ActivitybarPart.COMPACT_ACTIVITYBAR_WIDTH : ActivitybarPart.ACTIVITYBAR_WIDTH; }
++ private get baseWidth(): number { return this._isCompact ? FONT.activityBarSize48 * ActivitybarPart.COMPACT_ACTIVITYBAR_WIDTH_RATIO : FONT.activityBarSize48; }
-- get minimumWidth(): number { return this._isCompact ? ActivitybarPart.COMPACT_ACTIVITYBAR_WIDTH : ActivitybarPart.ACTIVITYBAR_WIDTH; }
-- get maximumWidth(): number { return this._isCompact ? ActivitybarPart.COMPACT_ACTIVITYBAR_WIDTH : ActivitybarPart.ACTIVITYBAR_WIDTH; }
-+ get minimumWidth(): number { return this._isCompact ? FONT.activityBarSize48 * ActivitybarPart.COMPACT_ACTIVITYBAR_WIDTH_RATIO : FONT.activityBarSize48; }
-+ get maximumWidth(): number { return this._isCompact ? FONT.activityBarSize48 * ActivitybarPart.COMPACT_ACTIVITYBAR_WIDTH_RATIO : FONT.activityBarSize48; }
- readonly minimumHeight: number = 0;
-@@ -90,2 +94,11 @@ export class ActivitybarPart extends Part {
+@@ -111,2 +115,11 @@ export class ActivitybarPart extends Part {
}));
+
+ this._register(configurationService.onDidChangeConfiguration(e => {
@@ -1171,21 +1430,21 @@ index 0307cab..5e5f6f3 100644
+ }
+ }));
}
-@@ -96,4 +109,4 @@ export class ActivitybarPart extends Part {
- this.element.style.setProperty('--activity-bar-width', `${this.minimumWidth}px`);
+@@ -117,4 +130,4 @@ export class ActivitybarPart extends Part {
+ this.element.style.setProperty('--activity-bar-width', `${this.baseWidth}px`);
- this.element.style.setProperty('--activity-bar-action-height', `${this._isCompact ? ActivitybarPart.COMPACT_ACTION_HEIGHT : ActivitybarPart.ACTION_HEIGHT}px`);
- this.element.style.setProperty('--activity-bar-icon-size', `${this._isCompact ? ActivitybarPart.COMPACT_ICON_SIZE : ActivitybarPart.ICON_SIZE}px`);
+ this.element.style.setProperty('--activity-bar-action-height', `${this._isCompact ? FONT.activityBarSize32 : FONT.activityBarSize48}px`);
+ this.element.style.setProperty('--activity-bar-icon-size', `${this._isCompact ? FONT.activityBarSize : FONT.activityBarSize24}px`);
}
-@@ -153,2 +166,6 @@ export class ActivitybarPart extends Part {
+@@ -174,2 +187,6 @@ export class ActivitybarPart extends Part {
+ // Apply font settings before show() so composite bar uses correct sizes
+ this.applyActivityBarFontFamily(parent);
+ this.applyActivityBarFontSize(parent);
+
this.updateCompactStyle();
-@@ -162,2 +179,34 @@ export class ActivitybarPart extends Part {
+@@ -183,2 +200,34 @@ export class ActivitybarPart extends Part {
+ private applyActivityBarFontFamily(container?: HTMLElement): void {
+ const target = container ?? this.getContainer();
@@ -1221,7 +1480,7 @@ index 0307cab..5e5f6f3 100644
+
getPinnedPaneCompositeIds(): string[] {
diff --git a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css
-index a40a351..51eb067 100644
+index a40a3515..51eb067d 100644
--- a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css
+++ b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css
@@ -230 +230,60 @@
@@ -1287,7 +1546,7 @@ index a40a351..51eb067 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css
-index 568a721..b3d7e50 100644
+index 568a7212..b3d7e506 100644
--- a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css
+++ b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css
@@ -8,2 +8,4 @@
@@ -1306,7 +1565,7 @@ index 568a721..b3d7e50 100644
+ height: calc(var(--vscode-workbench-activitybar-font-size) * 2.1875);
}
diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts
-index d32082b..ad7e524 100644
+index 058edb02..87da0854 100644
--- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts
+++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts
@@ -36,2 +36,4 @@ import { VisibleViewContainersTracker } from '../visibleViewContainersTracker.js
@@ -1362,7 +1621,7 @@ index d32082b..ad7e524 100644
+ this._onDidChange.fire(undefined); // Signal grid that size constraints changed
}
diff --git a/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css b/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css
-index aec3de2..b0e1fd8 100644
+index aec3de2d..b0e1fd8f 100644
--- a/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css
+++ b/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css
@@ -28,2 +28,8 @@
@@ -1375,7 +1634,7 @@ index aec3de2..b0e1fd8 100644
+
.monaco-workbench .part.auxiliarybar > .title > .title-label {
diff --git a/src/vs/workbench/browser/parts/editor/editorTabsControl.ts b/src/vs/workbench/browser/parts/editor/editorTabsControl.ts
-index b0a44e2..e711a80 100644
+index 2ba6b32b..6eb3ee83 100644
--- a/src/vs/workbench/browser/parts/editor/editorTabsControl.ts
+++ b/src/vs/workbench/browser/parts/editor/editorTabsControl.ts
@@ -48,2 +48,4 @@ import { MarkdownString } from '../../../../base/common/htmlContent.js';
@@ -1396,11 +1655,11 @@ index b0a44e2..e711a80 100644
+ };
+ }
-@@ -142,2 +146,3 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
+@@ -148,2 +152,3 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
@IHostService private readonly hostService: IHostService,
+ @IConfigurationService protected readonly configurationService: IConfigurationService,
) {
-@@ -149,2 +154,13 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
+@@ -155,2 +160,13 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
+ this._register(configurationService.onDidChangeConfiguration(e => {
+ if (e.affectsConfiguration('workbench.tabs.experimental.fontFamily')) {
@@ -1414,12 +1673,12 @@ index b0a44e2..e711a80 100644
+ }));
+
// Context Keys
-@@ -170,2 +186,4 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
+@@ -176,2 +192,4 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
protected create(parent: HTMLElement): HTMLElement {
+ this.applyTabsFontSize(parent);
+ this.applyTabsFontFamily(parent);
this.updateTabHeight();
-@@ -174,2 +192,30 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
+@@ -180,2 +198,30 @@ export abstract class EditorTabsControl extends Themable implements IEditorTabsC
+ private applyTabsFontFamily(container?: HTMLElement): void {
+ const target = container ?? this.parent;
@@ -1451,7 +1710,7 @@ index b0a44e2..e711a80 100644
+
private get editorActionsEnabled(): boolean {
diff --git a/src/vs/workbench/browser/parts/editor/media/editortabscontrol.css b/src/vs/workbench/browser/parts/editor/media/editortabscontrol.css
-index 57ab8ca..72a328f 100644
+index 57ab8ca5..72a328fc 100644
--- a/src/vs/workbench/browser/parts/editor/media/editortabscontrol.css
+++ b/src/vs/workbench/browser/parts/editor/media/editortabscontrol.css
@@ -9,2 +9,3 @@
@@ -1498,7 +1757,7 @@ index 57ab8ca..72a328f 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/editor/media/editortitlecontrol.css b/src/vs/workbench/browser/parts/editor/media/editortitlecontrol.css
-index a24f761..6b15b9c 100644
+index a24f7613..6b15b9c2 100644
--- a/src/vs/workbench/browser/parts/editor/media/editortitlecontrol.css
+++ b/src/vs/workbench/browser/parts/editor/media/editortitlecontrol.css
@@ -47 +47,28 @@
@@ -1532,7 +1791,7 @@ index a24f761..6b15b9c 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css b/src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css
-index 4f9477d..b47fd85 100644
+index d57abaaf..4928dac9 100644
--- a/src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css
+++ b/src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css
@@ -176,4 +176,4 @@
@@ -1547,7 +1806,7 @@ index 4f9477d..b47fd85 100644
- min-width: calc(var(--tab-sizing-current-width, var(--tab-sizing-fixed-min-width, 50px)) - 1px);
+ min-width: 50px - 1px;
}
-@@ -568 +568,113 @@
+@@ -576 +576,113 @@
}
+
+
@@ -1609,14 +1868,14 @@ index 4f9477d..b47fd85 100644
+.monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.dirty-border-top:not(:focus) > .tab-border-top-container {
+ height: calc(var(--vscode-workbench-tabs-font-size) * 0.153846)
+}
-+.monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-shrink > .tab-label > .monaco-icon-label-container::after, .monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-fixed > .tab-label > .monaco-icon-label-container::after {
++.monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-shrink > .tab-label > .monaco-icon-label-container::after, .monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-fixed > .tab-label > .monaco-icon-label-container::after {
+ width: calc(var(--vscode-workbench-tabs-font-size) * 0.384615);
+ padding: 0;
+ top: 1px;
+ bottom: 1px;
+ height: calc(100% - calc(var(--vscode-workbench-tabs-font-size) * 0.153846))
+}
-+.monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-shrink > .tab-label.tab-label-has-badge::after, .monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-fixed > .tab-label.tab-label-has-badge::after {
++.monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-shrink > .tab-label.tab-label-has-badge::after, .monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-fixed > .tab-label.tab-label-has-badge::after {
+ margin-right: calc(var(--vscode-workbench-tabs-font-size) * 0.384615)
+}
+.monaco-workbench .part.editor > .content .editor-group-container > .title.tabs .tabs-container > .tab.sizing-shrink:not(.tab-actions-left):not(.close-action-off) .tab-label {
@@ -1663,7 +1922,7 @@ index 4f9477d..b47fd85 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts
-index b0befd9..7c25771 100644
+index 1fe80afb..d792a8c5 100644
--- a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts
+++ b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts
@@ -6,2 +6,3 @@
@@ -1697,7 +1956,7 @@ index b0befd9..7c25771 100644
+ super(parent, editorPartsView, groupsView, groupView, tabsModel, contextMenuService, instantiationService, contextKeyService, keybindingService, notificationService, quickInputService, themeService, editorResolverService, hostService, configurationService);
diff --git a/src/vs/workbench/browser/parts/media/paneCompositePart.css b/src/vs/workbench/browser/parts/media/paneCompositePart.css
-index fe0f2ad..195267c 100644
+index fe0f2adf..195267cf 100644
--- a/src/vs/workbench/browser/parts/media/paneCompositePart.css
+++ b/src/vs/workbench/browser/parts/media/paneCompositePart.css
@@ -369 +369,119 @@
@@ -1822,7 +2081,7 @@ index fe0f2ad..195267c 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css
-index e1c147d..63d0e10 100644
+index e1c147d8..63d0e109 100644
--- a/src/vs/workbench/browser/parts/panel/media/panelpart.css
+++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css
@@ -10,2 +10,7 @@
@@ -1887,7 +2146,7 @@ index e1c147d..63d0e10 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts
-index 9afcf59..a8d4c2e 100644
+index 10376ab9..fba2f37f 100644
--- a/src/vs/workbench/browser/parts/panel/panelPart.ts
+++ b/src/vs/workbench/browser/parts/panel/panelPart.ts
@@ -34,2 +34,3 @@ import { IConfigurationService } from '../../../../platform/configuration/common
@@ -1942,7 +2201,7 @@ index 9afcf59..a8d4c2e 100644
+ this._onDidChange.fire(undefined); // Signal grid that size constraints changed
}
diff --git a/src/vs/workbench/browser/parts/sidebar/media/sidebarpart.css b/src/vs/workbench/browser/parts/sidebar/media/sidebarpart.css
-index decb51a..d0db436 100644
+index decb51ab..d0db4363 100644
--- a/src/vs/workbench/browser/parts/sidebar/media/sidebarpart.css
+++ b/src/vs/workbench/browser/parts/sidebar/media/sidebarpart.css
@@ -15,3 +15,3 @@
@@ -1999,7 +2258,7 @@ index decb51a..d0db436 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts
-index 101b9c6..970cdaa 100644
+index eecc3b8d..de93d458 100644
--- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts
+++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts
@@ -36,2 +36,3 @@ import { VisibleViewContainersTracker } from '../visibleViewContainersTracker.js
@@ -2061,7 +2320,7 @@ index 101b9c6..970cdaa 100644
+
private registerActions(): void {
diff --git a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css
-index 1f3b102..42ad22c 100644
+index 1f3b102e..42ad22c0 100644
--- a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css
+++ b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css
@@ -11,2 +11,3 @@
@@ -2141,31 +2400,19 @@ index 1f3b102..42ad22c 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts
-index 18340a8..0a33ce0 100644
+index 05bec26f..dcc8cf4a 100644
--- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts
+++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts
-@@ -38,2 +38,4 @@ import { IView } from '../../../../base/browser/ui/grid/grid.js';
+@@ -39,2 +39,3 @@ import { IView } from '../../../../base/browser/ui/grid/grid.js';
import { isManagedHoverTooltipHTMLElement, isManagedHoverTooltipMarkdownString } from '../../../../base/browser/ui/hover/hover.js';
-+import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
+import { FONT, getFontSize, updateStatusBarSize } from '../../../../base/common/font.js';
-@@ -120,3 +122,3 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
+@@ -121,3 +122,3 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
- static readonly HEIGHT = 22;
+ static get HEIGHT() { return FONT.statusBarSize22; }
-@@ -126,4 +128,4 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
- readonly maximumWidth: number = Number.POSITIVE_INFINITY;
-- readonly minimumHeight: number = StatusbarPart.HEIGHT;
-- readonly maximumHeight: number = StatusbarPart.HEIGHT;
-+ get minimumHeight(): number { return FONT.statusBarSize22; }
-+ get maximumHeight(): number { return FONT.statusBarSize22; }
-
-@@ -162,2 +164,3 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
- @IContextKeyService private readonly contextKeyService: IContextKeyService,
-+ @IConfigurationService private readonly configurationService: IConfigurationService,
- ) {
-@@ -165,2 +168,11 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
+@@ -178,2 +179,11 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
+ this._register(configurationService.onDidChangeConfiguration(e => {
+ if (e.affectsConfiguration('workbench.statusBar.experimental.fontFamily')) {
@@ -2177,13 +2424,13 @@ index 18340a8..0a33ce0 100644
+ }));
+
this.viewModel = this._register(new StatusbarViewModel(storageService));
-@@ -429,2 +441,5 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
+@@ -451,2 +461,5 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
+ this.applyStatusBarFontFamily(this.element);
+ this.applyStatusBarFontSize(this.element);
+
return this.element;
-@@ -432,2 +447,32 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
+@@ -454,2 +467,32 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer {
+ private applyStatusBarFontFamily(container?: HTMLElement): void {
+ const target = container ?? this.getContainer();
@@ -2216,28 +2463,13 @@ index 18340a8..0a33ce0 100644
+ }
+
private createInitialStatusbarEntries(): void {
-@@ -726,4 +771,5 @@ export class MainStatusbarPart extends StatusbarPart {
- @IContextKeyService contextKeyService: IContextKeyService,
-+ @IConfigurationService configurationService: IConfigurationService,
- ) {
-- super(Parts.STATUSBAR_PART, instantiationService, themeService, contextService, storageService, layoutService, contextMenuService, contextKeyService);
-+ super(Parts.STATUSBAR_PART, instantiationService, themeService, contextService, storageService, layoutService, contextMenuService, contextKeyService, configurationService);
- }
-@@ -740,3 +786,3 @@ export class AuxiliaryStatusbarPart extends StatusbarPart implements IAuxiliaryS
+@@ -763,3 +806,3 @@ export class AuxiliaryStatusbarPart extends StatusbarPart implements IAuxiliaryS
- readonly height = StatusbarPart.HEIGHT;
+ get height() { return StatusbarPart.HEIGHT; }
-@@ -751,5 +797,6 @@ export class AuxiliaryStatusbarPart extends StatusbarPart implements IAuxiliaryS
- @IContextKeyService contextKeyService: IContextKeyService,
-+ @IConfigurationService configurationService: IConfigurationService,
- ) {
- const id = AuxiliaryStatusbarPart.COUNTER++;
-- super(`workbench.parts.auxiliaryStatus.${id}`, instantiationService, themeService, contextService, storageService, layoutService, contextMenuService, contextKeyService);
-+ super(`workbench.parts.auxiliaryStatus.${id}`, instantiationService, themeService, contextService, storageService, layoutService, contextMenuService, contextKeyService, configurationService);
- }
diff --git a/src/vs/workbench/browser/parts/views/media/paneviewlet.css b/src/vs/workbench/browser/parts/views/media/paneviewlet.css
-index aca98de..5bf9bf7 100644
+index aca98deb..5bf9bf71 100644
--- a/src/vs/workbench/browser/parts/views/media/paneviewlet.css
+++ b/src/vs/workbench/browser/parts/views/media/paneviewlet.css
@@ -87 +87,30 @@
@@ -2273,27 +2505,27 @@ index aca98de..5bf9bf7 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts
-index 1c9305b..6471a0d 100644
+index c2ae0b4a..ff138204 100644
--- a/src/vs/workbench/browser/parts/views/treeView.ts
+++ b/src/vs/workbench/browser/parts/views/treeView.ts
@@ -79,2 +79,3 @@ import { IAccessibleViewInformationService } from '../../../services/accessibili
import { Command } from '../../../../editor/common/languages.js';
+import { FONT } from '../../../../base/common/font.js';
-@@ -1166,3 +1167,3 @@ class TreeViewDelegate implements IListVirtualDelegate {
+@@ -1169,3 +1170,3 @@ class TreeViewDelegate implements IListVirtualDelegate {
getHeight(element: ITreeItem): number {
- return TreeRenderer.ITEM_HEIGHT;
+ return FONT.sidebarSize22;
}
-@@ -1242,3 +1243,2 @@ interface ITreeExplorerTemplateData {
+@@ -1245,3 +1246,2 @@ interface ITreeExplorerTemplateData {
class TreeRenderer extends Disposable implements ITreeRenderer {
- static readonly ITEM_HEIGHT = 22;
static readonly TREE_TEMPLATE_ID = 'treeExplorer';
diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts
-index 058693c..ee81a59 100644
+index f2a3b35e..9eb97639 100644
--- a/src/vs/workbench/browser/workbench.contribution.ts
+++ b/src/vs/workbench/browser/workbench.contribution.ts
-@@ -702,2 +702,85 @@ const registry = Registry.as(ConfigurationExtensions.Con
+@@ -716,2 +716,85 @@ const registry = Registry.as(ConfigurationExtensions.Con
},
+ 'workbench.experimental.fontFamily': {
+ type: 'string',
@@ -2380,12 +2612,12 @@ index 058693c..ee81a59 100644
+ },
'workbench.settings.editor': {
diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts
-index 10e2c3e..74e3bbe 100644
+index 10e2c3ed..47f28faa 100644
--- a/src/vs/workbench/browser/workbench.ts
+++ b/src/vs/workbench/browser/workbench.ts
@@ -9,2 +9,3 @@ import { Event, Emitter, setGlobalLeakWarningThreshold } from '../../base/common
import { RunOnceScheduler, timeout } from '../../base/common/async.js';
-+import { FONT, getFontSize, updateDefaultSize } from '../../base/common/font.js';
++import { getFontSize, updateDefaultSize } from '../../base/common/font.js';
import { isFirefox, isSafari, isChrome } from '../../base/browser/browser.js';
@@ -19,3 +20,3 @@ import { Position, Parts, IWorkbenchLayoutService, positionToString } from '../s
import { IStorageService, WillSaveStateReason, StorageScope, StorageTarget } from '../../platform/storage/common/storage.js';
@@ -2419,7 +2651,7 @@ index 10e2c3e..74e3bbe 100644
- }
-
const aliasing = configurationService.getValue<'default' | 'antialiased' | 'none' | 'auto'>('workbench.fontAliasing');
-@@ -296,2 +303,31 @@ export class Workbench extends Layout {
+@@ -296,2 +303,33 @@ export class Workbench extends Layout {
+ private fontFamily: string | undefined;
+ private updateFontFamily(configurationService: IConfigurationService) {
@@ -2438,20 +2670,22 @@ index 10e2c3e..74e3bbe 100644
+ }
+ }
+
++ private fontSize: number | undefined;
+ private updateFontSize(configurationService: IConfigurationService) {
+ const configuredSize = getFontSize(configurationService, 'workbench.experimental.fontSize', 13);
+
-+ if (FONT.defaultSize === configuredSize) {
++ if (this.fontSize === configuredSize) {
+ return;
+ }
+
+ updateDefaultSize(configuredSize);
+
-+ this.mainContainer.style.setProperty('--vscode-workbench-font-size', `${FONT.defaultSize}px`);
++ this.fontSize = configuredSize;
++ this.mainContainer.style.setProperty('--vscode-workbench-font-size', `${configuredSize}px`);
+ }
+
private restoreFontInfo(storageService: IStorageService, configurationService: IConfigurationService): void {
-@@ -339,3 +375,6 @@ export class Workbench extends Layout {
+@@ -339,3 +377,6 @@ export class Workbench extends Layout {
// Apply font aliasing
- this.updateFontAliasing(undefined, configurationService);
+ this.updateFontAliasing(configurationService);
@@ -2460,7 +2694,7 @@ index 10e2c3e..74e3bbe 100644
+ this.updateFontSize(configurationService);
diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts
-index 6f58865..3ab0ee4 100644
+index 6f588651..3ab0ee4e 100644
--- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts
+++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts
@@ -17,2 +17,3 @@ import { localize } from '../../../../nls.js';
@@ -2473,69 +2707,57 @@ index 6f58865..3ab0ee4 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts
-index bcb46c6..0aef82b 100644
+index d20ac963..d266aa13 100644
--- a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts
+++ b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts
-@@ -52,2 +52,3 @@ import { BugIndicatingError } from '../../../../../base/common/errors.js';
- import { ILogService } from '../../../../../platform/log/common/log.js';
+@@ -57,2 +57,3 @@ import { createPixelSpinner } from '../../../../../base/browser/ui/pixelSpinner/
+ import { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';
+import { FONT } from '../../../../../base/common/font.js';
-@@ -638,5 +639,2 @@ export class AgentSessionsListDelegate implements IListVirtualDelegate {
- getHeight(element: SectionItem) {
-- return 22;
-+ return FONT.sidebarSize22;
- }
diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.ts b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.ts
-index cc7bb15..f260d0e 100644
+index f93bfe8f..049182f8 100644
--- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.ts
+++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.ts
-@@ -33,2 +33,3 @@ import { ResourcePool } from './chatCollections.js';
+@@ -36,2 +36,3 @@ import { ResourcePool } from './chatCollections.js';
import { IChatContentPart, IChatContentPartRenderContext } from './chatContentParts.js';
+import { FONT } from '../../../../../../base/common/font.js';
-@@ -244,3 +245,3 @@ class CollapsibleChangesSummaryListDelegate implements IListVirtualDelegate {
+@@ -24,3 +25,3 @@ class TodoListDelegate implements IListVirtualDelegate {
getHeight(element: IChatTodo): number {
- return 22;
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.ts b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.ts
-index 703940e..e0fa9eb 100644
+index 703940ed..e0fa9eb5 100644
--- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.ts
+++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.ts
@@ -12,2 +12,3 @@ import { IAsyncDataSource, ITreeNode } from '../../../../../../base/browser/ui/t
@@ -2577,10 +2799,10 @@ index 703940e..e0fa9eb 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/media/chatViewPane.css b/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/media/chatViewPane.css
-index 83799c1..b2d3db2 100644
+index c1415f8d..aed644f4 100644
--- a/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/media/chatViewPane.css
+++ b/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/media/chatViewPane.css
-@@ -169 +169,68 @@
+@@ -188 +188,68 @@
}
+
+
@@ -2651,7 +2873,7 @@ index 83799c1..b2d3db2 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts b/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts
-index c6298b3..8fcab5f 100644
+index c6298b30..8fcab5f3 100644
--- a/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts
+++ b/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts
@@ -15,2 +15,3 @@ import { safeIntl } from '../../../../../base/common/date.js';
@@ -2664,14 +2886,14 @@ index c6298b3..8fcab5f 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts
-index cacba31..7785734 100644
+index 4bd774ce..86c88c83 100644
--- a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts
+++ b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts
@@ -40,2 +40,3 @@ import { SelectionClipboardContributionID } from '../selectionClipboard.js';
import { getSimpleEditorOptions, setupSimpleEditorSelectionStyling } from '../simpleEditorOptions.js';
+import { FONT } from '../../../../../base/common/font.js';
-@@ -468,4 +469,4 @@ function getSuggestEnabledInputOptions(ariaLabel?: string): IEditorOptions {
+@@ -481,4 +482,4 @@ function getSuggestEnabledInputOptions(ariaLabel?: string): IEditorOptions {
return {
- fontSize: 13,
- lineHeight: 20,
@@ -2679,14 +2901,14 @@ index cacba31..7785734 100644
+ lineHeight: FONT.sidebarSize20,
wordWrap: 'off',
diff --git a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts
-index b5234b6..b36e465 100644
+index 5162553b..5adbed8f 100644
--- a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts
+++ b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts
@@ -43,2 +43,3 @@ import { MarshalledCommentThread, MarshalledCommentThreadInternal } from '../../
import { IHoverService } from '../../../../platform/hover/browser/hover.js';
+import { FONT } from '../../../../base/common/font.js';
-@@ -83,5 +84,5 @@ class CommentsModelVirtualDelegate implements IListVirtualDelegate
+@@ -593,3 +594,3 @@ class BreakpointsDelegate implements IListVirtualDelegate
getHeight(_element: BreakpointTreeElement): number {
- return 22;
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts
-index 35c9c1e..f8bf9c5 100644
+index 35c9c1e5..f8bf9c5b 100644
--- a/src/vs/workbench/contrib/debug/browser/callStackView.ts
+++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts
@@ -22,2 +22,3 @@ import { Event } from '../../../../base/common/event.js';
@@ -2729,7 +2951,7 @@ index 35c9c1e..f8bf9c5 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/debug/browser/callStackWidget.ts b/src/vs/workbench/contrib/debug/browser/callStackWidget.ts
-index 42e4cbe..bfaf21e 100644
+index 42e4cbeb..bfaf21e4 100644
--- a/src/vs/workbench/contrib/debug/browser/callStackWidget.ts
+++ b/src/vs/workbench/contrib/debug/browser/callStackWidget.ts
@@ -13,2 +13,3 @@ import { Codicon } from '../../../../base/common/codicons.js';
@@ -2757,7 +2979,7 @@ index 42e4cbe..bfaf21e 100644
-
interface IAbstractFrameRendererTemplateData {
diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts
-index fe8ae2b..5830976 100644
+index fe8ae2b6..5830976e 100644
--- a/src/vs/workbench/contrib/debug/browser/debugHover.ts
+++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts
@@ -15,2 +15,3 @@ import { coalesce } from '../../../../base/common/arrays.js';
@@ -2770,7 +2992,7 @@ index fe8ae2b..5830976 100644
+ return FONT.sidebarSize18;
}
diff --git a/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts
-index 531c114..909a66d 100644
+index 531c1146..909a66db 100644
--- a/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts
+++ b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts
@@ -14,2 +14,3 @@ import { Codicon } from '../../../../base/common/codicons.js';
@@ -2783,7 +3005,7 @@ index 531c114..909a66d 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css b/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css
-index ca34e6f..611b495 100644
+index ca34e6f7..611b4950 100644
--- a/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css
+++ b/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css
@@ -55 +55,25 @@
@@ -2814,10 +3036,10 @@ index ca34e6f..611b495 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css
-index 4a627af..86f37c5 100644
+index a7eb2f1a..b220e4e7 100644
--- a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css
+++ b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css
-@@ -371 +371,103 @@
+@@ -412 +412,103 @@
}
+
+/*** Handcrafted for Custom Font Size ***/
@@ -2923,7 +3145,7 @@ index 4a627af..86f37c5 100644
+}
\ No newline at end of file
diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts
-index f18d41b..8863b19 100644
+index f18d41bf..8863b19d 100644
--- a/src/vs/workbench/contrib/debug/browser/variablesView.ts
+++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts
@@ -18,2 +18,3 @@ import { Codicon } from '../../../../base/common/codicons.js';
@@ -2936,7 +3158,7 @@ index f18d41b..8863b19 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts
-index f290f70..3269808 100644
+index 9fef1481..80631b5d 100644
--- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts
+++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts
@@ -42,2 +42,3 @@ import { watchExpressionsAdd, watchExpressionsRemoveAll } from './debugIcons.js'
@@ -2949,7 +3171,7 @@ index f290f70..3269808 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts b/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts
-index 3cd48a5..3238df4 100644
+index 3cd48a5b..3238df42 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts
@@ -40,2 +40,3 @@ import { IHoverService } from '../../../../platform/hover/browser/hover.js';
@@ -2962,7 +3184,7 @@ index 3cd48a5..3238df4 100644
+ getHeight() { return FONT.sidebarSize22; }
getTemplateId() { return 'extensionFeatureDescriptor'; }
diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts
-index 42134f0..4e14bd1 100644
+index 42134f0b..4e14bd16 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts
@@ -27,4 +27,3 @@ import { IActionViewItemOptions } from '../../../../base/browser/ui/actionbar/ac
@@ -2977,7 +3199,7 @@ index 42134f0..4e14bd1 100644
+ getHeight() { return FONT.sidebarSize72; }
getTemplateId() { return 'extension'; }
diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts
-index 418cb12..fbb30c5 100644
+index 418cb12e..fbb30c5c 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts
@@ -40,2 +40,3 @@ import { ILogService } from '../../../../platform/log/common/log.js';
@@ -2990,14 +3212,14 @@ index 418cb12..fbb30c5 100644
+ return FONT.sidebarSize62;
}
diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts
-index 8bfac42..6430bf4 100644
+index ced3d32a..4d8b7fa2 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts
-@@ -69,2 +69,3 @@ import { URI } from '../../../../base/common/uri.js';
+@@ -72,2 +72,3 @@ import { URI } from '../../../../base/common/uri.js';
import { DEFAULT_ACCOUNT_SIGN_IN_COMMAND } from '../../../services/accounts/browser/defaultAccount.js';
+import { FONT } from '../../../../base/common/font.js';
-@@ -735,5 +736,5 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer {
+@@ -80,6 +81,8 @@ export class SearchDelegate implements IListVirtualDelegate {
- public static ITEM_HEIGHT = 22;
+ static getHeight(): number {
@@ -3802,23 +4024,23 @@ index 62d5db9..f86dba1 100644
+ return FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts
-index fb52bbb..09ca311 100644
+index 2c60e2cb..d3c7426c 100644
--- a/src/vs/workbench/contrib/search/browser/searchView.ts
+++ b/src/vs/workbench/contrib/search/browser/searchView.ts
-@@ -87,2 +87,3 @@ import { ITelemetryService } from '../../../../platform/telemetry/common/telemet
+@@ -88,2 +88,3 @@ import { ITelemetryService } from '../../../../platform/telemetry/common/telemet
import { forcedExpandRecursively } from './searchActionsTopBar.js';
+import { FONT } from '../../../../base/common/font.js';
-@@ -126,2 +127,3 @@ const SEARCH_CANCELLED_MESSAGE = nls.localize('searchCanceled', "Search was canc
+@@ -127,2 +128,3 @@ const SEARCH_CANCELLED_MESSAGE = nls.localize('searchCanceled', "Search was canc
const DEBOUNCE_DELAY = 75;
+
export class SearchView extends ViewPane {
-@@ -963,3 +965,3 @@ export class SearchView extends ViewPane {
+@@ -996,3 +998,3 @@ export class SearchView extends ViewPane {
overrideStyles: this.getLocationBasedColors().listOverrideStyles,
- paddingBottom: SearchDelegate.ITEM_HEIGHT,
+ paddingBottom: SearchDelegate.getHeight(),
collapseByDefault: (e: RenderableMatch) => {
-@@ -1341,6 +1343,6 @@ export class SearchView extends ViewPane {
+@@ -1374,6 +1376,6 @@ export class SearchView extends ViewPane {
- this.searchWidget.setWidth(this.size.width - 28 /* container margin */);
+ this.searchWidget.setWidth(this.size.width - FONT.sidebarSize28);
@@ -3828,13 +4050,13 @@ index fb52bbb..09ca311 100644
+ this.inputPatternExcludes.setWidth(this.size.width - FONT.sidebarSize28);
+ this.inputPatternIncludes.setWidth(this.size.width - FONT.sidebarSize28);
-@@ -1348,3 +1350,3 @@ export class SearchView extends ViewPane {
+@@ -1381,3 +1383,3 @@ export class SearchView extends ViewPane {
const messagesHeight = dom.getTotalHeight(this.messagesElement);
- this.tree.layout(this.size.height - widgetHeight - messagesHeight, this.size.width - 28);
+ this.tree.layout(this.size.height - widgetHeight - messagesHeight, this.size.width - FONT.sidebarSize28);
}
diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts
-index e9c0fcd..f3e23de 100644
+index e9c0fcd4..f3e23de0 100644
--- a/src/vs/workbench/contrib/search/browser/searchWidget.ts
+++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts
@@ -47,5 +47,3 @@ import { IDisposable, MutableDisposable } from '../../../../base/common/lifecycl
@@ -3864,7 +4086,7 @@ index e9c0fcd..f3e23de 100644
+ this.replaceInput.width = width - FONT.sidebarSize28;
this.replaceInput.inputBox.layout();
diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts
-index 21118dd..b5e53a1 100644
+index 013ee562..8c0ac05a 100644
--- a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts
+++ b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts
@@ -58,2 +58,3 @@ import { TerminalStorageKeys } from '../common/terminalStorageKeys.js';
@@ -3880,31 +4102,31 @@ index 21118dd..b5e53a1 100644
- getHeight: () => TerminalTabsListSizes.TabHeight,
+ getHeight: () => FONT.bottomPaneSize22,
getTemplateId: () => 'terminal.tabs'
-@@ -113,3 +113,3 @@ export class TerminalTabList extends WorkbenchList {
+@@ -116,3 +116,3 @@ export class TerminalTabList extends WorkbenchList {
multipleSelectionSupport: true,
- paddingBottom: TerminalTabsListSizes.TabHeight,
+ paddingBottom: FONT.bottomPaneSize22,
dnd: instantiationService.createInstance(TerminalTabsDragAndDrop),
-@@ -458,3 +458,3 @@ class TerminalTabsRenderer implements IListRenderer {
+@@ -1431,3 +1432,3 @@ class ListDelegate implements IListVirtualDelegate {
getHeight(element: TestExplorerTreeElement) {
- return element instanceof TestTreeErrorMessage ? 17 + 10 : 22;
+ return element instanceof TestTreeErrorMessage ? FONT.sidebarSize17 + 10 : FONT.sidebarSize22;
}
diff --git a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts
-index c7c9cc7..84510c2 100644
+index 7219c099..7c6bc96c 100644
--- a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts
+++ b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts
@@ -59,4 +59,3 @@ import { IHoverService, WorkbenchHoverDelegate } from '../../../../platform/hove
@@ -3948,13 +4170,13 @@ index c7c9cc7..84510c2 100644
- pageSize = Math.max(20, Math.floor((this.tree?.renderHeight ?? 0 / ItemHeight) + (this.pageOnScroll ? 1 : -1)));
+ pageSize = Math.max(20, Math.floor((this.tree?.renderHeight ?? 0 / FONT.sidebarSize22) + (this.pageOnScroll ? 1 : -1)));
}
-@@ -1147,3 +1146,3 @@ export class TimelineListVirtualDelegate implements IListVirtualDelegate { cts.cancel(); return undefined; });
+- isLatest = await Promise.race([this.isLatestVersion(pendingUpdateCommit, cts.token), timeoutPromise]);
++ isLatest = await Promise.race([this.isLatestVersion(pendingUpdateVersion, cts.token), timeoutPromise]);
+ cts.dispose();
+@@ -405,3 +402,3 @@ export abstract class AbstractUpdateService implements IUpdateService {
+ this.setState(State.Overwriting(this._state.update, explicit));
+- this.doCheckForUpdates(explicit, pendingUpdateCommit);
++ this.doCheckForUpdates(explicit, pendingUpdateVersion);
+ return true;
+@@ -412,3 +409,3 @@ export abstract class AbstractUpdateService implements IUpdateService {
+
+- async isLatestVersion(commit?: string, token: CancellationToken = CancellationToken.None): Promise {
++ async isLatestVersion(pendingVersion?: string, token: CancellationToken = CancellationToken.None): Promise {
+ if (!this.quality) {
+@@ -419,3 +416,3 @@ export abstract class AbstractUpdateService implements IUpdateService {
+
+- if (mode === 'none') {
++ if (mode === 'none' || mode === 'manual') {
+ return undefined;
+@@ -423,3 +420,3 @@ export abstract class AbstractUpdateService implements IUpdateService {
+
+- const url = this.buildUpdateFeedUrl(this.quality, commit ?? this.productService.commit!, { internalOrg: this.getInternalOrg() });
++ const url = this.buildUpdateFeedUrl(this.quality, { internalOrg: this.getInternalOrg() });
+
+@@ -429,18 +426,47 @@ export abstract class AbstractUpdateService implements IUpdateService {
+
++ return this._isLatestVersion(url, false, pendingVersion, token)
++ .then((result) => {
++ return Promise.resolve(result ? result.lastest : result);
++ })
++ .then(undefined, (error) => {
++ this.logService.error('update#isLatestVersion(): failed to check for updates');
++ this.logService.error(error);
++
++ return Promise.resolve(undefined);
++ });
++ }
++
++ _isLatestVersion(url: string, explicit: boolean, pendingVersion?: string, token: CancellationToken = CancellationToken.None): Promise<{lastest: boolean, update: IUpdate} | undefined> {
+ const headers = getUpdateRequestHeaders(this.productService.version);
+- this.logService.trace('update#isLatestVersion() - checking update server', { url, headers });
+
+- try {
+- const context = await this.requestService.request({ url, headers, callSite: 'updateService.isLatestVersion' }, token);
+- const statusCode = context.res.statusCode;
+- this.logService.trace('update#isLatestVersion() - response', { statusCode });
+- // The update server replies with 204 (No Content) when no
+- // update is available - that's all we want to know.
+- return statusCode === 204;
++ this.logService.info('update#isLatestVersion() - checking update server', { url, headers });
+
+- } catch (error) {
+- this.logService.error('update#isLatestVersion(): failed to check for updates');
+- this.logService.error(error);
+- return undefined;
+- }
++ return this.requestService.request({ url, headers, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None)
++ .then(asJson)
++ .then(update => {
++ if (!update || !update.url || !update.version || !update.productVersion || token.isCancellationRequested) {
++ this.setState(State.Idle(UpdateType.Setup, undefined, explicit || undefined));
++
++ return Promise.resolve(undefined);
++ }
++
++ const fetchedVersion = normalizeVersion(update.productVersion);
++
++ let currentVersion: string;
++
++ if(pendingVersion) {
++ currentVersion = normalizeVersion(pendingVersion);
++
++ this.logService.info(`update#isLatestVersion() - found: ${fetchedVersion}, pending: ${currentVersion}`);
++ }
++ else {
++ currentVersion = normalizeVersion(this.productService.version);
++
++ this.logService.info(`update#isLatestVersion() - found: ${fetchedVersion}, current: ${currentVersion}`);
++ }
++
++ const lastest = semver.compareBuild(currentVersion, fetchedVersion) >= 0;
++
++ return Promise.resolve({ lastest, update });
++ })
+ }
+@@ -480,4 +506,12 @@ export abstract class AbstractUpdateService implements IUpdateService {
+
+- protected abstract buildUpdateFeedUrl(quality: string, commit: string, options?: IUpdateURLOptions): string | undefined;
+- protected abstract doCheckForUpdates(explicit: boolean, pendingCommit?: string): void;
++ protected abstract buildUpdateFeedUrl(quality: string, options?: IUpdateURLOptions): string | undefined;
++ protected abstract doCheckForUpdates(explicit: boolean, pendingVersion?: string): void;
++}
++
++function normalizeVersion(version: string): string {
++ const normalizedVersion = version
++ .replace(/(\d+\.\d+\.\d+)\.\d+(\-\w+)?/, '$1$2')
++ .replace(/(\d+\.\d+\.)0+(\d+)(\-\w+)?/, '$1$2$3');
++
++ return normalizedVersion;
+ }
+diff --git a/src/vs/platform/update/electron-main/updateService.darwin.ts b/src/vs/platform/update/electron-main/updateService.darwin.ts
+index e92c54e2..b8057a06 100644
+--- a/src/vs/platform/update/electron-main/updateService.darwin.ts
++++ b/src/vs/platform/update/electron-main/updateService.darwin.ts
+@@ -16,3 +16,3 @@ import { ILogService } from '../../log/common/log.js';
+ import { IProductService } from '../../product/common/productService.js';
+-import { asJson, IRequestService } from '../../request/common/request.js';
++import { asJson, IRequestService, NO_FETCH_TELEMETRY } from '../../request/common/request.js';
+ import { IApplicationStorageMainService } from '../../storage/electron-main/storageMainService.js';
+@@ -93,18 +93,7 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
+
+- protected buildUpdateFeedUrl(quality: string, commit: string, options?: IUpdateURLOptions): string | undefined {
+- const assetID = this.productService.darwinUniversalAssetId ?? (process.arch === 'x64' ? 'darwin' : 'darwin-arm64');
+- const url = createUpdateURL(this.productService.updateUrl!, assetID, quality, commit, options);
+- const headers = getUpdateRequestHeaders(this.productService.version);
+- try {
+- this.logService.trace('update#buildUpdateFeedUrl - setting feed URL for Electron autoUpdater', { url, assetID, quality, commit, headers });
+- electron.autoUpdater.setFeedURL({ url, headers });
+- } catch (e) {
+- // application is very likely not signed
+- this.logService.error('Failed to set update feed URL', e);
+- return undefined;
+- }
+- return url;
++ protected buildUpdateFeedUrl(quality: string, _options?: IUpdateURLOptions): string | undefined {
++ return createUpdateURL(this.productService, quality, process.platform, process.arch);
+ }
+
+- protected doCheckForUpdates(explicit: boolean, pendingCommit?: string): void {
++ protected doCheckForUpdates(explicit: boolean, pendingVersion?: string): void {
+ if (!this.quality) {
+@@ -117,3 +106,3 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
+ const background = !explicit && !internalOrg;
+- const url = this.buildUpdateFeedUrl(this.quality, pendingCommit ?? this.productService.commit!, { background, internalOrg });
++ const url = this.buildUpdateFeedUrl(this.quality, { background, internalOrg });
+
+@@ -131,4 +120,32 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
+
+- this.logService.trace('update#doCheckForUpdates - using Electron autoUpdater', { url, explicit, background });
+- electron.autoUpdater.checkForUpdates();
++ this.logService.info('update#doCheckForUpdates', { url, explicit, background });
++
++ this._isLatestVersion(url, explicit, pendingVersion)
++ .then((result) => {
++ if(!result) {
++ this.setState(State.Idle(UpdateType.Archive));
++
++ return Promise.resolve(null);
++ }
++
++ if(result.lastest) {
++ this.setState(State.Idle(UpdateType.Setup, undefined, explicit || undefined));
++ }
++ else {
++ this.logService.info('update#doCheckForUpdates - using Electron autoUpdater');
++
++ electron.autoUpdater.setFeedURL({ url });
++ electron.autoUpdater.checkForUpdates();
++ }
++
++ return Promise.resolve(null);
++ })
++ .then(undefined, (error) => {
++ this.logService.error(error);
++
++ // only show message when explicitly checking for updates
++ const message: string | undefined = explicit ? (error.message || error) : undefined;
++
++ this.setState(State.Idle(UpdateType.Archive, message));
++ });
+ }
+@@ -145,3 +162,3 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
+ try {
+- const context = await this.requestService.request({ url, headers, callSite: 'updateService.darwin.checkForUpdates' }, CancellationToken.None);
++ const context = await this.requestService.request({ url, headers, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None);
+ const statusCode = context.res.statusCode;
+@@ -198,3 +215,3 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
+ // Rebuild feed URL and trigger download via Electron's auto-updater
+- this.buildUpdateFeedUrl(this.quality!, state.update.version, { internalOrg: this.getInternalOrg() });
++ this.buildUpdateFeedUrl(this.quality!, { internalOrg: this.getInternalOrg() });
+ this.setState(State.CheckingForUpdates(true));
+diff --git a/src/vs/platform/update/electron-main/updateService.linux.ts b/src/vs/platform/update/electron-main/updateService.linux.ts
+index 2be53f61..36a747ab 100644
+--- a/src/vs/platform/update/electron-main/updateService.linux.ts
++++ b/src/vs/platform/update/electron-main/updateService.linux.ts
+@@ -5,3 +5,2 @@
+
+-import { CancellationToken } from '../../../base/common/cancellation.js';
+ import { IConfigurationService } from '../../configuration/common/configuration.js';
+@@ -13,6 +12,6 @@ import { INativeHostMainService } from '../../native/electron-main/nativeHostMai
+ import { IProductService } from '../../product/common/productService.js';
+-import { asJson, IRequestService } from '../../request/common/request.js';
++import { IRequestService } from '../../request/common/request.js';
+ import { IApplicationStorageMainService } from '../../storage/electron-main/storageMainService.js';
+ import { ITelemetryService } from '../../telemetry/common/telemetry.js';
+-import { AvailableForDownload, IUpdate, State, UpdateType } from '../common/update.js';
++import { AvailableForDownload, State, UpdateType } from '../common/update.js';
+ import { AbstractUpdateService, createUpdateURL, IUpdateURLOptions } from './abstractUpdateService.js';
+@@ -36,7 +35,7 @@ export class LinuxUpdateService extends AbstractUpdateService {
+
+- protected buildUpdateFeedUrl(quality: string, commit: string, options?: IUpdateURLOptions): string {
+- return createUpdateURL(this.productService.updateUrl!, `linux-${process.arch}`, quality, commit, options);
++ protected buildUpdateFeedUrl(quality: string, _options?: IUpdateURLOptions): string {
++ return createUpdateURL(this.productService, quality, process.platform, process.arch);
+ }
+
+- protected doCheckForUpdates(explicit: boolean, _pendingCommit?: string): void {
++ protected doCheckForUpdates(explicit: boolean, pendingVersion?: string): void {
+ if (!this.quality) {
+@@ -45,20 +44,33 @@ export class LinuxUpdateService extends AbstractUpdateService {
+
++ this.setState(State.CheckingForUpdates(explicit));
++
+ const internalOrg = this.getInternalOrg();
+ const background = !explicit && !internalOrg;
+- const url = this.buildUpdateFeedUrl(this.quality, this.productService.commit!, { background, internalOrg });
+- this.setState(State.CheckingForUpdates(explicit));
++ const url = this.buildUpdateFeedUrl(this.quality, { background, internalOrg });
+
+- this.requestService.request({ url, callSite: 'updateService.linux.checkForUpdates' }, CancellationToken.None)
+- .then(asJson)
+- .then(update => {
+- if (!update || !update.url || !update.version || !update.productVersion) {
++ this.logService.info('update#doCheckForUpdates', { url, explicit, background });
++
++ this._isLatestVersion(url, explicit, pendingVersion)
++ .then((result) => {
++ if(!result) {
++ this.setState(State.Idle(UpdateType.Archive));
++
++ return Promise.resolve(null);
++ }
++
++ if(result.lastest) {
+ this.setState(State.Idle(UpdateType.Archive, undefined, explicit || undefined));
+- } else {
+- this.setState(State.AvailableForDownload(update));
+ }
++ else {
++ this.setState(State.AvailableForDownload(result.update));
++ }
++
++ return Promise.resolve(null);
+ })
+- .then(undefined, err => {
+- this.logService.error(err);
++ .then(undefined, (error) => {
++ this.logService.error(error);
++
+ // only show message when explicitly checking for updates
+- const message: string | undefined = explicit ? (err.message || err) : undefined;
++ const message: string | undefined = explicit ? (error.message || error) : undefined;
++
+ this.setState(State.Idle(UpdateType.Archive, message));
+diff --git a/src/vs/platform/update/electron-main/updateService.win32.ts b/src/vs/platform/update/electron-main/updateService.win32.ts
+index 1911ac0a..e231d59e 100644
+--- a/src/vs/platform/update/electron-main/updateService.win32.ts
++++ b/src/vs/platform/update/electron-main/updateService.win32.ts
+@@ -14,3 +14,2 @@ import { CancellationToken, CancellationTokenSource } from '../../../base/common
+ import { memoize } from '../../../base/common/decorators.js';
+-import { hash } from '../../../base/common/hash.js';
+ import * as path from '../../../base/common/path.js';
+@@ -31,7 +30,7 @@ import { INativeHostMainService } from '../../native/electron-main/nativeHostMai
+ import { IProductService } from '../../product/common/productService.js';
+-import { asJson, IRequestService } from '../../request/common/request.js';
++import { IRequestService, NO_FETCH_TELEMETRY } from '../../request/common/request.js';
+ import { IApplicationStorageMainService } from '../../storage/electron-main/storageMainService.js';
+ import { ITelemetryService } from '../../telemetry/common/telemetry.js';
+-import { AvailableForDownload, DisablementReason, IUpdate, State, StateType, UpdateType } from '../common/update.js';
+-import { AbstractUpdateService, createUpdateURL, getUpdateRequestHeaders, IUpdateURLOptions, UpdateErrorClassification } from './abstractUpdateService.js';
++import { AvailableForDownload, DisablementReason, IUpdate, State, StateType, Target, UpdateType } from '../common/update.js';
++import { AbstractUpdateService, createUpdateURL, IUpdateURLOptions } from './abstractUpdateService.js';
+
+@@ -49,5 +48,9 @@ function getUpdateType(): UpdateType {
+ if (typeof _updateType === 'undefined') {
+- _updateType = existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))
+- ? UpdateType.Setup
+- : UpdateType.Archive;
++ if (existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))) {
++ _updateType = UpdateType.Setup;
++ } else if (path.basename(path.normalize(path.join(process.execPath, '..', '..'))) === 'Program Files') {
++ _updateType = UpdateType.WindowsInstaller;
++ } else {
++ _updateType = UpdateType.Archive;
++ }
+ }
+@@ -157,5 +160,6 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+ try {
++ const updateType = getUpdateType();
+ const updatingVersion = (await readFile(updatingVersionPath, 'utf8')).trim();
+ this.logService.info(`update#doCheckForUpdates - application was updating to version ${updatingVersion}`);
+- const updatePackagePath = await this.getUpdatePackagePath(updatingVersion);
++ const updatePackagePath = await this.getUpdatePackagePath(updatingVersion, updateType);
+ if (await pfs.Promises.exists(updatePackagePath)) {
+@@ -170,3 +174,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+ } else {
+- const fastUpdatesEnabled = this.configurationService.getValue('update.enableWindowsBackgroundUpdates');
++ const fastUpdatesEnabled = getUpdateType() === UpdateType.Setup && this.configurationService.getValue('update.enableWindowsBackgroundUpdates');
+ // GC for background updates in system setup happens via inno_setup since it requires
+@@ -189,15 +193,25 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+
+- protected buildUpdateFeedUrl(quality: string, commit: string, options?: IUpdateURLOptions): string | undefined {
+- let platform = `win32-${process.arch}`;
+-
+- if (getUpdateType() === UpdateType.Archive) {
+- platform += '-archive';
+- } else if (this.productService.target === 'user') {
+- platform += '-user';
++ protected buildUpdateFeedUrl(quality: string, _options?: IUpdateURLOptions): string {
++ let target: Target;
++
++ switch (getUpdateType()) {
++ case UpdateType.Archive:
++ target = "archive"
++ break;
++ case UpdateType.WindowsInstaller:
++ target = "msi"
++ break;
++ default:
++ if (this.productService.target === 'user') {
++ target = "user"
++ }
++ else {
++ target = "system"
++ }
+ }
+
+- return createUpdateURL(this.productService.updateUrl!, platform, quality, commit, options);
++ return createUpdateURL(this.productService, quality, process.platform, process.arch, target);
+ }
+
+- protected doCheckForUpdates(explicit: boolean, pendingCommit?: string): void {
++ protected doCheckForUpdates(explicit: boolean, pendingVersion?: string): void {
+ if (!this.quality) {
+@@ -206,6 +220,2 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+
+- const internalOrg = this.getInternalOrg();
+- const background = !explicit && !internalOrg;
+- const url = this.buildUpdateFeedUrl(this.quality, pendingCommit ?? this.productService.commit!, { background, internalOrg });
+-
+ // Only set CheckingForUpdates if we're not already in Overwriting state
+@@ -215,9 +225,13 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+
+- const headers = getUpdateRequestHeaders(this.productService.version);
+- this.requestService.request({ url, headers, callSite: 'updateService.win32.checkForUpdates' }, CancellationToken.None)
+- .then(asJson)
+- .then(update => {
++ const internalOrg = this.getInternalOrg();
++ const background = !explicit && !internalOrg;
++ const url = this.buildUpdateFeedUrl(this.quality, { background, internalOrg });
++
++ this.logService.info('update#doCheckForUpdates', { url, explicit, background });
++
++ this._isLatestVersion(url, explicit, pendingVersion)
++ .then((result) => {
+ const updateType = getUpdateType();
+
+- if (!update || !update.url || !update.version || !update.productVersion) {
++ if(!result) {
+ // If we were checking for an overwrite update and found nothing newer,
+@@ -233,2 +247,9 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+
++ const { lastest, update } = result;
++
++ if(lastest) {
++ this.setState(State.Idle(updateType, undefined, explicit || undefined));
++ return Promise.resolve(null);
++ }
++
+ if (updateType === UpdateType.Archive) {
+@@ -250,3 +271,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+ return this.cleanup(update.version).then(() => {
+- return this.getUpdatePackagePath(update.version).then(updatePackagePath => {
++ return this.getUpdatePackagePath(update.version, updateType).then(updatePackagePath => {
+ return pfs.Promises.exists(updatePackagePath).then(exists => {
+@@ -258,3 +279,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+
+- return this.requestService.request({ url: update.url, callSite: 'updateService.win32.downloadUpdate' }, CancellationToken.None)
++ return this.requestService.request({ url: update.url, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None)
+ .then(context => {
+@@ -303,8 +324,7 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+ })
+- .then(undefined, err => {
+- this.telemetryService.publicLog2<{ messageHash: string }, UpdateErrorClassification>('update:error', { messageHash: String(hash(String(err))) });
+- this.logService.error(err);
++ .then(undefined, (error) => {
++ this.logService.error(error);
+
+ // only show message when explicitly checking for updates
+- const message: string | undefined = explicit ? (err.message || err) : undefined;
++ const message: string | undefined = explicit ? (error.message || error) : undefined;
+
+@@ -328,5 +348,7 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+
+- private async getUpdatePackagePath(version: string): Promise {
++ private async getUpdatePackagePath(version: string, type: UpdateType): Promise {
+ const cachePath = await this.cachePath;
+- return path.join(cachePath, `CodeSetup-${this.productService.quality}-${version}.exe`);
++ const extension = type == UpdateType.WindowsInstaller ? 'msi' : 'exe'
++
++ return path.join(cachePath, `${this.productService.nameShort.replaceAll(/\s/g, '')}-${this.productService.quality}-${version}.${extension}`);
+ }
+@@ -334,3 +356,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+ private async cleanup(exceptVersion: string | null = null): Promise {
+- const filter = exceptVersion ? (one: string) => !(new RegExp(`${this.productService.quality}-${exceptVersion}\\.exe$`).test(one)) : () => true;
++ const filter = exceptVersion ? (one: string) => !(new RegExp(`${this.productService.quality}-${exceptVersion}\\.(exe|msi)$`).test(one)) : () => true;
+
+@@ -375,14 +397,9 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+
+- const child = spawn(this.availableUpdate.packagePath,
+- [
+- '/verysilent',
+- '/log',
+- `/update="${this.availableUpdate.updateFilePath}"`,
+- `/progress="${progressFilePath}"`,
+- `/sessionend="${sessionEndFlagPath}"`,
+- `/cancel="${cancelFilePath}"`,
+- '/nocloseapplications',
+- '/mergetasks=runcode,!desktopicon,!quicklaunchicon'
+- ],
+- {
++ let child: ChildProcess
++
++ const type = getUpdateType();
++ if (type == UpdateType.WindowsInstaller) {
++ this.logService.info(`update#doApplyUpdate - msiexec.exe /i ${this.availableUpdate.packagePath}`);
++
++ child = spawn('msiexec.exe', ['/i', this.availableUpdate.packagePath], {
+ detached: true,
+@@ -391,4 +408,23 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+ env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' }
+- }
+- );
++ });
++ } else {
++ child = spawn(this.availableUpdate.packagePath,
++ [
++ '/verysilent',
++ '/log',
++ `/update="${this.availableUpdate.updateFilePath}"`,
++ `/progress="${progressFilePath}"`,
++ `/sessionend="${sessionEndFlagPath}"`,
++ `/cancel="${cancelFilePath}"`,
++ '/nocloseapplications',
++ '/mergetasks=runcode,!desktopicon,!quicklaunchicon'
++ ],
++ {
++ detached: true,
++ stdio: ['ignore', 'ignore', 'ignore'],
++ windowsVerbatimArguments: true,
++ env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' }
++ }
++ );
++ }
+
+@@ -529,7 +565,19 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
+ } else {
+- spawn(this.availableUpdate.packagePath, ['/silent', '/log', '/mergetasks=runcode,!desktopicon,!quicklaunchicon'], {
+- detached: true,
+- stdio: ['ignore', 'ignore', 'ignore'],
+- env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' }
+- });
++ const type = getUpdateType();
++ if (type == UpdateType.WindowsInstaller) {
++ this.logService.info(`update#doQuitAndInstall - msiexec.exe /i ${this.availableUpdate.packagePath}`);
++
++ spawn('msiexec.exe', ['/i', this.availableUpdate.packagePath], {
++ detached: true,
++ stdio: ['ignore', 'ignore', 'ignore'],
++ env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' }
++ });
++ }
++ else {
++ spawn(this.availableUpdate.packagePath, ['/silent', '/log', '/mergetasks=runcode,!desktopicon,!quicklaunchicon'], {
++ detached: true,
++ stdio: ['ignore', 'ignore', 'ignore'],
++ env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' }
++ });
++ }
+ }
diff --git a/patches/12-update-add-cooldown.patch b/patches/12-update-add-cooldown.patch
new file mode 100644
index 00000000000..dabea659125
--- /dev/null
+++ b/patches/12-update-add-cooldown.patch
@@ -0,0 +1,82 @@
+diff --git a/src/vs/platform/update/common/update.config.contribution.ts b/src/vs/platform/update/common/update.config.contribution.ts
+index 2c63e9e6..e98ed806 100644
+--- a/src/vs/platform/update/common/update.config.contribution.ts
++++ b/src/vs/platform/update/common/update.config.contribution.ts
+@@ -65,2 +65,8 @@ configurationRegistry.registerConfiguration({
+ },
++ 'update.minReleaseAge': {
++ type: 'integer',
++ default: 120,
++ scope: ConfigurationScope.APPLICATION,
++ description: localize('update.cooldown', "Control how old an update need to be before installing it (in hours)."),
++ },
+ 'update.enableWindowsBackgroundUpdates': {
+diff --git a/src/vs/platform/update/electron-main/abstractUpdateService.ts b/src/vs/platform/update/electron-main/abstractUpdateService.ts
+index d776f408..70b86dce 100644
+--- a/src/vs/platform/update/electron-main/abstractUpdateService.ts
++++ b/src/vs/platform/update/electron-main/abstractUpdateService.ts
+@@ -459,3 +459,26 @@ export abstract class AbstractUpdateService implements IUpdateService {
+
+- return Promise.resolve({ lastest, update });
++ const minReleaseAge = this.configurationService.getValue('update.minReleaseAge');
++
++ if(minReleaseAge === 0) {
++ return Promise.resolve({ lastest, update });
++ }
++
++ const releaseDate = update.timestamp ? new Date(Number.parseInt(String(update.timestamp), 10)) : null;
++
++ this.logService.info(`update#isLatestVersion() - releaseDate: ${releaseDate}`);
++
++ if(!releaseDate || isNaN(releaseDate.getTime())) {
++ return Promise.resolve(undefined);
++ }
++
++ const age = Math.round(Math.abs(Date.now() - releaseDate.getTime()) / (1000 * 60 * 60));
++
++ this.logService.info(`update#isLatestVersion() - releaseAge: ${age}, minReleaseAge: ${minReleaseAge}`);
++
++ if(age >= minReleaseAge) {
++ return Promise.resolve({ lastest, update });
++ }
++ else {
++ return Promise.resolve(undefined);
++ }
+ })
+diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts
+index 464b3948..121bd09f 100644
+--- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts
++++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts
+@@ -168,2 +168,9 @@ Registry.as(ConfigurationExtensions.Configuration)
+ },
++ 'extensions.minReleaseAge': {
++ type: 'integer',
++ default: 48,
++ scope: ConfigurationScope.APPLICATION,
++ description: localize('extensions.minReleaseAge', "Control how old an extension need to be before auto-updating it (in hours)."),
++ tags: ['usesOnlineServices']
++ },
+ 'extensions.showRecommendationsOnlyOnDemand': {
+diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
+index 49b3ec6a..26f44277 100644
+--- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
++++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
+@@ -112,3 +112,4 @@ export class Extension implements IExtension {
+ @IFileService private readonly fileService: IFileService,
+- @IProductService private readonly productService: IProductService
++ @IProductService private readonly productService: IProductService,
++ @IConfigurationService protected configurationService: IConfigurationService
+ ) {
+@@ -348,3 +349,11 @@ export class Extension implements IExtension {
+ if (semver.gt(this.latestVersion, this.version)) {
+- return true;
++ const minReleaseAge = this.configurationService.getValue('extensions.minReleaseAge');
++
++ if(minReleaseAge === 0) {
++ return true;
++ }
++
++ const age = Math.round(Math.abs(Date.now() - this.gallery.lastUpdated) / (1000 * 60 * 60));
++
++ return age >= minReleaseAge;
+ }
diff --git a/patches/fix-keymap.patch b/patches/20-keymap-use-custom-lib.patch
similarity index 89%
rename from patches/fix-keymap.patch
rename to patches/20-keymap-use-custom-lib.patch
index 8e1d9654206..ecead4cf5d4 100644
--- a/patches/fix-keymap.patch
+++ b/patches/20-keymap-use-custom-lib.patch
@@ -1,5 +1,5 @@
diff --git a/.npmrc b/.npmrc
-index a275846..87f881f 100644
+index 8c21e58e..25a93f40 100644
--- a/.npmrc
+++ b/.npmrc
@@ -6,2 +6,3 @@ ignore-scripts=false
@@ -7,7 +7,7 @@ index a275846..87f881f 100644
+build_from_source_native_keymap="no"
legacy-peer-deps="true"
diff --git a/build/.moduleignore b/build/.moduleignore
-index ed36151..5b040cc 100644
+index 7af8defd..b21564c3 100644
--- a/build/.moduleignore
+++ b/build/.moduleignore
@@ -65,7 +65,7 @@ fsevents/test/**
@@ -24,27 +24,27 @@ index ed36151..5b040cc 100644
+!@vscodium/native-keymap/build/Release/*.node
diff --git a/eslint.config.js b/eslint.config.js
-index 73f062a..f008259 100644
+index 51b085ee..938419e2 100644
--- a/eslint.config.js
+++ b/eslint.config.js
-@@ -1481,3 +1481,3 @@ export default tseslint.config(
+@@ -1563,3 +1563,3 @@ export default defineConfig(
'node:module',
- 'native-keymap',
+ '@vscodium/native-keymap',
'net',
diff --git a/package-lock.json b/package-lock.json
-index bc72a21..ae566c1 100644
+index 81d315f0..1d99e154 100644
--- a/package-lock.json
+++ b/package-lock.json
-@@ -32,2 +32,3 @@
+@@ -43,2 +43,3 @@
"@vscode/windows-registry": "^1.2.0",
+ "@vscodium/native-keymap": "3.3.7-258424",
- "@xterm/addon-clipboard": "^0.3.0-beta.191",
-@@ -49,3 +50,2 @@
+ "@xterm/addon-clipboard": "^0.3.0-beta.285",
+@@ -62,3 +63,2 @@
"native-is-elevated": "0.9.0",
- "native-keymap": "^3.3.5",
- "node-pty": "^1.2.0-beta.10",
-@@ -4862,2 +4862,9 @@
+ "node-addon-api": "^6.0.0",
+@@ -4498,2 +4498,9 @@
},
+ "node_modules/@vscodium/native-keymap": {
+ "version": "3.3.7-258424",
@@ -53,8 +53,8 @@ index bc72a21..ae566c1 100644
+ "hasInstallScript": true,
+ "license": "MIT"
+ },
- "node_modules/@wdio/config": {
-@@ -15159,5 +15166,6 @@
+ "node_modules/@webgpu/types": {
+@@ -14159,5 +14166,6 @@
"node_modules/napi-build-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
@@ -64,7 +64,7 @@ index bc72a21..ae566c1 100644
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "license": "MIT"
},
-@@ -15170,9 +15178,2 @@
+@@ -14170,9 +14178,2 @@
},
- "node_modules/native-keymap": {
- "version": "3.3.9",
@@ -74,7 +74,7 @@ index bc72a21..ae566c1 100644
- "license": "MIT"
- },
"node_modules/natural-compare": {
-@@ -16693,5 +16694,6 @@
+@@ -15582,5 +15583,6 @@
"node_modules/prebuild-install": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz",
@@ -84,22 +84,22 @@ index bc72a21..ae566c1 100644
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "license": "MIT",
"dependencies": {
-@@ -16702,3 +16704,3 @@
+@@ -15591,3 +15593,3 @@
"mkdirp-classic": "^0.5.3",
- "napi-build-utils": "^1.0.1",
+ "napi-build-utils": "^2.0.0",
"node-abi": "^3.3.0",
diff --git a/package.json b/package.json
-index d727d5a..54d14ad 100644
+index 36485330..2a5830cd 100644
--- a/package.json
+++ b/package.json
-@@ -119,3 +119,3 @@
+@@ -146,3 +146,3 @@
"native-is-elevated": "0.9.0",
- "native-keymap": "^3.3.5",
+ "@vscodium/native-keymap": "3.3.7-258424",
- "node-pty": "^1.2.0-beta.10",
+ "node-addon-api": "^6.0.0",
diff --git a/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts b/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts
-index c30c6da..ca6cea2 100644
+index 9b11a712..975c3127 100644
--- a/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts
+++ b/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts
@@ -44,8 +44,8 @@ flakySuite('Native Modules (all platforms)', () => {
@@ -116,7 +116,7 @@ index c30c6da..ca6cea2 100644
+ assert.ok(result, testErrorMessage('@vscodium/native-keymap'));
});
diff --git a/src/vs/platform/keyboardLayout/electron-main/keyboardLayoutMainService.ts b/src/vs/platform/keyboardLayout/electron-main/keyboardLayoutMainService.ts
-index 8950ce2..f31cea6 100644
+index 8950ce21..f31cea62 100644
--- a/src/vs/platform/keyboardLayout/electron-main/keyboardLayoutMainService.ts
+++ b/src/vs/platform/keyboardLayout/electron-main/keyboardLayoutMainService.ts
@@ -5,3 +5,3 @@
diff --git a/patches/fix-policies.patch b/patches/21-policy-use-custom-lib.patch
similarity index 72%
rename from patches/fix-policies.patch
rename to patches/21-policy-use-custom-lib.patch
index f2fadf67667..dd43b32228b 100644
--- a/patches/fix-policies.patch
+++ b/patches/21-policy-use-custom-lib.patch
@@ -1,10 +1,8 @@
-# Fix: Replace @vscode/policy-watcher with @vscodium/policy-watcher
-# Documentation: docs/patches.md#fix-policies
diff --git a/build/.moduleignore b/build/.moduleignore
-index 5b040cc..8d5fd71 100644
+index b21564c3..38aaef45 100644
--- a/build/.moduleignore
+++ b/build/.moduleignore
-@@ -128,9 +128,11 @@ vsda/**
+@@ -153,9 +153,11 @@ vsda/**
-@vscode/policy-watcher/build/**
-@vscode/policy-watcher/.husky/**
@@ -24,7 +22,7 @@ index 5b040cc..8d5fd71 100644
+!@vscodium/policy-watcher/build/Release/vscodium-policy-watcher.node
diff --git a/build/lib/policies/basePolicy.ts b/build/lib/policies/basePolicy.ts
-index 7f650ba..db927cb 100644
+index 7f650ba7..db927cb4 100644
--- a/build/lib/policies/basePolicy.ts
+++ b/build/lib/policies/basePolicy.ts
@@ -38,3 +38,3 @@ export abstract class BasePolicy implements Policy {
@@ -33,66 +31,66 @@ index 7f650ba..db927cb 100644
+ ``,
` `,
diff --git a/build/lib/policies/render.ts b/build/lib/policies/render.ts
-index 47b485d..8437fd4 100644
+index bd5958cb..3f62d83f 100644
--- a/build/lib/policies/render.ts
+++ b/build/lib/policies/render.ts
-@@ -49,3 +49,3 @@ export function renderADMX(regKey: string, versions: string[], categories: Categ
+@@ -56,3 +56,3 @@ export function renderADMX(regKey: string, versions: string[], categories: Categ
-
+
-@@ -167,3 +167,3 @@ export function renderProfileManifest(appName: string, bundleIdentifier: string,
+@@ -174,3 +174,3 @@ export function renderProfileManifest(appName: string, bundleIdentifier: string,
pfm_default
- Microsoft
+ !!ORG_NAME!!
pfm_name
-@@ -185,3 +185,3 @@ export function renderProfileManifest(appName: string, bundleIdentifier: string,
+@@ -192,3 +192,3 @@ export function renderProfileManifest(appName: string, bundleIdentifier: string,
pfm_app_url
- https://code.visualstudio.com/
+ https://github.com/VSCodium/vscodium
pfm_description
-@@ -189,3 +189,3 @@ export function renderProfileManifest(appName: string, bundleIdentifier: string,
+@@ -196,3 +196,3 @@ export function renderProfileManifest(appName: string, bundleIdentifier: string,
pfm_documentation_url
- https://code.visualstudio.com/docs/setup/enterprise
+ https://github.com/VSCodium/vscodium
pfm_domain
-@@ -255,3 +255,3 @@ ${policyEntries}
+@@ -262,3 +262,3 @@ ${policyEntries}
PayloadDescription
- This profile manages ${appName}. For more information see https://code.visualstudio.com/docs/setup/enterprise
+ This profile manages ${appName}. For more information see https://github.com/VSCodium/vscodium
PayloadDisplayName
-@@ -261,3 +261,3 @@ ${policyEntries}
+@@ -268,3 +268,3 @@ ${policyEntries}
PayloadOrganization
- Microsoft
+ !!ORG_NAME!!
PayloadType
diff --git a/eslint.config.js b/eslint.config.js
-index f008259..f87fda1 100644
+index 938419e2..f3a103ca 100644
--- a/eslint.config.js
+++ b/eslint.config.js
-@@ -1464,3 +1464,3 @@ export default tseslint.config(
+@@ -1544,3 +1544,3 @@ export default defineConfig(
'@vscode/native-watchdog',
- '@vscode/policy-watcher',
+ '@vscodium/policy-watcher',
'@vscode/proxy-agent',
diff --git a/package-lock.json b/package-lock.json
-index ae566c1..3b3a5dd 100644
+index 1d99e154..a99dcb95 100644
--- a/package-lock.json
+++ b/package-lock.json
-@@ -21,3 +21,2 @@
+@@ -31,3 +31,2 @@
"@vscode/native-watchdog": "^1.4.6",
-- "@vscode/policy-watcher": "^1.3.2",
- "@vscode/proxy-agent": "^0.39.1",
-@@ -33,2 +32,3 @@
+- "@vscode/policy-watcher": "^1.4.0",
+ "@vscode/proxy-agent": "^0.42.0",
+@@ -44,2 +43,3 @@
"@vscodium/native-keymap": "3.3.7-258424",
-+ "@vscodium/policy-watcher": "^1.3.2-252465",
- "@xterm/addon-clipboard": "^0.3.0-beta.191",
-@@ -4538,22 +4538,2 @@
++ "@vscodium/policy-watcher": "1.3.2-252465",
+ "@xterm/addon-clipboard": "^0.3.0-beta.285",
+@@ -4122,22 +4122,2 @@
},
- "node_modules/@vscode/policy-watcher": {
-- "version": "1.3.7",
-- "resolved": "https://registry.npmjs.org/@vscode/policy-watcher/-/policy-watcher-1.3.7.tgz",
-- "integrity": "sha512-OvIczTbtGLZs7YU0ResbjM0KEB2ORBnlJ4ICxaB9fKHNVBwNVp4i2qIkDQGp3UBGtu7P8/+eg4/ZKk2oJGFcug==",
+- "version": "1.4.0",
+- "resolved": "https://registry.npmjs.org/@vscode/policy-watcher/-/policy-watcher-1.4.0.tgz",
+- "integrity": "sha512-QKTLV/UtV0HH5AJELfN5D3Jcxj2hB9CYT9GtG334I8bU5TdusaSGYSpDjumZBGWO2YxwVYpBNytA7mq/I3ZtzA==",
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
@@ -110,12 +108,12 @@ index ae566c1..3b3a5dd 100644
- }
- },
"node_modules/@vscode/proxy-agent": {
-@@ -4869,2 +4849,22 @@
+@@ -4505,2 +4485,22 @@
},
+ "node_modules/@vscodium/policy-watcher": {
-+ "version": "1.3.2-255408",
-+ "resolved": "https://registry.npmjs.org/@vscodium/policy-watcher/-/policy-watcher-1.3.2-255408.tgz",
-+ "integrity": "sha512-0KERmB+VkSz9hvFWEDGalCpxQ9+qjLaUazXMBkzWQ9SjKPaD6zU9u6wA4/OUu816JnvCFEeJYEe9WcDZPnKQ1w==",
++ "version": "1.3.2-252465",
++ "resolved": "https://registry.npmjs.org/@vscodium/policy-watcher/-/policy-watcher-1.3.2-252465.tgz",
++ "integrity": "sha512-kpnb656HMteBIm8d9LhBpQ5gL2A/4rJrsaLCF0D8IWyrZAQ0UR9EzXM6tZ6p5H+KWot3QUjm0Gry6vMV1yye5Q==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
@@ -124,26 +122,26 @@ index ae566c1..3b3a5dd 100644
+ }
+ },
+ "node_modules/@vscodium/policy-watcher/node_modules/node-addon-api": {
-+ "version": "8.6.0",
-+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.6.0.tgz",
-+ "integrity": "sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==",
++ "version": "8.7.0",
++ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz",
++ "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18 || ^20 || >= 21"
+ }
+ },
- "node_modules/@wdio/config": {
+ "node_modules/@webgpu/types": {
diff --git a/package.json b/package.json
-index 54d14ad..47778c2 100644
+index 2a5830cd..44b0c9fa 100644
--- a/package.json
+++ b/package.json
-@@ -91,3 +91,3 @@
+@@ -115,3 +115,3 @@
"@vscode/native-watchdog": "^1.4.6",
-- "@vscode/policy-watcher": "^1.3.2",
-+ "@vscodium/policy-watcher": "^1.3.2-252465",
- "@vscode/proxy-agent": "^0.39.1",
+- "@vscode/policy-watcher": "^1.4.0",
++ "@vscodium/policy-watcher": "1.3.2-252465",
+ "@vscode/proxy-agent": "^0.42.0",
diff --git a/src/vs/base/test/node/uri.perf.data.txt b/src/vs/base/test/node/uri.perf.data.txt
-index ee0a24b..881ce36 100644
+index ee0a24b5..881ce36a 100644
--- a/src/vs/base/test/node/uri.perf.data.txt
+++ b/src/vs/base/test/node/uri.perf.data.txt
@@ -14698,48 +14698,48 @@
@@ -242,7 +240,7 @@ index ee0a24b..881ce36 100644
+/Users/example/node_modules/@vscodium/policy-watcher/src/windows/NumberPolicy.hh
/Users/example/node_modules/@vscode/vscode-languagedetection/CODE_OF_CONDUCT.md
diff --git a/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts b/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts
-index ca6cea2..32b22fe 100644
+index 975c3127..7ff873da 100644
--- a/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts
+++ b/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts
@@ -62,5 +62,5 @@ flakySuite('Native Modules (all platforms)', () => {
@@ -254,8 +252,31 @@ index ca6cea2..32b22fe 100644
+ const watcher = await import('@vscodium/policy-watcher');
+ assert.ok(typeof watcher.createWatcher === 'function', testErrorMessage('@vscodium/policy-watcher'));
});
+diff --git a/src/vs/platform/policy/node/copilotManagedSettingsService.ts b/src/vs/platform/policy/node/copilotManagedSettingsService.ts
+index 5b76979d..2af19dbd 100644
+--- a/src/vs/platform/policy/node/copilotManagedSettingsService.ts
++++ b/src/vs/platform/policy/node/copilotManagedSettingsService.ts
+@@ -13,3 +13,3 @@ import { collectManagedSettingsDefinitions, ICopilotManagedSettingsService } fro
+ import { PolicyDefinition, PolicyValue } from '../common/policy.js';
+-import type { Watcher } from '@vscode/policy-watcher';
++import type { Watcher } from '@vscodium/policy-watcher';
+
+@@ -20,2 +20,3 @@ export interface ICopilotPolicyWatcherOptions {
+ export type CopilotPolicyWatcherFactory = (
++ vendorName: string,
+ productName: string,
+@@ -91,3 +92,3 @@ export class CopilotManagedSettingsService extends Disposable implements ICopilo
+
+- const { createWatcher } = this.watcherFactory ? { createWatcher: this.watcherFactory } : (await import('@vscode/policy-watcher') as { createWatcher: CopilotPolicyWatcherFactory });
++ const { createWatcher } = this.watcherFactory ? { createWatcher: this.watcherFactory } : (await import('@vscodium/policy-watcher') as { createWatcher: CopilotPolicyWatcherFactory });
+ await this.throttler.queue(() => new Promise((c, e) => {
+@@ -95,3 +96,3 @@ export class CopilotManagedSettingsService extends Disposable implements ICopilo
+ this.logService.trace(`Creating Copilot managed-settings watcher for productName ${this.productName}`);
+- this.watcher.value = createWatcher(this.productName, managedSettingDefinitions, update => {
++ this.watcher.value = createWatcher('!!ORG_NAME!!', this.productName, managedSettingDefinitions, update => {
+ this._onDidManagedSettingsChange(update as Record);
diff --git a/src/vs/platform/policy/node/nativePolicyService.ts b/src/vs/platform/policy/node/nativePolicyService.ts
-index feb4ba1..4d9e0c3 100644
+index 6039dbb7..978be1b4 100644
--- a/src/vs/platform/policy/node/nativePolicyService.ts
+++ b/src/vs/platform/policy/node/nativePolicyService.ts
@@ -8,3 +8,3 @@ import { IStringDictionary } from '../../../base/common/collections.js';
@@ -268,8 +289,32 @@ index feb4ba1..4d9e0c3 100644
- const { createWatcher } = await import('@vscode/policy-watcher');
+ const { createWatcher } = await import('@vscodium/policy-watcher');
-@@ -31,3 +31,3 @@ export class NativePolicyService extends AbstractPolicyService implements IPolic
- try {
+@@ -32,3 +32,3 @@ export class NativePolicyService extends AbstractPolicyService implements IPolic
+ this.logService.trace(`Creating watcher for productName ${this.productName}`);
- this.watcher.value = createWatcher(this.productName, policyDefinitions, update => {
-+ this.watcher.value = createWatcher('VSCodium', this.productName, policyDefinitions, update => {
++ this.watcher.value = createWatcher('!!ORG_NAME!!', this.productName, policyDefinitions, update => {
this._onDidPolicyChange(update);
+diff --git a/src/vs/platform/policy/test/node/copilotManagedSettingsService.test.ts b/src/vs/platform/policy/test/node/copilotManagedSettingsService.test.ts
+index 9735a461..1c868690 100644
+--- a/src/vs/platform/policy/test/node/copilotManagedSettingsService.test.ts
++++ b/src/vs/platform/policy/test/node/copilotManagedSettingsService.test.ts
+@@ -24,3 +24,3 @@ suite('CopilotManagedSettingsService', () => {
+ let onDidChange: ((update: Record) => void) | undefined;
+- const watcherFactory: CopilotPolicyWatcherFactory = (_productName, policies, callback) => {
++ const watcherFactory: CopilotPolicyWatcherFactory = (_vendorName, _productName, policies, callback) => {
+ assert.deepStrictEqual(policies, { [COPILOT_DISABLE_BYPASS_PERMISSIONS_MODE_KEY]: { type: 'string' } });
+@@ -64,3 +64,3 @@ suite('CopilotManagedSettingsService', () => {
+ let disposeCount = 0;
+- const watcherFactory: CopilotPolicyWatcherFactory = (_productName, _policies, callback) => {
++ const watcherFactory: CopilotPolicyWatcherFactory = (_vendorName, _productName, _policies, callback) => {
+ onDidChange = callback;
+@@ -89,3 +89,3 @@ suite('CopilotManagedSettingsService', () => {
+ let watcherCreateCount = 0;
+- const watcherFactory: CopilotPolicyWatcherFactory = (_productName, _policies, callback) => {
++ const watcherFactory: CopilotPolicyWatcherFactory = (_vendorName, _productName, _policies, callback) => {
+ watcherCreateCount++;
+@@ -128,3 +128,3 @@ suite('CopilotManagedSettingsService', () => {
+ const otherManagedSettingKey = 'permissions.otherManagedSetting';
+- const watcherFactory: CopilotPolicyWatcherFactory = (_productName, _policies, callback) => {
++ const watcherFactory: CopilotPolicyWatcherFactory = (_vendorName, _productName, _policies, callback) => {
+ onDidChange = callback;
diff --git a/patches/optional-tree-sitter.patch b/patches/30-build-add-missing-dependencies.patch
similarity index 100%
rename from patches/optional-tree-sitter.patch
rename to patches/30-build-add-missing-dependencies.patch
diff --git a/patches/cli.patch b/patches/40-cli-use-reh-archive.patch
similarity index 85%
rename from patches/cli.patch
rename to patches/40-cli-use-reh-archive.patch
index 7e81ed88dfd..de31d13ce54 100644
--- a/patches/cli.patch
+++ b/patches/40-cli-use-reh-archive.patch
@@ -1,22 +1,22 @@
diff --git a/cli/src/commands/serve_web.rs b/cli/src/commands/serve_web.rs
-index d3f7db8..988024b 100644
+index 12178ef2..48b6c135 100644
--- a/cli/src/commands/serve_web.rs
+++ b/cli/src/commands/serve_web.rs
-@@ -756,3 +756,3 @@ impl ConnectionManager {
+@@ -794,3 +794,3 @@ impl ConnectionManager {
let dir_fut = cache.create(&args.release.commit, |target_dir| async move {
- info!(log_for_fut, "Downloading server {}", release_for_fut.commit);
+ info!(log_for_fut, "Downloading server {}/{}", release_for_fut.commit, release_for_fut.name);
let tmpdir = tempfile::tempdir().unwrap();
-@@ -784,3 +784,3 @@ impl ConnectionManager {
+@@ -822,3 +822,3 @@ impl ConnectionManager {
.join("bin")
- .join(args.release.quality.server_entrypoint());
+ .join(args.release.quality.server_entrypoint().unwrap());
diff --git a/cli/src/constants.rs b/cli/src/constants.rs
-index 1e277a8..97f17d3 100644
+index 938f4343..7277908a 100644
--- a/cli/src/constants.rs
+++ b/cli/src/constants.rs
-@@ -35,3 +35,6 @@ pub const DOCUMENTATION_URL: Option<&'static str> = option_env!("VSCODE_CLI_DOCU
+@@ -37,3 +37,6 @@ pub const DOCUMENTATION_URL: Option<&'static str> = option_env!("VSCODE_CLI_DOCU
pub const VSCODE_CLI_COMMIT: Option<&'static str> = option_env!("VSCODE_CLI_COMMIT");
-pub const VSCODE_CLI_UPDATE_ENDPOINT: Option<&'static str> = option_env!("VSCODE_CLI_UPDATE_URL");
+pub const VSCODE_CLI_UPDATE_ENDPOINT: Option<&'static str> = option_env!("VSCODE_CLI_UPDATE_ENDPOINT");
@@ -25,7 +25,7 @@ index 1e277a8..97f17d3 100644
+pub const VSCODE_CLI_BINARY_NAME: Option<&'static str> = option_env!("VSCODE_CLI_BINARY_NAME");
diff --git a/cli/src/options.rs b/cli/src/options.rs
-index 7d152c0..c0f2fb2 100644
+index 7d152c0e..c0f2fb2e 100644
--- a/cli/src/options.rs
+++ b/cli/src/options.rs
@@ -9,3 +9,3 @@ use serde::{Deserialize, Serialize};
@@ -57,17 +57,26 @@ index 7d152c0..c0f2fb2 100644
- server_name
+ Ok(server_name)
}
+diff --git a/cli/src/tunnels/agent_host.rs b/cli/src/tunnels/agent_host.rs
+index 93651587..77d19e6f 100644
+--- a/cli/src/tunnels/agent_host.rs
++++ b/cli/src/tunnels/agent_host.rs
+@@ -233,3 +233,3 @@ impl AgentHostManager {
+ .join("bin")
+- .join(release.quality.server_entrypoint())
++ .join(release.quality.server_entrypoint().unwrap())
+ };
diff --git a/cli/src/tunnels/code_server.rs b/cli/src/tunnels/code_server.rs
-index bbabadc..b454d0e 100644
+index df37b863..a3df1bea 100644
--- a/cli/src/tunnels/code_server.rs
+++ b/cli/src/tunnels/code_server.rs
-@@ -462,3 +462,3 @@ impl<'a> ServerBuilder<'a> {
+@@ -499,3 +499,3 @@ impl<'a> ServerBuilder<'a> {
.join("bin")
- .join(self.server_params.release.quality.server_entrypoint()),
+ .join(self.server_params.release.quality.server_entrypoint().unwrap()),
&["--version"],
diff --git a/cli/src/tunnels/paths.rs b/cli/src/tunnels/paths.rs
-index 3d7d718..98529bc 100644
+index 3d7d718a..98529bc6 100644
--- a/cli/src/tunnels/paths.rs
+++ b/cli/src/tunnels/paths.rs
@@ -100,3 +100,3 @@ impl InstalledServer {
@@ -76,14 +85,14 @@ index 3d7d718..98529bc 100644
+ .join(self.quality.server_entrypoint().unwrap())
},
diff --git a/cli/src/update_service.rs b/cli/src/update_service.rs
-index 55f1dad..3b7ef5c 100644
+index cd94139f..db064277 100644
--- a/cli/src/update_service.rs
+++ b/cli/src/update_service.rs
@@ -10,3 +10,3 @@ use serde::{Deserialize, Serialize};
use crate::{
- constants::VSCODE_CLI_UPDATE_ENDPOINT,
+ constants::{VSCODE_CLI_APP_NAME, VSCODE_CLI_DOWNLOAD_ENDPOINT, VSCODE_CLI_UPDATE_ENDPOINT},
- debug, log, options, spanf,
+ log, options,
@@ -18,3 +18,3 @@ use crate::{
zipper,
- },
@@ -102,8 +111,8 @@ index 55f1dad..3b7ef5c 100644
fn get_update_endpoint() -> Result {
@@ -66,3 +74,3 @@ fn get_update_endpoint() -> Result {
.map(|s| s.to_string())
-- .ok_or_else(|| CodeError::UpdatesNotConfigured("no service url"))
-+ .ok_or_else(|| CodeError::UpdatesNotConfigured("no update url"))
+- .ok_or(CodeError::UpdatesNotConfigured("no service url"))
++ .ok_or(CodeError::UpdatesNotConfigured("no update url"))
}
@@ -74,3 +82,4 @@ impl UpdateService {
@@ -129,12 +138,12 @@ index 55f1dad..3b7ef5c 100644
+ platform.os(),
+ platform.arch(),
);
-@@ -104,3 +109,3 @@ impl UpdateService {
+@@ -100,3 +105,3 @@ impl UpdateService {
let res = response.json::().await?;
- debug!(self.log, "Resolved version {} to {}", version, res.version);
+ debug!(self.log, "Resolved quality {} to {}", quality, res.version);
-@@ -115,40 +120,17 @@ impl UpdateService {
+@@ -111,36 +116,17 @@ impl UpdateService {
- /// Gets the latest commit for the target of the given quality.
- pub async fn get_latest_commit(
@@ -165,11 +174,7 @@ index 55f1dad..3b7ef5c 100644
+ release.name,
);
-- let mut response = spanf!(
-- self.log,
-- self.log.span("server.version.resolve"),
-- self.client.make_request("GET", download_url)
-- )?;
+- let mut response = self.client.make_request("GET", download_url).await?;
-
- if !response.status_code.is_success() {
- return Err(response.into_err().await.into());
@@ -187,7 +192,7 @@ index 55f1dad..3b7ef5c 100644
- })
+ Ok(download_url)
}
-@@ -157,15 +139,3 @@ impl UpdateService {
+@@ -149,15 +135,3 @@ impl UpdateService {
pub async fn get_download_stream(&self, release: &Release) -> Result {
- let update_endpoint = get_update_endpoint()?;
- let download_segment = release
@@ -204,24 +209,25 @@ index 55f1dad..3b7ef5c 100644
- );
+ let download_url = self.get_download_url(release)?;
-@@ -203,13 +173,2 @@ pub enum TargetKind {
+@@ -195,13 +169,2 @@ pub enum TargetKind {
-impl TargetKind {
- fn download_segment(&self, platform: Platform) -> Option {
- match *self {
-- TargetKind::Server => Some(platform.headless()),
+- TargetKind::Server => platform.headless(),
- TargetKind::Archive => platform.archive(),
-- TargetKind::Web => Some(platform.web()),
+- TargetKind::Web => platform.web(),
- TargetKind::Cli => Some(platform.cli()),
- }
- }
-}
-
#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize)]
-@@ -232,30 +191,17 @@ pub enum Platform {
+@@ -224,50 +187,36 @@ pub enum Platform {
impl Platform {
- pub fn archive(&self) -> Option {
-- match self {
++ pub fn arch(&self) -> String {
+ match self {
- Platform::LinuxX64 => Some("linux-x64".to_owned()),
- Platform::LinuxARM64 => Some("linux-arm64".to_owned()),
- Platform::LinuxARM32 => Some("linux-armhf".to_owned()),
@@ -231,24 +237,6 @@ index 55f1dad..3b7ef5c 100644
- Platform::WindowsX86 => Some("win32-archive".to_owned()),
- Platform::WindowsARM64 => Some("win32-arm64-archive".to_owned()),
- _ => None,
-- }
-- }
-- pub fn headless(&self) -> String {
-+ pub fn arch(&self) -> String {
- match self {
-- Platform::LinuxAlpineARM64 => "server-alpine-arm64",
-- Platform::LinuxAlpineX64 => "server-linux-alpine",
-- Platform::LinuxX64 => "server-linux-x64",
-- Platform::LinuxX64Legacy => "server-linux-legacy-x64",
-- Platform::LinuxARM64 => "server-linux-arm64",
-- Platform::LinuxARM64Legacy => "server-linux-legacy-arm64",
-- Platform::LinuxARM32 => "server-linux-armhf",
-- Platform::LinuxARM32Legacy => "server-linux-legacy-armhf",
-- Platform::DarwinX64 => "server-darwin",
-- Platform::DarwinARM64 => "server-darwin-arm64",
-- Platform::WindowsX64 => "server-win32-x64",
-- Platform::WindowsX86 => "server-win32",
-- Platform::WindowsARM64 => "server-win32-arm64",
+ Platform::LinuxAlpineARM64 => "arm64",
+ Platform::LinuxAlpineX64 => "x64",
+ Platform::LinuxX64 => "x64",
@@ -263,7 +251,27 @@ index 55f1dad..3b7ef5c 100644
+ Platform::WindowsX86 => "ia42",
+ Platform::WindowsARM64 => "arm64",
}
-@@ -264,17 +210,17 @@ impl Platform {
+- }
+- pub fn headless(&self) -> Option {
+- let name = match self {
+- Platform::LinuxAlpineARM64 => "server-alpine-arm64",
+- Platform::LinuxAlpineX64 => "server-linux-alpine",
+- Platform::LinuxX64 => "server-linux-x64",
+- Platform::LinuxX64Legacy => "server-linux-legacy-x64",
+- Platform::LinuxARM64 => "server-linux-arm64",
+- Platform::LinuxARM64Legacy => "server-linux-legacy-arm64",
+- // No remote server is built for arm32 since Node.js dropped
+- // 32-bit Linux on armv7 in v24.
+- Platform::LinuxARM32 | Platform::LinuxARM32Legacy => return None,
+- Platform::DarwinX64 => "server-darwin",
+- Platform::DarwinARM64 => "server-darwin-arm64",
+- Platform::WindowsX64 => "server-win32-x64",
+- Platform::WindowsX86 => "server-win32",
+- Platform::WindowsARM64 => "server-win32-arm64",
+- };
+- Some(name.to_owned())
++ .to_owned()
+ }
- pub fn cli(&self) -> String {
+ pub fn os(&self) -> String {
@@ -295,15 +303,15 @@ index 55f1dad..3b7ef5c 100644
+ Platform::WindowsX86 => "win32",
+ Platform::WindowsARM64 => "win32",
}
-@@ -283,6 +229,2 @@ impl Platform {
+@@ -276,6 +225,2 @@ impl Platform {
-- pub fn web(&self) -> String {
-- format!("{}-web", self.headless())
+- pub fn web(&self) -> Option {
+- self.headless().map(|h| format!("{h}-web"))
- }
-
pub fn env_default() -> Option {
diff --git a/extensions/tunnel-forwarding/src/extension.ts b/extensions/tunnel-forwarding/src/extension.ts
-index 2f71999..e689f62 100644
+index 2f71999b..e689f628 100644
--- a/extensions/tunnel-forwarding/src/extension.ts
+++ b/extensions/tunnel-forwarding/src/extension.ts
@@ -37,3 +37,3 @@ if (process.env.VSCODE_FORWARDING_IS_DEV) {
diff --git a/patches/50-build-improve-gulp-tasks.patch b/patches/50-build-improve-gulp-tasks.patch
new file mode 100644
index 00000000000..8127685d55d
--- /dev/null
+++ b/patches/50-build-improve-gulp-tasks.patch
@@ -0,0 +1,59 @@
+diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
+index 53987f88..b897c6c6 100644
+--- a/build/gulpfile.vscode.ts
++++ b/build/gulpfile.vscode.ts
+@@ -27,3 +27,3 @@ import { createAsar } from './lib/asar.ts';
+ import minimist from 'minimist';
+-import { compileBuildWithoutManglingTask, compileBuildWithManglingTask } from './gulpfile.compile.ts';
++import { compileBuildWithoutManglingTask } from './gulpfile.compile.ts';
+ import { compileNonNativeExtensionsBuildTask, compileNativeExtensionsBuildTask, compileAllExtensionsBuildTask, compileExtensionMediaBuildTask, cleanExtensionsBuildTask, compileCopilotExtensionBuildTask } from './gulpfile.extensions.ts';
+@@ -667,3 +667,4 @@ BUILD_TARGETS.forEach(buildTarget => {
+ );
+- vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series(
++
++ const prepackTask = task.define(`vscode${dashed(minified)}-prepack`, task.series(
+ copyCodiconsTask,
+@@ -673,2 +674,6 @@ BUILD_TARGETS.forEach(buildTarget => {
+ compileExtensionMediaBuildTask,
++ ));
++ task.task(prepackTask);
++
++ const packingTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-packing`, task.series(
+ writeISODate('out-build'),
+@@ -677,5 +682,11 @@ BUILD_TARGETS.forEach(buildTarget => {
+ ));
+- } else {
++ task.task(packingTask);
++
+ vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series(
+- minified ? compileBuildWithManglingTask : compileBuildWithoutManglingTask,
++ prepackTask,
++ packingTask,
++ ));
++ } else {
++ const prepackTask = task.define(`vscode${dashed(minified)}-prepack`, task.series(
++ compileBuildWithoutManglingTask,
+ cleanExtensionsBuildTask,
+@@ -685,4 +696,14 @@ BUILD_TARGETS.forEach(buildTarget => {
+ minified ? minifyVSCodeTask : bundleVSCodeTask,
++ ));
++ task.task(prepackTask);
++
++ const packingTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-packing`, task.series(
+ vscodeTaskCI
+ ));
++ task.task(packingTask);
++
++ vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series(
++ prepackTask,
++ packingTask,
++ ));
+ }
+diff --git a/build/lib/esbuild.ts b/build/lib/esbuild.ts
+index d066767b..0d09e32a 100644
+--- a/build/lib/esbuild.ts
++++ b/build/lib/esbuild.ts
+@@ -42,3 +42,2 @@ export function runEsbuildBundle(outDir: string, minify: boolean, nls: boolean,
+ args.push('--minify');
+- args.push('--mangle-privates');
+ }
diff --git a/patches/51-build-disable-non-ascii.patch b/patches/51-build-disable-non-ascii.patch
new file mode 100644
index 00000000000..2cef7a54f5c
--- /dev/null
+++ b/patches/51-build-disable-non-ascii.patch
@@ -0,0 +1,23 @@
+diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts
+index 21a17ee1..660620f8 100644
+--- a/build/lib/optimize.ts
++++ b/build/lib/optimize.ts
+@@ -251,13 +251,8 @@ export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) =>
+ const sourceMapFile = res.outputFiles.find(f => /\.(js|css)\.map$/.test(f.path))!;
+-
+ const contents = Buffer.from(jsOrCSSFile.contents);
+- const unicodeMatch = contents.toString().match(/[^\x00-\xFF]+/g);
+- if (unicodeMatch) {
+- cb(new Error(`Found non-ascii character ${unicodeMatch[0]} in the minified output of ${f.path}. Non-ASCII characters in the output can cause performance problems when loading. Please review if you have introduced a regular expression that esbuild is not automatically converting and convert it to using unicode escape sequences.`));
+- } else {
+- f.contents = contents;
+- f.sourceMap = JSON.parse(sourceMapFile.text);
+-
+- cb(undefined, f);
+- }
++
++ f.contents = contents;
++ f.sourceMap = JSON.parse(sourceMapFile.text);
++
++ cb(undefined, f);
+ }, cb);
diff --git a/patches/52-ext-copilot-remove-it.json b/patches/52-ext-copilot-remove-it.json
new file mode 100644
index 00000000000..58ddf28a98f
--- /dev/null
+++ b/patches/52-ext-copilot-remove-it.json
@@ -0,0 +1,74 @@
+[
+ {
+ "action": "remove",
+ "paths": [
+ "extensions/copilot",
+ "src/vs/platform/agentHost/node/claude",
+ "src/vs/platform/agentHost/node/codex",
+ "src/vs/platform/agentHost/node/otel",
+ "src/vs/platform/agentHost/test/node/clientTools",
+ "src/vs/platform/agentHost/test/node/codex",
+ "src/vs/platform/agentHost/test/node/customizations",
+ "src/vs/platform/agentHost/test/node/otel",
+ "src/vs/platform/agentHost/node/copilot/copilotAgent.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotAgentSession.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotGitProject.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotPluginConverters.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotSessionWrapper.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotShellTools.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotToolDisplay.ts",
+ "src/vs/platform/agentHost/node/copilot/mapSessionEvents.ts",
+ "src/vs/platform/agentHost/node/shared/copilotApiService.ts",
+ "src/vs/platform/agentHost/test/node/agentService.test.ts",
+ "src/vs/platform/agentHost/test/node/agentSideEffects.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeAgent.integrationTest.ts",
+ "src/vs/platform/agentHost/test/node/claudeAgent.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeMapSessionEvents.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeMapSessionEventsTestUtils.ts",
+ "src/vs/platform/agentHost/test/node/claudeProxyService.test.ts",
+ "src/vs/platform/agentHost/test/node/copilotAgent.test.ts",
+ "src/vs/platform/agentHost/test/node/copilotAgentSession.test.ts",
+ "src/vs/platform/agentHost/test/node/copilotGitProject.test.ts",
+ "src/vs/platform/agentHost/test/node/copilotPluginConverters.test.ts",
+ "src/vs/platform/agentHost/test/node/copilotShellTools.test.ts",
+ "src/vs/platform/agentHost/test/node/copilotToolDisplay.test.ts",
+ "src/vs/platform/agentHost/test/node/historyRecordFixtures.test.ts",
+ "src/vs/platform/agentHost/test/node/historyRecordFixtures.ts",
+ "src/vs/platform/agentHost/test/node/shared/copilotApiService.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeFileEditObserver.test.ts",
+ "src/vs/platform/agentHost/test/node/claudePromptQueue.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeReplayMapper.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeSdkMessageRouter.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeSdkPipeline.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeSessionMetadataStore.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeSubagentResolver.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeSubagentSignals.test.ts",
+ "src/vs/platform/agentHost/test/node/anthropicBetas.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeInteractiveTools.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeModelId.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeProxyAuth.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeSubagentRegistry.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeToolDisplay.test.ts",
+ "src/vs/platform/agentHost/test/node/shared/copilotApiService.integrationTest.ts",
+ "src/vs/platform/agentHost/test/node/mapSessionEvents.test.ts",
+ "src/vs/platform/agentHost/test/node/forwardedChatError.test.ts",
+ "src/vs/platform/agentHost/test/node/copilotTestEvents.ts",
+ "src/vs/platform/agentHost/test/node/claudeToolCallRegistry.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeServerToolMcpServer.test.ts",
+ "src/vs/platform/agentHost/test/node/claudeSdkOptions.test.ts",
+ "src/vs/platform/agentHost/test/node/agentSdkDownloader.test.ts",
+ "src/vs/platform/agentHost/test/node/agentHostSessionTitleController.test.ts",
+ "src/vs/platform/agentHost/test/node/agentHostCommitOperationHandler.test.ts",
+ "src/vs/platform/agentHost/node/copilot/prompts/systemMessage.ts",
+ "src/vs/platform/agentHost/test/node/agentHostPromptRegistry.test.ts",
+ "src/vs/platform/agentHost/node/copilot/prompts/anthropicPrompt.ts",
+ "src/vs/platform/agentHost/node/copilot/prompts/allPrompts.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotSystemNotification.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotSessionLauncher.ts",
+ "src/vs/platform/agentHost/node/copilot/copilotBranchNameGenerator.ts",
+ "src/vs/platform/agentHost/node/agentHostCommitOperationHandler.ts",
+ "src/vs/platform/agentHost/node/agentHostCommitOperationProvider.ts",
+ "src/vs/platform/agentHost/test/node/agentHostCommitOperationProvider.test.ts"
+ ]
+ }
+]
diff --git a/patches/53-ext-copilot-remove-it.patch b/patches/53-ext-copilot-remove-it.patch
new file mode 100644
index 00000000000..e1d1fb14c4d
--- /dev/null
+++ b/patches/53-ext-copilot-remove-it.patch
@@ -0,0 +1,1489 @@
+diff --git a/build/gulpfile.reh.ts b/build/gulpfile.reh.ts
+index 62c30da5..8354a843 100644
+--- a/build/gulpfile.reh.ts
++++ b/build/gulpfile.reh.ts
+@@ -25,3 +25,3 @@ import rceditCallback from 'rcedit';
+ import { compileBuildWithManglingTask } from './gulpfile.compile.ts';
+-import { cleanExtensionsBuildTask, compileNonNativeExtensionsBuildTask, compileNativeExtensionsBuildTask, compileExtensionMediaBuildTask, compileCopilotExtensionBuildTask } from './gulpfile.extensions.ts';
++import { cleanExtensionsBuildTask, compileNonNativeExtensionsBuildTask, compileNativeExtensionsBuildTask, compileExtensionMediaBuildTask } from './gulpfile.extensions.ts';
+ import { vscodeWebResourceIncludes, createVSCodeWebFileContentMapper } from './gulpfile.vscode.web.ts';
+@@ -31,3 +31,3 @@ import buildfile from './buildfile.ts';
+ import { fetchUrls, fetchGithub } from './lib/fetch.ts';
+-import { getCopilotExcludeFilter, getCopilotRuntimePrebuildFiles, getCopilotTgrepExcludeFilter, getRipgrepExcludeFilter, prepareBuiltInCopilotRipgrepShim } from './lib/copilot.ts';
++import { getRipgrepExcludeFilter } from './lib/copilot.ts';
+ import { readAgentSdkResults } from './agent-sdk/common.ts';
+@@ -397,6 +397,3 @@ function packageTask(type: string, platform: string, arch: string, sourceFolderN
+ .pipe(util.cleanNodeModules(path.join(import.meta.dirname, `.moduleignore.${process.platform}`)));
+- const copilotRuntimePrebuilds = gulp.src(getCopilotRuntimePrebuildFiles(platform, arch, 'remote/node_modules'), { base: 'remote', dot: true, allowEmpty: true });
+- const deps = es.merge(cleanedDeps, copilotRuntimePrebuilds)
+- .pipe(filter(getCopilotExcludeFilter(platform, arch)))
+- .pipe(filter(getCopilotTgrepExcludeFilter(platform, arch)))
++ const deps = cleanedDeps
+ .pipe(filter(getRipgrepExcludeFilter(platform, arch)))
+@@ -555,12 +552,2 @@ function patchWin32DependenciesTask(destinationFolderName: string) {
+
+-function prepareCopilotRipgrepShimTaskREH(platform: string, arch: string, destinationFolderName: string) {
+- return async () => {
+- const outputDir = path.join(BUILD_ROOT, destinationFolderName);
+- const nodeModulesDir = path.join(outputDir, 'node_modules');
+-
+- const builtInCopilotExtensionDir = path.join(outputDir, 'extensions', 'copilot');
+- prepareBuiltInCopilotRipgrepShim(platform, arch, builtInCopilotExtensionDir, nodeModulesDir);
+- };
+-}
+-
+ /**
+@@ -614,3 +601,2 @@ function tweakProductForServerWeb(product: typeof import('../product.json')) {
+ packageTask(type, platform, arch, sourceFolderName, destinationFolderName),
+- prepareCopilotRipgrepShimTaskREH(platform, arch, destinationFolderName)
+ ];
+@@ -628,3 +614,2 @@ function tweakProductForServerWeb(product: typeof import('../product.json')) {
+ compileNonNativeExtensionsBuildTask,
+- compileCopilotExtensionBuildTask,
+ compileExtensionMediaBuildTask,
+diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
+index b897c6c6..97e316a3 100644
+--- a/build/gulpfile.vscode.ts
++++ b/build/gulpfile.vscode.ts
+@@ -28,5 +28,5 @@ import minimist from 'minimist';
+ import { compileBuildWithoutManglingTask } from './gulpfile.compile.ts';
+-import { compileNonNativeExtensionsBuildTask, compileNativeExtensionsBuildTask, compileAllExtensionsBuildTask, compileExtensionMediaBuildTask, cleanExtensionsBuildTask, compileCopilotExtensionBuildTask } from './gulpfile.extensions.ts';
++import { compileNonNativeExtensionsBuildTask, compileNativeExtensionsBuildTask, compileAllExtensionsBuildTask, compileExtensionMediaBuildTask, cleanExtensionsBuildTask } from './gulpfile.extensions.ts';
+ import { copyCodiconsTask } from './lib/compilation.ts';
+-import { getCopilotExcludeFilter, getCopilotRuntimePrebuildFiles, getCopilotTgrepExcludeFilter, getRipgrepExcludeFilter, prepareBuiltInCopilotRipgrepShim } from './lib/copilot.ts';
++import { getRipgrepExcludeFilter } from './lib/copilot.ts';
+ import { readAgentSdkResults } from './agent-sdk/common.ts';
+@@ -342,6 +342,3 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
+ .pipe(util.cleanNodeModules(path.join(import.meta.dirname, `.moduleignore.${process.platform}`)));
+- const copilotRuntimePrebuilds = gulp.src(getCopilotRuntimePrebuildFiles(platform, arch), { base: '.', dot: true, allowEmpty: true });
+- const deps = es.merge(cleanedDeps, copilotRuntimePrebuilds)
+- .pipe(filter(getCopilotExcludeFilter(platform, arch)))
+- .pipe(filter(getCopilotTgrepExcludeFilter(platform, arch)))
++ const deps = cleanedDeps
+ .pipe(filter(getRipgrepExcludeFilter(platform, arch)))
+@@ -603,19 +600,2 @@ function patchWin32DependenciesTask(destinationFolderName: string) {
+
+-function prepareCopilotRipgrepShimTask(platform: string, arch: string, destinationFolderName: string) {
+- const outputDir = path.join(path.dirname(root), destinationFolderName);
+-
+- return async () => {
+- // On Windows with win32VersionedUpdate, app resources live under a
+- // commit-hash prefix: {output}/{commitHash}/resources/app/
+- const versionedResourcesFolder = util.getVersionedResourcesFolder(platform, commit!);
+- const appBase = platform === 'darwin'
+- ? path.join(outputDir, `${product.nameLong}.app`, 'Contents', 'Resources', 'app')
+- : path.join(outputDir, versionedResourcesFolder, 'resources', 'app');
+- const appNodeModulesDir = path.join(appBase, 'node_modules');
+-
+- const builtInCopilotExtensionDir = path.join(appBase, 'extensions', 'copilot');
+- prepareBuiltInCopilotRipgrepShim(platform, arch, builtInCopilotExtensionDir, appNodeModulesDir);
+- };
+-}
+-
+ const buildRoot = path.dirname(root);
+@@ -645,3 +625,2 @@ BUILD_TARGETS.forEach(buildTarget => {
+ packageTask(platform, arch, sourceFolderName, destinationFolderName, opts),
+- prepareCopilotRipgrepShimTask(platform, arch, destinationFolderName)
+ ];
+@@ -656,2 +635,3 @@ BUILD_TARGETS.forEach(buildTarget => {
+ let vscodeTask: task.Task;
++
+ if (useEsbuildTranspile) {
+@@ -693,3 +673,2 @@ BUILD_TARGETS.forEach(buildTarget => {
+ compileNonNativeExtensionsBuildTask,
+- compileCopilotExtensionBuildTask,
+ compileExtensionMediaBuildTask,
+@@ -709,2 +688,3 @@ BUILD_TARGETS.forEach(buildTarget => {
+ }
++
+ task.task(vscodeTask);
+diff --git a/build/npm/dirs.ts b/build/npm/dirs.ts
+index 289a4697..8c6df6f7 100644
+--- a/build/npm/dirs.ts
++++ b/build/npm/dirs.ts
+@@ -17,3 +17,2 @@ export const dirs = [
+ 'extensions/configuration-editing',
+- 'extensions/copilot',
+ 'extensions/css-language-features',
+diff --git a/build/npm/postinstall.ts b/build/npm/postinstall.ts
+index 0d00ac39..23e23c05 100644
+--- a/build/npm/postinstall.ts
++++ b/build/npm/postinstall.ts
+@@ -320,33 +320,2 @@ async function main() {
+ fs.writeFileSync(stateContentsFile, JSON.stringify(computeContents()));
+-
+- // Symlink .claude/ files to their canonical locations to test Claude agent harness
+- const claudeDir = path.join(root, '.claude');
+- fs.mkdirSync(claudeDir, { recursive: true });
+-
+- const claudeMdLink = path.join(claudeDir, 'CLAUDE.md');
+- const claudeMdLinkType = ensureAgentHarnessLink(path.join('..', '.github', 'copilot-instructions.md'), claudeMdLink);
+- if (claudeMdLinkType !== 'existing') {
+- log('.', `Created ${claudeMdLinkType} .claude/CLAUDE.md -> .github/copilot-instructions.md`);
+- }
+-
+- const claudeSkillsLink = path.join(claudeDir, 'skills');
+- const claudeSkillsLinkType = ensureAgentHarnessLink(path.join('..', '.agents', 'skills'), claudeSkillsLink);
+- if (claudeSkillsLinkType !== 'existing') {
+- log('.', `Created ${claudeSkillsLinkType} .claude/skills -> .agents/skills`);
+- }
+-
+- // Temporary: patch @github/copilot-sdk session.js to fix ESM import
+- // (missing .js extension on vscode-jsonrpc/node). Fixed upstream in v0.1.32.
+- // TODO: Remove once @github/copilot-sdk is updated to >=0.1.32
+- for (const dir of ['', 'remote']) {
+- const sessionFile = path.join(root, dir, 'node_modules', '@github', 'copilot-sdk', 'dist', 'session.js');
+- if (fs.existsSync(sessionFile)) {
+- const content = fs.readFileSync(sessionFile, 'utf8');
+- const patched = content.replace(/from "vscode-jsonrpc\/node"/g, 'from "vscode-jsonrpc/node.js"');
+- if (content !== patched) {
+- fs.writeFileSync(sessionFile, patched);
+- log(dir || '.', 'Patched @github/copilot-sdk session.js (vscode-jsonrpc ESM import fix)');
+- }
+- }
+- }
+ }
+diff --git a/package-lock.json b/package-lock.json
+index 81d315f0..81314f3a 100644
+--- a/package-lock.json
++++ b/package-lock.json
+@@ -12,5 +12,2 @@
+ "dependencies": {
+- "@anthropic-ai/sdk": "^0.82.0",
+- "@github/copilot": "^1.0.64-0",
+- "@github/copilot-sdk": "^1.0.2",
+ "@microsoft/1ds-core-js": "^3.2.13",
+@@ -323,22 +320,2 @@
+ },
+- "node_modules/@anthropic-ai/sdk": {
+- "version": "0.82.0",
+- "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.82.0.tgz",
+- "integrity": "sha512-xdHTjL1GlUlDugHq/I47qdOKp/ROPvuHl7ROJCgUQigbvPu7asf9KcAcU1EqdrP2LuVhEKaTs7Z+ShpZDRzHdQ==",
+- "license": "MIT",
+- "dependencies": {
+- "json-schema-to-ts": "^3.1.1"
+- },
+- "bin": {
+- "anthropic-ai-sdk": "bin/cli"
+- },
+- "peerDependencies": {
+- "zod": "^3.25.0 || ^4.0.0"
+- },
+- "peerDependenciesMeta": {
+- "zod": {
+- "optional": true
+- }
+- }
+- },
+ "node_modules/@azure-rest/ai-translation-text": {
+@@ -850,11 +827,2 @@
+ },
+- "node_modules/@babel/runtime": {
+- "version": "7.29.2",
+- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+- "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+- "license": "MIT",
+- "engines": {
+- "node": ">=6.9.0"
+- }
+- },
+ "node_modules/@babel/template": {
+@@ -1086,188 +1054,2 @@
+ },
+- "node_modules/@github/copilot": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.64-0.tgz",
+- "integrity": "sha512-PlH7ByBHjmPLqLXS4CE2q8hN6CFEfkCMV6ScBEzW/u73+KYQB4fGNouo8Lr8okL6D5CW5rzPJbsXyISyJqVOZg==",
+- "license": "SEE LICENSE IN LICENSE.md",
+- "dependencies": {
+- "detect-libc": "^2.1.2",
+- "os-theme": "^0.0.8"
+- },
+- "bin": {
+- "copilot": "npm-loader.js"
+- },
+- "optionalDependencies": {
+- "@github/copilot-darwin-arm64": "1.0.64-0",
+- "@github/copilot-darwin-x64": "1.0.64-0",
+- "@github/copilot-linux-arm64": "1.0.64-0",
+- "@github/copilot-linux-x64": "1.0.64-0",
+- "@github/copilot-linuxmusl-arm64": "1.0.64-0",
+- "@github/copilot-linuxmusl-x64": "1.0.64-0",
+- "@github/copilot-win32-arm64": "1.0.64-0",
+- "@github/copilot-win32-x64": "1.0.64-0"
+- }
+- },
+- "node_modules/@github/copilot-darwin-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-97DUGiuYrkCYOlSSLWMmr+K0uGzAxz1JOL/GyO/7mNl6V/1xgs6Van1Jj+Dpj4ly96iHE8lUIW8cQNCG66644g==",
+- "cpu": [
+- "arm64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "darwin"
+- ],
+- "bin": {
+- "copilot-darwin-arm64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-darwin-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.64-0.tgz",
+- "integrity": "sha512-2PXY4mSFtIjFdRaAt8PakegRgGtf6Sz9z6U/dIgVygNfctVNzaL5FH65PNPm8Y80jaDvEcz1/XY5MiQtxnlzZQ==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "darwin"
+- ],
+- "bin": {
+- "copilot-darwin-x64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linux-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-PLP+vR508fOTlCr9CSZiXi9geicHKXuX9jLGdwNqK2TMZO5TqCLz8wP7dBEmkdkeXcFKovMb8nQVB1Toc6xutw==",
+- "cpu": [
+- "arm64"
+- ],
+- "libc": [
+- "glibc"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linux-arm64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linux-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.64-0.tgz",
+- "integrity": "sha512-NvVjQ69zr390ijzo2f75+v0DHm6xnvPbi67ugnKDk7ZPbx8P3vSxVdAnrzrrL4T3T8ng3pJANcC4p+eGbx+UDw==",
+- "cpu": [
+- "x64"
+- ],
+- "libc": [
+- "glibc"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linux-x64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linuxmusl-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-qCnVF5vIcTO74CukAENZo8e5nqXm4QUshuKN69aiZb5GOhVvyyIKsf5Jo7ikZt54jJBHycAMUKlTA8L3/nK+KA==",
+- "cpu": [
+- "arm64"
+- ],
+- "libc": [
+- "musl"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linuxmusl-arm64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linuxmusl-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.64-0.tgz",
+- "integrity": "sha512-WDBEmkBk1RulTfdLK5IuttNBadjLOBpvQyonGQ/aLeaetRNNdapoygrSjFU7q1QBSenmCyanXH6D+TS7tP3Qsw==",
+- "cpu": [
+- "x64"
+- ],
+- "libc": [
+- "musl"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linuxmusl-x64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-sdk": {
+- "version": "1.0.2",
+- "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-1.0.2.tgz",
+- "integrity": "sha512-JJDsGM/bA1LGy1Ro/8iC8RLpKsLmuiFdQ67oFAVfi0Hfxyx289teHwmM70ehK76DXBkrPqqcxcliJi56k1ggFA==",
+- "license": "MIT",
+- "dependencies": {
+- "@github/copilot": "^1.0.64-0",
+- "vscode-jsonrpc": "^8.2.1",
+- "zod": "^4.3.6"
+- },
+- "engines": {
+- "node": "^20.19.0 || >=22.12.0"
+- }
+- },
+- "node_modules/@github/copilot-sdk/node_modules/zod": {
+- "version": "4.4.3",
+- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+- "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
+- "license": "MIT",
+- "funding": {
+- "url": "https://github.com/sponsors/colinhacks"
+- }
+- },
+- "node_modules/@github/copilot-win32-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-PC7yuUKcVbhli4bpzWFVT3juxj+v/iONazetNe3tMpHWza3W7MeFRifzAseSErKQCt2fHJth3m8bQAwFN2jfrA==",
+- "cpu": [
+- "arm64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "win32"
+- ],
+- "bin": {
+- "copilot-win32-arm64": "copilot.exe"
+- }
+- },
+- "node_modules/@github/copilot-win32-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.64-0.tgz",
+- "integrity": "sha512-d2fnUTIlqNxCqS2PuV+FD99ZOYBaX72OLtAmphbKyz36KyZ6D4ssiu8M4vHVTKWWdyc3TWiLsnIB+ryWdv1gGw==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "win32"
+- ],
+- "bin": {
+- "copilot-win32-x64": "copilot.exe"
+- }
+- },
+ "node_modules/@gulp-sourcemaps/identity-map": {
+@@ -2343,41 +2125,2 @@
+ },
+- "node_modules/@os-theme/darwin-arm64": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/@os-theme/darwin-arm64/-/darwin-arm64-0.0.8.tgz",
+- "integrity": "sha512-gMsOs+8Ju396a5yyMWigkbA0dMTxD78U3HzG3mlpiAyn6hfd5dbyI4VGP+sfTB82KGgWLzIhWWTFX5UYY6iX0A==",
+- "cpu": [
+- "arm64"
+- ],
+- "license": "MIT",
+- "optional": true,
+- "os": [
+- "darwin"
+- ]
+- },
+- "node_modules/@os-theme/linux-x64": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/@os-theme/linux-x64/-/linux-x64-0.0.8.tgz",
+- "integrity": "sha512-zvjmBUiSQPjM1RbhpsfCDYMJxW4eLlGmkFPnpteC/03X2lz6CjiX2hfbN2EWLxXjNnIje3Jqaen8IsqEnWrRBg==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "MIT",
+- "optional": true,
+- "os": [
+- "linux"
+- ]
+- },
+- "node_modules/@os-theme/win32-x64": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/@os-theme/win32-x64/-/win32-x64-0.0.8.tgz",
+- "integrity": "sha512-N3yxKNbVl2IBa/ncDuq55QhwqwUjnYLJxDKMEmYeJbLIV950qZNojPw3scXA6PbfxPZfIiRa8iz1pzNg9XxP8w==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "MIT",
+- "optional": true,
+- "os": [
+- "win32"
+- ]
+- },
+ "node_modules/@parcel/watcher": {
+@@ -12711,15 +12454,2 @@
+ },
+- "node_modules/json-schema-to-ts": {
+- "version": "3.1.1",
+- "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz",
+- "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==",
+- "license": "MIT",
+- "dependencies": {
+- "@babel/runtime": "^7.18.3",
+- "ts-algebra": "^2.0.0"
+- },
+- "engines": {
+- "node": ">=16"
+- }
+- },
+ "node_modules/json-schema-traverse": {
+@@ -15030,16 +14760,2 @@
+ },
+- "node_modules/os-theme": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/os-theme/-/os-theme-0.0.8.tgz",
+- "integrity": "sha512-u1q3bLSv5uMHNIiPItkfDrHXu6ZFs2juwqxWREFM/uVBa+7Kkhy2v49LmJev2JcinGwqiEccElB/XsH9gwasuA==",
+- "license": "MIT",
+- "optionalDependencies": {
+- "@os-theme/darwin-arm64": "0.0.8",
+- "@os-theme/linux-x64": "0.0.8",
+- "@os-theme/win32-x64": "0.0.8"
+- },
+- "peerDependencies": {
+- "typescript": "^5"
+- }
+- },
+ "node_modules/os-tmpdir": {
+@@ -18557,8 +18273,2 @@
+ },
+- "node_modules/ts-algebra": {
+- "version": "2.0.0",
+- "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz",
+- "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==",
+- "license": "MIT"
+- },
+ "node_modules/ts-api-utils": {
+@@ -19581,11 +19291,2 @@
+ },
+- "node_modules/vscode-jsonrpc": {
+- "version": "8.2.1",
+- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz",
+- "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==",
+- "license": "MIT",
+- "engines": {
+- "node": ">=14.0.0"
+- }
+- },
+ "node_modules/vscode-oniguruma": {
+diff --git a/package.json b/package.json
+index 36485330..e719f70f 100644
+--- a/package.json
++++ b/package.json
+@@ -28,4 +28,4 @@
+ "codex:gen-protocol": "node build/codex/generate-protocol.mjs",
+- "watch": "npm-run-all2 -lp watch-client-transpile watch-client watch-extensions watch-copilot",
+- "watch-transpile": "npm-run-all2 -lp watch-client-transpile watch-extensions watch-copilot",
++ "watch": "npm-run-all2 -lp watch-client-transpile watch-client watch-extensions",
++ "watch-transpile": "npm-run-all2 -lp watch-client-transpile watch-extensions",
+ "watchd": "deemon npm run watch",
+@@ -46,5 +46,2 @@
+ "kill-watch-extensionsd": "deemon --kill npm run watch-extensions",
+- "watch-copilot": "npm --prefix extensions/copilot run watch",
+- "watch-copilotd": "deemon npm run watch-copilot",
+- "kill-watch-copilotd": "deemon --kill npm run watch-copilot",
+ "precommit": "node --experimental-strip-types build/hygiene.ts",
+@@ -88,4 +85,2 @@
+ "perf:chat-leak": "node scripts/chat-simulation/test-chat-mem-leaks.js",
+- "copilot:setup": "npm --prefix extensions/copilot run setup",
+- "copilot:get_token": "npm --prefix extensions/copilot run get_token",
+ "update-build-ts-version": "npm install -D typescript@next && npm install -D @typescript/native-preview && (cd build && npm run typecheck)",
+@@ -96,5 +91,2 @@
+ "dependencies": {
+- "@anthropic-ai/sdk": "^0.82.0",
+- "@github/copilot": "^1.0.64-0",
+- "@github/copilot-sdk": "^1.0.2",
+ "@microsoft/1ds-core-js": "^3.2.13",
+diff --git a/remote/package-lock.json b/remote/package-lock.json
+index a829c6d5..791019b4 100644
+--- a/remote/package-lock.json
++++ b/remote/package-lock.json
+@@ -10,4 +10,2 @@
+ "dependencies": {
+- "@github/copilot": "^1.0.64-0",
+- "@github/copilot-sdk": "^1.0.2",
+ "@microsoft/1ds-core-js": "^3.2.13",
+@@ -61,188 +59,2 @@
+ },
+- "node_modules/@github/copilot": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.64-0.tgz",
+- "integrity": "sha512-PlH7ByBHjmPLqLXS4CE2q8hN6CFEfkCMV6ScBEzW/u73+KYQB4fGNouo8Lr8okL6D5CW5rzPJbsXyISyJqVOZg==",
+- "license": "SEE LICENSE IN LICENSE.md",
+- "dependencies": {
+- "detect-libc": "^2.1.2",
+- "os-theme": "^0.0.8"
+- },
+- "bin": {
+- "copilot": "npm-loader.js"
+- },
+- "optionalDependencies": {
+- "@github/copilot-darwin-arm64": "1.0.64-0",
+- "@github/copilot-darwin-x64": "1.0.64-0",
+- "@github/copilot-linux-arm64": "1.0.64-0",
+- "@github/copilot-linux-x64": "1.0.64-0",
+- "@github/copilot-linuxmusl-arm64": "1.0.64-0",
+- "@github/copilot-linuxmusl-x64": "1.0.64-0",
+- "@github/copilot-win32-arm64": "1.0.64-0",
+- "@github/copilot-win32-x64": "1.0.64-0"
+- }
+- },
+- "node_modules/@github/copilot-darwin-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-97DUGiuYrkCYOlSSLWMmr+K0uGzAxz1JOL/GyO/7mNl6V/1xgs6Van1Jj+Dpj4ly96iHE8lUIW8cQNCG66644g==",
+- "cpu": [
+- "arm64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "darwin"
+- ],
+- "bin": {
+- "copilot-darwin-arm64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-darwin-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.64-0.tgz",
+- "integrity": "sha512-2PXY4mSFtIjFdRaAt8PakegRgGtf6Sz9z6U/dIgVygNfctVNzaL5FH65PNPm8Y80jaDvEcz1/XY5MiQtxnlzZQ==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "darwin"
+- ],
+- "bin": {
+- "copilot-darwin-x64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linux-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-PLP+vR508fOTlCr9CSZiXi9geicHKXuX9jLGdwNqK2TMZO5TqCLz8wP7dBEmkdkeXcFKovMb8nQVB1Toc6xutw==",
+- "cpu": [
+- "arm64"
+- ],
+- "libc": [
+- "glibc"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linux-arm64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linux-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.64-0.tgz",
+- "integrity": "sha512-NvVjQ69zr390ijzo2f75+v0DHm6xnvPbi67ugnKDk7ZPbx8P3vSxVdAnrzrrL4T3T8ng3pJANcC4p+eGbx+UDw==",
+- "cpu": [
+- "x64"
+- ],
+- "libc": [
+- "glibc"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linux-x64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linuxmusl-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-qCnVF5vIcTO74CukAENZo8e5nqXm4QUshuKN69aiZb5GOhVvyyIKsf5Jo7ikZt54jJBHycAMUKlTA8L3/nK+KA==",
+- "cpu": [
+- "arm64"
+- ],
+- "libc": [
+- "musl"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linuxmusl-arm64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-linuxmusl-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.64-0.tgz",
+- "integrity": "sha512-WDBEmkBk1RulTfdLK5IuttNBadjLOBpvQyonGQ/aLeaetRNNdapoygrSjFU7q1QBSenmCyanXH6D+TS7tP3Qsw==",
+- "cpu": [
+- "x64"
+- ],
+- "libc": [
+- "musl"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "linux"
+- ],
+- "bin": {
+- "copilot-linuxmusl-x64": "copilot"
+- }
+- },
+- "node_modules/@github/copilot-sdk": {
+- "version": "1.0.2",
+- "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-1.0.2.tgz",
+- "integrity": "sha512-JJDsGM/bA1LGy1Ro/8iC8RLpKsLmuiFdQ67oFAVfi0Hfxyx289teHwmM70ehK76DXBkrPqqcxcliJi56k1ggFA==",
+- "license": "MIT",
+- "dependencies": {
+- "@github/copilot": "^1.0.64-0",
+- "vscode-jsonrpc": "^8.2.1",
+- "zod": "^4.3.6"
+- },
+- "engines": {
+- "node": "^20.19.0 || >=22.12.0"
+- }
+- },
+- "node_modules/@github/copilot-sdk/node_modules/zod": {
+- "version": "4.4.3",
+- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+- "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
+- "license": "MIT",
+- "funding": {
+- "url": "https://github.com/sponsors/colinhacks"
+- }
+- },
+- "node_modules/@github/copilot-win32-arm64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.64-0.tgz",
+- "integrity": "sha512-PC7yuUKcVbhli4bpzWFVT3juxj+v/iONazetNe3tMpHWza3W7MeFRifzAseSErKQCt2fHJth3m8bQAwFN2jfrA==",
+- "cpu": [
+- "arm64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "win32"
+- ],
+- "bin": {
+- "copilot-win32-arm64": "copilot.exe"
+- }
+- },
+- "node_modules/@github/copilot-win32-x64": {
+- "version": "1.0.64-0",
+- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.64-0.tgz",
+- "integrity": "sha512-d2fnUTIlqNxCqS2PuV+FD99ZOYBaX72OLtAmphbKyz36KyZ6D4ssiu8M4vHVTKWWdyc3TWiLsnIB+ryWdv1gGw==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "SEE LICENSE IN LICENSE.md",
+- "optional": true,
+- "os": [
+- "win32"
+- ],
+- "bin": {
+- "copilot-win32-x64": "copilot.exe"
+- }
+- },
+ "node_modules/@isaacs/fs-minipass": {
+@@ -314,41 +126,2 @@
+ },
+- "node_modules/@os-theme/darwin-arm64": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/@os-theme/darwin-arm64/-/darwin-arm64-0.0.8.tgz",
+- "integrity": "sha512-gMsOs+8Ju396a5yyMWigkbA0dMTxD78U3HzG3mlpiAyn6hfd5dbyI4VGP+sfTB82KGgWLzIhWWTFX5UYY6iX0A==",
+- "cpu": [
+- "arm64"
+- ],
+- "license": "MIT",
+- "optional": true,
+- "os": [
+- "darwin"
+- ]
+- },
+- "node_modules/@os-theme/linux-x64": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/@os-theme/linux-x64/-/linux-x64-0.0.8.tgz",
+- "integrity": "sha512-zvjmBUiSQPjM1RbhpsfCDYMJxW4eLlGmkFPnpteC/03X2lz6CjiX2hfbN2EWLxXjNnIje3Jqaen8IsqEnWrRBg==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "MIT",
+- "optional": true,
+- "os": [
+- "linux"
+- ]
+- },
+- "node_modules/@os-theme/win32-x64": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/@os-theme/win32-x64/-/win32-x64-0.0.8.tgz",
+- "integrity": "sha512-N3yxKNbVl2IBa/ncDuq55QhwqwUjnYLJxDKMEmYeJbLIV950qZNojPw3scXA6PbfxPZfIiRa8iz1pzNg9XxP8w==",
+- "cpu": [
+- "x64"
+- ],
+- "license": "MIT",
+- "optional": true,
+- "os": [
+- "win32"
+- ]
+- },
+ "node_modules/@parcel/watcher": {
+@@ -1445,16 +1218,2 @@
+ },
+- "node_modules/os-theme": {
+- "version": "0.0.8",
+- "resolved": "https://registry.npmjs.org/os-theme/-/os-theme-0.0.8.tgz",
+- "integrity": "sha512-u1q3bLSv5uMHNIiPItkfDrHXu6ZFs2juwqxWREFM/uVBa+7Kkhy2v49LmJev2JcinGwqiEccElB/XsH9gwasuA==",
+- "license": "MIT",
+- "optionalDependencies": {
+- "@os-theme/darwin-arm64": "0.0.8",
+- "@os-theme/linux-x64": "0.0.8",
+- "@os-theme/win32-x64": "0.0.8"
+- },
+- "peerDependencies": {
+- "typescript": "^5"
+- }
+- },
+ "node_modules/pend": {
+@@ -1823,11 +1582,2 @@
+ },
+- "node_modules/vscode-jsonrpc": {
+- "version": "8.2.1",
+- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz",
+- "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==",
+- "license": "MIT",
+- "engines": {
+- "node": ">=14.0.0"
+- }
+- },
+ "node_modules/vscode-oniguruma": {
+diff --git a/remote/package.json b/remote/package.json
+index 879eb7d6..d77adbea 100644
+--- a/remote/package.json
++++ b/remote/package.json
+@@ -5,4 +5,2 @@
+ "dependencies": {
+- "@github/copilot": "^1.0.64-0",
+- "@github/copilot-sdk": "^1.0.2",
+ "@microsoft/1ds-core-js": "^3.2.13",
+diff --git a/src/vs/platform/agentHost/common/otel/agentHostOTelService.ts b/src/vs/platform/agentHost/common/otel/agentHostOTelService.ts
+index 667e3bc8..be71e31a 100644
+--- a/src/vs/platform/agentHost/common/otel/agentHostOTelService.ts
++++ b/src/vs/platform/agentHost/common/otel/agentHostOTelService.ts
+@@ -5,3 +5,2 @@
+
+-import type { TelemetryConfig } from '@github/copilot-sdk';
+ import type { URI } from '../../../../base/common/uri.js';
+@@ -26,9 +25,2 @@ export interface IAgentHostOTelService {
+
+- /**
+- * Returns the telemetry config to hand to `new CopilotClient({ telemetry })`,
+- * starting the loopback receiver + store on first call when in DB mode.
+- * Resolves to `undefined` when telemetry is disabled.
+- */
+- getSdkTelemetryConfig(): Promise;
+-
+ /**
+diff --git a/src/vs/platform/agentHost/node/agentHostChangesetOperationService.ts b/src/vs/platform/agentHost/node/agentHostChangesetOperationService.ts
+index 1cba4ca9..27e94912 100644
+--- a/src/vs/platform/agentHost/node/agentHostChangesetOperationService.ts
++++ b/src/vs/platform/agentHost/node/agentHostChangesetOperationService.ts
+@@ -19,3 +19,2 @@ import { IInstantiationService } from '../../instantiation/common/instantiation.
+ import { AgentHostPullRequestOperationContribution } from './agentHostPullRequestOperationProvider.js';
+-import { AgentHostCommitOperationContribution } from './agentHostCommitOperationProvider.js';
+ import { AgentHostDiscardChangesOperationContribution } from './agentHostDiscardChangesOperationProvider.js';
+@@ -44,3 +43,2 @@ export class AgentHostChangesetOperationService extends Disposable implements IA
+ this._register(this.registerContribution(instantiationService.createInstance(AgentHostPullRequestOperationContribution, this._stateManager)));
+- this._register(this.registerContribution(instantiationService.createInstance(AgentHostCommitOperationContribution, this._stateManager)));
+ this._register(this.registerContribution(instantiationService.createInstance(AgentHostDiscardChangesOperationContribution, this._stateManager)));
+diff --git a/src/vs/platform/agentHost/node/agentHostMain.ts b/src/vs/platform/agentHost/node/agentHostMain.ts
+index 0dd36914..8c6e8585 100644
+--- a/src/vs/platform/agentHost/node/agentHostMain.ts
++++ b/src/vs/platform/agentHost/node/agentHostMain.ts
+@@ -17,3 +17,3 @@ import * as os from 'os';
+ import * as inspector from 'inspector';
+-import { AgentHostClaudeAgentEnabledEnvVar, AgentHostCodexAgentEnabledEnvVar, AgentHostIpcChannels, IAgentHostInspectInfo, IAgentHostSocketInfo, IAgentService, IConnectionTrackerService, isAgentEnabled } from '../common/agentService.js';
++import { AgentHostIpcChannels, IAgentHostInspectInfo, IAgentHostSocketInfo, IAgentService, IConnectionTrackerService } from '../common/agentService.js';
+ import { AgentService } from './agentService.js';
+@@ -22,13 +22,3 @@ import { IAgentHostCompletions } from './agentHostCompletions.js';
+ import { IAgentHostTerminalManager } from './agentHostTerminalManager.js';
+-import { CopilotAgent } from './copilot/copilotAgent.js';
+-import { CopilotBranchNameGenerator, ICopilotBranchNameGenerator } from './copilot/copilotBranchNameGenerator.js';
+-import { CopilotApiService, ICopilotApiService } from './shared/copilotApiService.js';
+-import { ClaudeAgent } from './claude/claudeAgent.js';
+-import { ClaudeAgentSdkService, ClaudeSdkPackage, IClaudeAgentSdkService } from './claude/claudeAgentSdkService.js';
+-import { ClaudeProxyService, IClaudeProxyService } from './claude/claudeProxyService.js';
+-import { CodexAgent, CodexSdkPackage } from './codex/codexAgent.js';
+-import { CodexProxyService, ICodexProxyService } from './codex/codexProxyService.js';
+ import { AgentSdkDownloader, IAgentSdkDownloader } from './agentSdkDownloader.js';
+-import { IAgentHostOTelService } from '../common/otel/agentHostOTelService.js';
+-import { AgentHostOTelService } from './otel/agentHostOTelService.js';
+ import { ProtocolServerHandler } from './protocolServerHandler.js';
+@@ -164,13 +154,2 @@ async function startAgentHost(): Promise {
+ diServices.set(IAgentSdkDownloader, agentSdkDownloader);
+- const copilotApiService = instantiationService.createInstance(CopilotApiService, undefined);
+- diServices.set(ICopilotApiService, copilotApiService);
+- diServices.set(ICopilotBranchNameGenerator, instantiationService.createInstance(CopilotBranchNameGenerator));
+- const claudeProxyService = disposables.add(instantiationService.createInstance(ClaudeProxyService));
+- diServices.set(IClaudeProxyService, claudeProxyService);
+- const claudeAgentSdkService = instantiationService.createInstance(ClaudeAgentSdkService);
+- diServices.set(IClaudeAgentSdkService, claudeAgentSdkService);
+- const codexProxyService = disposables.add(instantiationService.createInstance(CodexProxyService));
+- diServices.set(ICodexProxyService, codexProxyService);
+- const agentHostOTelService = disposables.add(instantiationService.createInstance(AgentHostOTelService));
+- diServices.set(IAgentHostOTelService, agentHostOTelService);
+ agentService = new AgentService(logService, fileService, sessionDataService, productService, gitService, checkpointService, rootConfigResource, telemetryService, fileMonitorService);
+@@ -186,21 +165,2 @@ async function startAgentHost(): Promise {
+ diServices.set(IAgentHostCompletions, agentService.completionsService);
+- agentService.registerProvider(instantiationService.createInstance(CopilotAgent));
+- // Claude and Codex providers are gated on two things:
+- // 1. The user-facing enable toggle (`chat.agentHost.Agent.enabled`,
+- // forwarded as an env var by the starters). Claude defaults to on,
+- // Codex defaults to off.
+- // 2. The SDK being reachable. Claude is a devDependency of this repo
+- // so the bare-import path in `ClaudeAgentSdkService._loadSdk`
+- // always succeeds in dev; in built products the SDK ships via
+- // `product.agentSdks.claude` and the downloader handles it. Codex
+- // has no equivalent dev path yet, so it still requires either the
+- // env-var override or a `product.agentSdks.codex` entry.
+- // If either gate fails, the provider is not registered and never appears
+- // in the agent picker (matches the pre-CDN UX exactly).
+- if (isAgentEnabled(process.env[AgentHostClaudeAgentEnabledEnvVar], true) && (!environmentService.isBuilt || agentSdkDownloader.isAvailable(ClaudeSdkPackage))) {
+- agentService.registerProvider(instantiationService.createInstance(ClaudeAgent));
+- }
+- if (isAgentEnabled(process.env[AgentHostCodexAgentEnabledEnvVar], false) && agentSdkDownloader.isAvailable(CodexSdkPackage)) {
+- agentService.registerProvider(instantiationService.createInstance(CodexAgent));
+- }
+ } catch (err) {
+diff --git a/src/vs/platform/agentHost/node/agentHostServerMain.ts b/src/vs/platform/agentHost/node/agentHostServerMain.ts
+index 5c428d75..95d12fe4 100644
+--- a/src/vs/platform/agentHost/node/agentHostServerMain.ts
++++ b/src/vs/platform/agentHost/node/agentHostServerMain.ts
+@@ -35,15 +35,4 @@ import { ServiceCollection } from '../../instantiation/common/serviceCollection.
+ import { registerAgentHostNetworkServices } from './agentHostBootstrap.js';
+-import { CopilotAgent } from './copilot/copilotAgent.js';
+-import { CopilotBranchNameGenerator, ICopilotBranchNameGenerator } from './copilot/copilotBranchNameGenerator.js';
+-import { CopilotApiService, ICopilotApiService } from './shared/copilotApiService.js';
+-import { ClaudeAgent } from './claude/claudeAgent.js';
+-import { ClaudeAgentSdkService, ClaudeSdkPackage, IClaudeAgentSdkService } from './claude/claudeAgentSdkService.js';
+-import { ClaudeProxyService, IClaudeProxyService } from './claude/claudeProxyService.js';
+-import { CodexAgent, CodexSdkPackage } from './codex/codexAgent.js';
+-import { CodexProxyService, ICodexProxyService } from './codex/codexProxyService.js';
+-import { AgentSdkDownloader, IAgentSdkDownloader } from './agentSdkDownloader.js';
+-import { IAgentHostOTelService } from '../common/otel/agentHostOTelService.js';
+-import { AgentHostOTelService } from './otel/agentHostOTelService.js';
+ import { AgentService } from './agentService.js';
+-import { AgentHostClaudeAgentEnabledEnvVar, AgentHostClaudeSdkRootEnvVar, AgentHostCodexAgentEnabledEnvVar, IAgentService, AgentHostCodexAgentSdkRootEnvVar, isAgentEnabled } from '../common/agentService.js';
++import { AgentHostClaudeSdkRootEnvVar, IAgentService, AgentHostCodexAgentSdkRootEnvVar } from '../common/agentService.js';
+ import { IAgentConfigurationService } from './agentConfigurationService.js';
+@@ -260,50 +249,2 @@ async function main(): Promise {
+ diServices.set(IAgentHostGitService, gitService);
+- // Register `ICopilotApiService` BEFORE `IClaudeProxyService` —
+- // the proxy service constructor requires it.
+- const copilotApiService = instantiationService.createInstance(CopilotApiService, undefined);
+- diServices.set(ICopilotApiService, copilotApiService);
+- diServices.set(ICopilotBranchNameGenerator, instantiationService.createInstance(CopilotBranchNameGenerator));
+- // CLI flags become env vars BEFORE the downloader is constructed so
+- // `isAvailable()` and `loadSdkRoot()` see them as dev overrides.
+- if (options.claudeSdkRoot) {
+- process.env[AgentHostClaudeSdkRootEnvVar] = options.claudeSdkRoot;
+- }
+- if (options.codexSdkRoot) {
+- process.env[AgentHostCodexAgentSdkRootEnvVar] = options.codexSdkRoot;
+- }
+- // Register the agent SDK downloader BEFORE any service that injects it.
+- const agentSdkDownloader = instantiationService.createInstance(AgentSdkDownloader);
+- diServices.set(IAgentSdkDownloader, agentSdkDownloader);
+- const claudeProxyService = disposables.add(instantiationService.createInstance(ClaudeProxyService));
+- diServices.set(IClaudeProxyService, claudeProxyService);
+- const claudeAgentSdkService = instantiationService.createInstance(ClaudeAgentSdkService);
+- diServices.set(IClaudeAgentSdkService, claudeAgentSdkService);
+- const codexProxyService = disposables.add(instantiationService.createInstance(CodexProxyService));
+- diServices.set(ICodexProxyService, codexProxyService);
+- const agentHostOTelService = disposables.add(instantiationService.createInstance(AgentHostOTelService));
+- diServices.set(IAgentHostOTelService, agentHostOTelService);
+- const copilotAgent = disposables.add(instantiationService.createInstance(CopilotAgent));
+- agentService.registerProvider(copilotAgent);
+- log('CopilotAgent registered');
+- // Claude and Codex providers are gated on two things:
+- // 1. The user-facing enable toggle (`chat.agentHost.Agent.enabled`,
+- // forwarded as an env var by the renderer-side starters; the remote
+- // server reads the env directly). Claude defaults to on, Codex
+- // defaults to off.
+- // 2. The SDK being reachable. Claude is a devDependency of this repo
+- // so the bare-import path in `ClaudeAgentSdkService._loadSdk`
+- // always succeeds in dev; in built/shipped server installs the
+- // SDK comes from the CLI flag / env var dev override or a
+- // `product.agentSdks.claude` entry. Codex still requires the
+- // env-var override or product config.
+- if (isAgentEnabled(process.env[AgentHostClaudeAgentEnabledEnvVar], true) && (!environmentService.isBuilt || agentSdkDownloader.isAvailable(ClaudeSdkPackage))) {
+- const claudeAgent = disposables.add(instantiationService.createInstance(ClaudeAgent));
+- agentService.registerProvider(claudeAgent);
+- log('ClaudeAgent registered');
+- }
+- if (isAgentEnabled(process.env[AgentHostCodexAgentEnabledEnvVar], false) && agentSdkDownloader.isAvailable(CodexSdkPackage)) {
+- const codexAgent = disposables.add(instantiationService.createInstance(CodexAgent));
+- agentService.registerProvider(codexAgent);
+- log('CodexAgent registered');
+- }
+ }
+diff --git a/src/vs/platform/agentHost/node/agentHostSessionTitleController.ts b/src/vs/platform/agentHost/node/agentHostSessionTitleController.ts
+index 5db01700..52b0130b 100644
+--- a/src/vs/platform/agentHost/node/agentHostSessionTitleController.ts
++++ b/src/vs/platform/agentHost/node/agentHostSessionTitleController.ts
+@@ -13,3 +13,2 @@ import { isAhpChatChannel, isDefaultChatUri, ResponsePartKind, type ResponsePart
+ import { AgentHostStateManager } from './agentHostStateManager.js';
+-import { ICopilotApiService, type ICopilotUtilityChatMessage } from './shared/copilotApiService.js';
+
+@@ -27,3 +26,2 @@ export interface IAgentHostSessionTitleControllerOptions {
+ readonly getGitHubCopilotToken?: () => string | undefined;
+- readonly copilotApiService?: ICopilotApiService;
+ }
+@@ -226,71 +224,3 @@ export class AgentHostSessionTitleController extends Disposable {
+ private async _generateTitleFromPrompt(promptContent: string, isConversation: boolean, token: CancellationToken): Promise {
+- if (token.isCancellationRequested) {
+- return undefined;
+- }
+-
+- const githubToken = this._options.getGitHubCopilotToken?.();
+- const copilotApiService = this._options.copilotApiService;
+- if (!githubToken || !copilotApiService) {
+- return undefined;
+- }
+-
+- const abortController = new AbortController();
+- const cancellationListener = token.onCancellationRequested(() => abortController.abort());
+- try {
+- const rawTitle = await copilotApiService.utilityChatCompletion(githubToken, {
+- messages: this._buildTitlePrompt(promptContent, isConversation),
+- }, {
+- signal: abortController.signal,
+- });
+- return this._cleanTitle(rawTitle);
+- } catch (err) {
+- if (token.isCancellationRequested) {
+- return undefined;
+- }
+- this._logService.warn('[AgentHostSessionTitleController] Failed to generate session title', err);
+- return undefined;
+- } finally {
+- cancellationListener.dispose();
+- }
+- }
+-
+- private _buildTitlePrompt(promptContent: string, isConversation: boolean): ICopilotUtilityChatMessage[] {
+- const userInstruction = isConversation
+- ? `Please write a brief title for the following conversation:\n\n${promptContent}`
+- : `Please write a brief title for the following request:\n\n${promptContent}`;
+- return [
+- {
+- role: 'system',
+- content: [
+- 'You are an expert in crafting ultra-compact titles for chatbot conversations.',
+- 'You are presented with a chat request or conversation, and you reply with only a brief title that captures the main topic.',
+- 'Write the title in sentence case, not title case.',
+- 'Preserve product names, abbreviations, code symbols, and proper nouns.',
+- 'Aim for 3-6 words. Prefer the shortest accurate title.',
+- 'Drop articles like "a", "an", and "the" unless needed for clarity.',
+- 'Drop filler and generic framing like "help with", "question about", "request for", or "issue with".',
+- 'Prefer short, concrete synonyms and omit unnecessary words.',
+- 'Do not wrap the title in quotes or add trailing punctuation.',
+- ].join(' '),
+- },
+- {
+- role: 'user',
+- content: userInstruction,
+- },
+- ];
+- }
+-
+- private _cleanTitle(rawTitle: string): string | undefined {
+- let title = rawTitle.trim();
+- const firstLine = title.split(/\r?\n/).map(line => line.trim()).find(line => line.length > 0);
+- title = firstLine ?? '';
+- if (title.startsWith('"') && title.endsWith('"') && title.length > 1) {
+- title = title.slice(1, -1).trim();
+- }
+- title = title.replace(/[.!?]+$/, '').trim();
+-
+- if (!title || title.includes('can\'t assist with that')) {
+- return undefined;
+- }
+- return title.slice(0, MAX_TITLE_LENGTH);
++ return undefined;
+ }
+diff --git a/src/vs/platform/agentHost/node/agentService.ts b/src/vs/platform/agentHost/node/agentService.ts
+index 8a11ef40..67d80bb3 100644
+--- a/src/vs/platform/agentHost/node/agentService.ts
++++ b/src/vs/platform/agentHost/node/agentService.ts
+@@ -51,3 +51,2 @@ import { AgentHostSkillCompletionProvider } from './agentHostSkillCompletionProv
+ import { AgentHostWorkspaceFiles } from './agentHostWorkspaceFiles.js';
+-import { CopilotApiService, ICopilotApiService } from './shared/copilotApiService.js';
+ import { parseMcpChannelUri } from './shared/mcpCustomizationController.js';
+@@ -213,3 +212,2 @@ export class AgentService extends Disposable implements IAgentService {
+ _fileMonitorService?: IAgentHostFileMonitorService,
+- copilotApiService?: ICopilotApiService,
+ ) {
+@@ -254,4 +252,2 @@ export class AgentService extends Disposable implements IAgentService {
+ services.set(IAgentHostOctoKitService, agentHostOctoKitService);
+- const effectiveCopilotApiService = copilotApiService ?? instantiationService.createInstance(CopilotApiService, undefined);
+- services.set(ICopilotApiService, effectiveCopilotApiService);
+
+@@ -303,3 +299,2 @@ export class AgentService extends Disposable implements IAgentService {
+ agents: this._agents,
+- copilotApiService: effectiveCopilotApiService,
+ getGitHubCopilotToken: () => {
+diff --git a/src/vs/platform/agentHost/node/agentSideEffects.ts b/src/vs/platform/agentHost/node/agentSideEffects.ts
+index 0cb3f7fa..afe06218 100644
+--- a/src/vs/platform/agentHost/node/agentSideEffects.ts
++++ b/src/vs/platform/agentHost/node/agentSideEffects.ts
+@@ -51,3 +51,2 @@ import { AgentHostTurnTracker } from './agentHostTurnTracker.js';
+ import { AgentHostSessionTitleController } from './agentHostSessionTitleController.js';
+-import type { ICopilotApiService } from './shared/copilotApiService.js';
+
+@@ -65,4 +64,2 @@ export interface IAgentSideEffectsOptions {
+ readonly getGitHubCopilotToken?: () => string | undefined;
+- /** CAPI service used for Copilot utility title generation. */
+- readonly copilotApiService?: ICopilotApiService;
+ /**
+@@ -137,3 +134,2 @@ export class AgentSideEffects extends Disposable {
+ getGitHubCopilotToken: this._options.getGitHubCopilotToken,
+- copilotApiService: this._options.copilotApiService,
+ }));
+diff --git a/src/vs/platform/agentHost/node/copilot/prompts/promptRegistry.ts b/src/vs/platform/agentHost/node/copilot/prompts/promptRegistry.ts
+index 793cf5e1..d55c6a5b 100644
+--- a/src/vs/platform/agentHost/node/copilot/prompts/promptRegistry.ts
++++ b/src/vs/platform/agentHost/node/copilot/prompts/promptRegistry.ts
+@@ -5,3 +5,2 @@
+
+-import type { SectionOverride, SystemMessageConfig, SystemMessageSection } from '@github/copilot-sdk';
+ import { agentHostCustomizationConfigSchema } from '../../../common/agentHostCustomizationConfig.js';
+@@ -9,3 +8,2 @@ import type { SchemaValue } from '../../../common/agentHostSchema.js';
+ import type { ModelSelection } from '../../../common/state/protocol/state.js';
+-import { COPILOT_AGENT_HOST_SYSTEM_MESSAGE, fullSystemPrompt, sectionOverrides } from './systemMessage.js';
+
+@@ -48,8 +46,2 @@ export interface IAgentHostPrompt {
+ resolveFullSystemPrompt?(model: ModelSelection, context: IAgentHostPromptContext): string | undefined;
+-
+- /**
+- * Section-level overrides. Resolved into `{ mode: 'customize' }`, keeping the
+- * SDK foundation prompt and guardrails intact.
+- */
+- resolveSectionOverrides?(model: ModelSelection, context: IAgentHostPromptContext): Partial> | undefined;
+ }
+@@ -95,48 +87,2 @@ export class AgentHostPromptRegistry {
+ }
+-
+- private _getContributor(model: ModelSelection): IAgentHostPromptCtor | undefined {
+- for (const ctor of this._promptsWithMatcher) {
+- if (ctor.matchesModel(model)) {
+- return ctor;
+- }
+- }
+- for (const { prefix, ctor } of this._familyPrefixList) {
+- if (model.id.startsWith(prefix)) {
+- return ctor;
+- }
+- }
+- return undefined;
+- }
+-
+- /**
+- * Resolves the {@link SystemMessageConfig} for a session's model.
+- *
+- * Falls back to {@link COPILOT_AGENT_HOST_SYSTEM_MESSAGE} when the model is
+- * unknown (e.g. server-side "Auto" selection where no model is chosen at
+- * create time), when no contributor matches, or when the matching
+- * contributor opts out for the current {@link context} (e.g. a setting that
+- * gates it is disabled).
+- */
+- resolveSystemMessageConfig(model: ModelSelection | undefined, context: IAgentHostPromptContext): SystemMessageConfig {
+- if (!model) {
+- return COPILOT_AGENT_HOST_SYSTEM_MESSAGE;
+- }
+- const ctor = this._getContributor(model);
+- if (!ctor) {
+- return COPILOT_AGENT_HOST_SYSTEM_MESSAGE;
+- }
+- const contributor = new ctor();
+- const fullPrompt = contributor.resolveFullSystemPrompt?.(model, context);
+- if (fullPrompt !== undefined) {
+- return fullSystemPrompt(fullPrompt);
+- }
+- const sections = contributor.resolveSectionOverrides?.(model, context);
+- // An empty overrides object is treated as "no override" so we keep the
+- // default identity customization rather than emitting a
+- // `{ mode: 'customize', sections: {} }` that drops it.
+- if (sections && Object.keys(sections).length > 0) {
+- return sectionOverrides(sections);
+- }
+- return COPILOT_AGENT_HOST_SYSTEM_MESSAGE;
+- }
+ }
+diff --git a/src/vs/platform/agentHost/node/copilot/sessionCustomizationDiscovery.ts b/src/vs/platform/agentHost/node/copilot/sessionCustomizationDiscovery.ts
+index 9331c71b..1f924384 100644
+--- a/src/vs/platform/agentHost/node/copilot/sessionCustomizationDiscovery.ts
++++ b/src/vs/platform/agentHost/node/copilot/sessionCustomizationDiscovery.ts
+@@ -5,3 +5,2 @@
+
+-import type { CopilotClient } from '@github/copilot-sdk';
+ import { CancellationToken } from '../../../../base/common/cancellation.js';
+@@ -11,12 +10,7 @@ import { Disposable, type IDisposable } from '../../../../base/common/lifecycle.
+ import { ResourceMap, ResourceSet } from '../../../../base/common/map.js';
+-import { joinPath, dirname as uriDirname } from '../../../../base/common/resources.js';
++import { joinPath } from '../../../../base/common/resources.js';
+ import { compare as compareStrings } from '../../../../base/common/strings.js';
+ import { URI } from '../../../../base/common/uri.js';
+-import { basename, isAbsolute } from '../../../../base/common/path.js';
+ import { IFileService, IFileStatWithMetadata } from '../../../files/common/files.js';
+ import { ILogService } from '../../../log/common/log.js';
+-import type { AgentsDiscoverRequest } from './copilotRCP.js';
+-import { AgentCustomization, ChildCustomization, CustomizationLoadStatus, CustomizationType, DirectoryCustomization, RuleCustomization, SkillCustomization, customizationId } from '../../common/state/sessionState.js';
+-import { ChildCustomizationType } from '../../common/state/protocol/state.js';
+-import { toAgentCustomizationMeta } from '../../common/meta/agentCustomizationMeta.js';
+
+@@ -91,10 +85,2 @@ function compareDiscoveredFile(a: IDiscoveredFile, b: IDiscoveredFile): number {
+
+-function compareDirectoryCustomization(a: DirectoryCustomization, b: DirectoryCustomization): number {
+- const byUri = compareStrings(a.uri, b.uri);
+- if (byUri !== 0) {
+- return byUri;
+- }
+- return compareStrings(a.contents, b.contents);
+-}
+-
+ /**
+@@ -240,85 +226,2 @@ export class SessionCustomizationDiscovery extends Disposable {
+
+- public async discover(client: CopilotClient, token: CancellationToken): Promise {
+- throwIfCancelled(token);
+-
+- const p: AgentsDiscoverRequest = { projectPaths: [this._workingDirectory.fsPath] };
+-
+- try {
+- const agents: AgentCustomization[] = [];
+-
+- const agentDiscovery = await client.rpc.agents.discover(p);
+- for (const agent of agentDiscovery.agents) {
+- if (agent.path) {
+- const uri = URI.file(agent.path);
+- agents.push({ type: CustomizationType.Agent, uri: uri.toString(), id: agent.id, name: agent.name, description: agent.description, _meta: toAgentCustomizationMeta({ userInvocable: agent.userInvocable }) });
+- }
+- }
+-
+- const rules: RuleCustomization[] = [];
+-
+- const instructionDiscovery = await client.rpc.instructions.discover(p);
+- for (const instruction of instructionDiscovery.sources) {
+- let uri: URI;
+- if (isAbsolute(instruction.sourcePath)) {
+- uri = URI.file(instruction.sourcePath);
+- } else {
+- uri = joinPath(this._workingDirectory, instruction.sourcePath);
+- }
+- rules.push({ type: CustomizationType.Rule, uri: uri.toString(), id: instruction.id, name: instruction.label, description: instruction.description, globs: instruction.applyTo, alwaysApply: false });
+- }
+-
+- const skills: SkillCustomization[] = [];
+-
+- const skillDiscovery = await client.rpc.skills.discover(p);
+- for (const skill of skillDiscovery.skills) {
+- if (skill.path) {
+- const uri = URI.file(skill.path);
+- skills.push({ type: CustomizationType.Skill, uri: uri.toString(), id: skill.path, name: skill.name, description: skill.description });
+- }
+- }
+-
+- const result: DirectoryCustomization[] = [];
+- this.toDirectoryCustomizations(CustomizationType.Agent, agents, result);
+- this.toDirectoryCustomizations(CustomizationType.Rule, rules, result);
+- this.toDirectoryCustomizations(CustomizationType.Skill, skills, result);
+- return result.sort(compareDirectoryCustomization);
+- } catch (err) {
+- this._logService.error(`[SessionCustomizationDiscovery] Error during discovery: ${err instanceof Error ? err.message : String(err)}`);
+- return [];
+- }
+- }
+-
+- private toDirectoryCustomizations(type: ChildCustomizationType, customizations: readonly ChildCustomization[], result: DirectoryCustomization[]): void {
+- const byParent = new ResourceMap<{ readonly uri: URI; readonly children: ChildCustomization[] }>();
+- for (const customization of customizations) {
+- if (customization.type !== type) {
+- continue;
+- }
+- const childUri = URI.parse(customization.uri);
+- const parentUri = uriDirname(childUri);
+- let entry = byParent.get(parentUri);
+- if (!entry) {
+- entry = { uri: parentUri, children: [] };
+- byParent.set(parentUri, entry);
+- }
+- entry.children.push(customization);
+- }
+-
+- for (const { uri, children } of byParent.values()) {
+- children.sort((a, b) => compareStrings(a.uri, b.uri));
+- result.push({
+- type: CustomizationType.Directory,
+- id: customizationId(uri.toString()),
+- uri: uri.toString(),
+- name: basename(uri.path),
+- enabled: true,
+- contents: type,
+- writable: true,
+- load: { kind: CustomizationLoadStatus.Loaded },
+- children,
+- });
+- }
+- }
+-
+-
+ /**
+diff --git a/src/vs/platform/agentHost/node/shared/forwardedChatError.ts b/src/vs/platform/agentHost/node/shared/forwardedChatError.ts
+index 0de32af7..93e95eb6 100644
+--- a/src/vs/platform/agentHost/node/shared/forwardedChatError.ts
++++ b/src/vs/platform/agentHost/node/shared/forwardedChatError.ts
+@@ -5,4 +5,2 @@
+
+-import { CopilotApiError, COPILOT_API_ERROR_STATUS_STREAMING } from './copilotApiService.js';
+-
+ /**
+@@ -88,57 +86,2 @@ function statusToFetchType(status: number): string {
+
+-/**
+- * Builds a {@link IForwardedChatError} from a {@link CopilotApiError}. The
+- * error's Anthropic envelope carries the upstream message and type, which are
+- * surfaced as `reason`/`capiError` so the core formatter can render the right
+- * message (rate limit, quota, filtered, etc.).
+- */
+-export function buildForwardedChatError(err: CopilotApiError): IForwardedChatError {
+- const status = err.status === COPILOT_API_ERROR_STATUS_STREAMING ? 502 : err.status;
+- const requestId = typeof err.envelope.request_id === 'string' ? err.envelope.request_id : '';
+- // CAPI rate-limit/quota errors carry their fine-grained code in the
+- // response body (e.g. `{ "error": { "code": "quota_exceeded", ... } }`).
+- // The proxy synthesizes a non-conforming body into the Anthropic envelope
+- // as `error.type: 'api_error'` with the raw body as the message, so prefer
+- // a CAPI code/message parsed out of the message when present.
+- const capiError = extractCapiError(err.envelope.error.message) ?? { code: err.envelope.error.type, message: err.envelope.error.message };
+- return {
+- fetchError: {
+- type: statusToFetchType(status),
+- reason: capiError.message ?? err.envelope.error.message,
+- requestId,
+- capiError,
+- },
+- };
+-}
+-
+-/**
+- * Attempts to parse a CAPI-style error body (`{ "error": { "code", "message" } }`)
+- * out of an envelope message string. Returns `undefined` when the message is
+- * not such a JSON payload.
+- */
+-function extractCapiError(message: string): { code?: string; message?: string } | undefined {
+- let parsed: unknown;
+- try {
+- parsed = JSON.parse(message);
+- } catch {
+- return undefined;
+- }
+- if (!parsed || typeof parsed !== 'object') {
+- return undefined;
+- }
+- const error = (parsed as { error?: unknown }).error;
+- if (!error || typeof error !== 'object') {
+- return undefined;
+- }
+- const code = (error as { code?: unknown }).code;
+- const msg = (error as { message?: unknown }).message;
+- if (typeof code !== 'string' && typeof msg !== 'string') {
+- return undefined;
+- }
+- return {
+- code: typeof code === 'string' ? code : undefined,
+- message: typeof msg === 'string' ? msg : undefined,
+- };
+-}
+-
+ /**
+diff --git a/src/vs/platform/agentHost/test/node/mockAgent.ts b/src/vs/platform/agentHost/test/node/mockAgent.ts
+index 5daeb348..65fcacd5 100644
+--- a/src/vs/platform/agentHost/test/node/mockAgent.ts
++++ b/src/vs/platform/agentHost/test/node/mockAgent.ts
+@@ -12,3 +12,2 @@ import { type ISyncedCustomization } from '../../common/agentPluginManager.js';
+ import { AgentSession, type AgentProvider, type AgentSignal, type IAgent, type IAgentActionSignal, type IAgentCreateSessionConfig, type IAgentCreateSessionResult, type IAgentDescriptor, type IAgentModelInfo, type IAgentResolveSessionConfigParams, type IAgentSessionConfigCompletionsParams, type IAgentSessionMetadata, type IAgentToolPendingConfirmationSignal } from '../../common/agentService.js';
+-import { buildSubagentTurnsFromHistory, buildTurnsFromHistory, type IHistoryRecord } from './historyRecordFixtures.js';
+ import { ProtectedResourceMetadata, ToolCallContributorKind, type AgentSelection, type MessageAttachment, type ModelSelection } from '../../common/state/protocol/state.js';
+@@ -16,3 +15,3 @@ import type { ResolveSessionConfigResult, SessionConfigCompletionsResult } from
+ import { ActionType } from '../../common/state/sessionActions.js';
+-import { ResponsePartKind, ToolCallConfirmationReason, ToolCallStatus, ToolResultContentType, CustomizationLoadStatus, parseSubagentSessionUri, type ClientPluginCustomization, type Customization, type PendingMessage, type StringOrMarkdown, type ToolCallResult, type Turn, type UsageInfo } from '../../common/state/sessionState.js';
++import { ResponsePartKind, ToolCallConfirmationReason, ToolCallStatus, ToolResultContentType, CustomizationLoadStatus, type ClientPluginCustomization, type Customization, type PendingMessage, type StringOrMarkdown, type ToolCallResult, type Turn, type UsageInfo } from '../../common/state/sessionState.js';
+ import { hasKey } from '../../../../base/common/types.js';
+@@ -66,10 +65,2 @@ export class MockAgent implements IAgent {
+
+- /**
+- * Configurable session history. Tests construct {@link IHistoryRecord}
+- * entries (the agent-internal intermediate shape) and the mock converts
+- * them to {@link Turn}s on demand. Subagent URIs are routed to filtered
+- * subagent turns via {@link buildSubagentTurnsFromHistory}.
+- */
+- sessionMessages: IHistoryRecord[] = [];
+-
+ /** Optional overrides applied to session metadata from listSessions. */
+@@ -137,7 +128,3 @@ export class MockAgent implements IAgent {
+ async getSessionMessages(session: URI): Promise {
+- const subagentInfo = parseSubagentSessionUri(session);
+- if (subagentInfo) {
+- return buildSubagentTurnsFromHistory(this.sessionMessages, subagentInfo.toolCallId, session.toString());
+- }
+- return buildTurnsFromHistory(this.sessionMessages);
++ return []
+ }
+@@ -258,9 +245,2 @@ export class ScriptedMockAgent implements IAgent {
+ */
+- private readonly _preExistingMessages: IHistoryRecord[] = [
+- { type: 'message', role: 'user', session: PRE_EXISTING_SESSION_URI, messageId: 'h-msg-1', content: 'What files are here?' },
+- { type: 'tool_start', session: PRE_EXISTING_SESSION_URI, toolCallId: 'h-tc-1', toolName: 'list_files', displayName: 'List Files', invocationMessage: 'Listing files...' },
+- { type: 'tool_complete', session: PRE_EXISTING_SESSION_URI, toolCallId: 'h-tc-1', result: { pastTenseMessage: 'Listed files', content: [{ type: ToolResultContentType.Text, text: 'file1.ts\nfile2.ts' }], success: true } satisfies ToolCallResult },
+- { type: 'message', role: 'assistant', session: PRE_EXISTING_SESSION_URI, messageId: 'h-msg-2', content: 'Here are the files: file1.ts and file2.ts' },
+- ];
+-
+ // Track pending permission requests
+@@ -744,9 +724,2 @@ export class ScriptedMockAgent implements IAgent {
+ async getSessionMessages(session: URI): Promise {
+- const subagentInfo = parseSubagentSessionUri(session);
+- if (subagentInfo) {
+- return buildSubagentTurnsFromHistory(this._preExistingMessages, subagentInfo.toolCallId, session.toString());
+- }
+- if (session.toString() === PRE_EXISTING_SESSION_URI.toString()) {
+- return buildTurnsFromHistory(this._preExistingMessages);
+- }
+ return [];
+diff --git a/src/vs/platform/agentHost/test/node/sessionCustomizationDiscovery.test.ts b/src/vs/platform/agentHost/test/node/sessionCustomizationDiscovery.test.ts
+index 8697c546..5dcae487 100644
+--- a/src/vs/platform/agentHost/test/node/sessionCustomizationDiscovery.test.ts
++++ b/src/vs/platform/agentHost/test/node/sessionCustomizationDiscovery.test.ts
+@@ -6,3 +6,2 @@
+ import assert from 'assert';
+-import type { CopilotClient } from '@github/copilot-sdk';
+ import { DeferredPromise, raceTimeout, timeout } from '../../../../base/common/async.js';
+@@ -22,3 +21,2 @@ import { DiscoveredType, SessionCustomizationDiscovery } from '../../node/copilo
+ import { SessionPluginBundler } from '../../node/shared/sessionPluginBundler.js';
+-import { mapToParsedPlugin, toDiscoveredDirectoryCustomizations } from '../../node/copilot/copilotAgent.js';
+
+@@ -76,38 +74,2 @@ suite('SessionCustomizationDiscovery', () => {
+
+- test('groups discovered customizations by parent folder', async () => {
+- const discovery = disposables.add(instantiationService.createInstance(SessionCustomizationDiscovery, workspace, userHome));
+- const client = {
+- rpc: {
+- agents: {
+- discover: async () => ({
+- agents: [
+- { id: 'one', name: 'One', description: '', path: '/workspace/.github/agents/one.agent.md', userInvocable: false },
+- { id: 'two', name: 'Two', description: '', path: '/workspace/.github/agents/two.agent.md', userInvocable: true },
+- { id: 'three', name: 'Three', description: '', path: '/workspace/.github/other/three.agent.md', userInvocable: false },
+- ],
+- }),
+- },
+- instructions: { discover: async () => ({ sources: [] }) },
+- skills: { discover: async () => ({ skills: [] }) },
+- },
+- } as unknown as CopilotClient;
+-
+- const customizations = await discovery.discover(client, CancellationToken.None);
+- const agentDirectories = customizations.filter(customization => customization.contents === 'agent');
+-
+- const getPath = (uri: string) => URI.parse(uri).path;
+-
+- assert.strictEqual(agentDirectories.length, 2);
+- assert.deepStrictEqual(agentDirectories.map(customization => getPath(customization.uri)).sort(), [
+- '/workspace/.github/agents',
+- '/workspace/.github/other',
+- ]);
+- const agentsInAgentsDir = agentDirectories.find(customization => getPath(customization.uri) === '/workspace/.github/agents');
+- assert.ok(agentsInAgentsDir);
+- assert.deepStrictEqual(agentsInAgentsDir.children?.map(child => getPath(child.uri)).sort(), [
+- '/workspace/.github/agents/one.agent.md',
+- '/workspace/.github/agents/two.agent.md',
+- ]);
+- });
+-
+ test('returns directories sorted by type and URI', async () => {
+@@ -518,63 +480,2 @@ suite('SessionCustomizationDiscovery', () => {
+ });
+-
+- test('maps discovered files to parsed plugin preserving source URIs', async () => {
+- const agent = await seed('/workspace/.github/agents/foo.agent.md', '---\nname: Workspace Agent\ndescription: Agent description\n---\nbody');
+- const skill = await seed('/workspace/.github/skills/bar/SKILL.md', '---\nname: Workspace Skill\ndescription: Skill description\n---\nbody');
+- const instruction = await seed('/workspace/.github/instructions/baz.instructions.md', '---\nname: Workspace Rule\ndescription: Rule description\nglobs:\n - src/**\n---\nbody');
+-
+- const discovery = disposables.add(instantiationService.createInstance(SessionCustomizationDiscovery, workspace, userHome));
+- const customizations = await toDiscoveredDirectoryCustomizations(await discovery.scan(CancellationToken.None), fileService);
+-
+- const plugin = mapToParsedPlugin(customizations);
+-
+- assert.ok(plugin);
+- assert.strictEqual(plugin.agents.length, 1);
+- assert.strictEqual(plugin.skills.length, 1);
+- assert.strictEqual(plugin.instructions.length, 1);
+- assert.deepStrictEqual(
+- {
+- agentUri: plugin.agents[0].uri.toString(),
+- agentDescription: plugin.agents[0].description,
+- skillUri: plugin.skills[0].uri.toString(),
+- skillDescription: plugin.skills[0].description,
+- ruleUri: plugin.instructions[0].uri.toString(),
+- ruleDescription: plugin.instructions[0].description,
+- },
+- {
+- agentUri: agent.toString(),
+- agentDescription: 'Agent description',
+- skillUri: skill.toString(),
+- skillDescription: 'Skill description',
+- ruleUri: instruction.toString(),
+- ruleDescription: 'Rule description',
+- }
+- );
+- });
+-
+- test('does not include parsed agent-instruction rules in mapToParsedPlugin output', async () => {
+- await seed('/workspace/.github/copilot-instructions.md', 'workspace instructions');
+- await seed('/workspace/.agents/skills/bar/SKILL.md', '---\nname: bar\ndescription: Skill description\n---\nbody');
+-
+- const discovery = disposables.add(instantiationService.createInstance(SessionCustomizationDiscovery, workspace, userHome));
+- const customizations = await toDiscoveredDirectoryCustomizations(await discovery.scan(CancellationToken.None), fileService);
+-
+- const plugin = mapToParsedPlugin(customizations);
+-
+- assert.ok(plugin);
+- assert.strictEqual(plugin.skills.length, 1);
+- assert.strictEqual(plugin.instructions.length, 0);
+- });
+-
+- test('returns undefined from mapToParsedPlugin when all customizations are agent-instruction files', async () => {
+- // Only agent instruction files are discovered — these are excluded from the parsed plugin output.
+- await seed('/workspace/.github/copilot-instructions.md', 'workspace instructions');
+- await seed('/home/.copilot/copilot-instructions.md', 'user instructions');
+-
+- const discovery = disposables.add(instantiationService.createInstance(SessionCustomizationDiscovery, workspace, userHome));
+- const customizations = await toDiscoveredDirectoryCustomizations(await discovery.scan(CancellationToken.None), fileService);
+-
+- const plugin = mapToParsedPlugin(customizations);
+-
+- assert.strictEqual(plugin, undefined);
+- });
+ });
diff --git a/patches/feat-ext-unsafe.patch b/patches/60-security-add-option-for-malicious-ext.patch
similarity index 100%
rename from patches/feat-ext-unsafe.patch
rename to patches/60-security-add-option-for-malicious-ext.patch
diff --git a/patches/fix-extensions-control-connection.patch b/patches/61-extension-close-connection.patch
similarity index 100%
rename from patches/fix-extensions-control-connection.patch
rename to patches/61-extension-close-connection.patch
diff --git a/patches/80-ui-disable-onboarding.json b/patches/80-ui-disable-onboarding.json
new file mode 100644
index 00000000000..fc28593a19f
--- /dev/null
+++ b/patches/80-ui-disable-onboarding.json
@@ -0,0 +1,8 @@
+[
+ {
+ "action": "remove",
+ "paths": [
+ "src/vs/workbench/contrib/welcomeOnboarding"
+ ]
+ }
+]
diff --git a/patches/81-ui-disable-onboarding.patch b/patches/81-ui-disable-onboarding.patch
new file mode 100644
index 00000000000..878ff04cc33
--- /dev/null
+++ b/patches/81-ui-disable-onboarding.patch
@@ -0,0 +1,67 @@
+diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts
+index 777f3ad8..4172f07f 100644
+--- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts
++++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts
+@@ -33,6 +33,2 @@ import { mainWindow } from '../../../../base/browser/window.js';
+ import { getActiveElement } from '../../../../base/browser/dom.js';
+-import { isWeb } from '../../../../base/common/platform.js';
+-import { IOnboardingService } from '../../welcomeOnboarding/common/onboardingService.js';
+-import { ONBOARDING_STORAGE_KEY } from '../../welcomeOnboarding/common/onboardingTypes.js';
+-import { IChatEntitlementService } from '../../../services/chat/common/chatEntitlementService.js';
+
+@@ -97,4 +93,2 @@ export class StartupPageRunnerContribution extends Disposable implements IWorkbe
+ @IContextKeyService private readonly contextKeyService: IContextKeyService,
+- @IOnboardingService private readonly onboardingService: IOnboardingService,
+- @IChatEntitlementService private readonly chatEntitlementService: IChatEntitlementService,
+ ) {
+@@ -102,3 +96,2 @@ export class StartupPageRunnerContribution extends Disposable implements IWorkbe
+
+- this.tryShowOnboarding();
+ this.run().then(undefined, onUnexpectedError);
+@@ -234,36 +227,2 @@ export class StartupPageRunnerContribution extends Disposable implements IWorkbe
+ }
+-
+- private tryShowOnboarding(): void {
+- if (this.environmentService.skipWelcome) {
+- return; // skip welcome flag is set
+- }
+-
+- if (isWeb) {
+- return; // not supported on web (e.g. codespaces, github.dev)
+- }
+-
+- if (!this.configurationService.getValue('workbench.welcomePage.experimentalOnboarding')) {
+- return; // experimental onboarding is disabled
+- }
+-
+- if (this.chatEntitlementService.sentiment.hidden) {
+- return; // AI features are hidden, do not show AI-focused onboarding
+- }
+-
+- if (!this.storageService.isNew(StorageScope.APPLICATION)) {
+- return; // only show onboarding for new users who have never used the product before
+- }
+-
+- if (this.storageService.getBoolean(ONBOARDING_STORAGE_KEY, StorageScope.APPLICATION)) {
+- return; // onboarding already completed
+- }
+-
+- // Show the onboarding overlay on top of the welcome page
+- this.onboardingService.show();
+-
+- // Mark onboarding as completed when dismissed
+- this._register(this.onboardingService.onDidDismiss(() => {
+- this.storageService.store(ONBOARDING_STORAGE_KEY, true, StorageScope.APPLICATION, StorageTarget.USER);
+- }));
+- }
+ }
+diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts
+index b6c33f80..e3a8ad35 100644
+--- a/src/vs/workbench/workbench.common.main.ts
++++ b/src/vs/workbench/workbench.common.main.ts
+@@ -391,5 +391,2 @@ import './contrib/welcomeViews/common/newFile.contribution.js';
+
+-// Welcome Onboarding
+-import './contrib/welcomeOnboarding/browser/welcomeOnboarding.contribution.js';
+-
+ // Call Hierarchy
diff --git a/patches/add-remote-url.patch b/patches/add-remote-url.patch
deleted file mode 100644
index 21f52b57430..00000000000
--- a/patches/add-remote-url.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-diff --git a/build/gulpfile.reh.ts b/build/gulpfile.reh.ts
-index b935764..68067db 100644
---- a/build/gulpfile.reh.ts
-+++ b/build/gulpfile.reh.ts
-@@ -323,3 +323,3 @@ function packageTask(type: string, platform: string, arch: string, sourceFolderN
- const productJsonStream = gulp.src(['product.json'], { base: '.' })
-- .pipe(jsonEditor({ commit, date: readISODate(sourceFolderName), version }))
-+ .pipe(jsonEditor({ commit, date: readISODate(sourceFolderName), version, serverDownloadUrlTemplate: 'https://github.com/!!ASSETS_REPOSITORY!!/releases/download/!!RELEASE_VERSION!!/!!APP_NAME_LC!!-reh-${os}-${arch}-!!RELEASE_VERSION!!.tar.gz' }))
- .pipe(es.through(function (file) {
-diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
-index a103f11..82142a1 100644
---- a/build/gulpfile.vscode.ts
-+++ b/build/gulpfile.vscode.ts
-@@ -374,3 +374,3 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
- const productJsonStream = gulp.src(['product.json'], { base: '.' })
-- .pipe(jsonEditor({ commit, date: readISODate(out), checksums, version }))
-+ .pipe(jsonEditor({ commit, date: readISODate(out), checksums, version, serverDownloadUrlTemplate: 'https://github.com/!!ASSETS_REPOSITORY!!/releases/download/!!RELEASE_VERSION!!/!!APP_NAME_LC!!-reh-${os}-${arch}-!!RELEASE_VERSION!!.tar.gz' }))
- .pipe(es.through(function (file) {
diff --git a/patches/alpine/reh/fix-node-docker.patch b/patches/alpine/reh/00-build-docker.patch
similarity index 100%
rename from patches/alpine/reh/fix-node-docker.patch
rename to patches/alpine/reh/00-build-docker.patch
diff --git a/patches/disable-copilot.patch b/patches/disable-copilot.patch
deleted file mode 100644
index 9211b7fdae4..00000000000
--- a/patches/disable-copilot.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts
-index 1998414..cdc533b 100644
---- a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts
-+++ b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts
-@@ -206,3 +206,4 @@ abstract class OpenChatGlobalAction extends Action2 {
- ChatContextKeys.Setup.hidden.negate(),
-- ChatContextKeys.Setup.disabled.negate()
-+ ChatContextKeys.Setup.disabled.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate()
- )
-@@ -1142,3 +1143,3 @@ export function registerChatActions() {
- precondition: ContextKeyExpr.and(
-- ChatContextKeys.Setup.installed,
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- ChatContextKeys.Setup.disabled.negate(),
-@@ -1715,3 +1716,4 @@ MenuRegistry.appendMenuItem(MenuId.EditorContext, {
- ChatContextKeys.Setup.hidden.negate(),
-- ChatContextKeys.Setup.disabled.negate()
-+ ChatContextKeys.Setup.disabled.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate()
- )
-diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts
-index b8c8e03..512e40f 100644
---- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts
-+++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts
-@@ -314,3 +314,4 @@ class AttachSelectionToChatAction extends Action2 {
- ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeUserData)
-- )
-+ ),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- )
-diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts
-index be62dda..7b5f1ed 100644
---- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts
-+++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts
-@@ -1237,3 +1237,3 @@ configurationRegistry.registerConfiguration({
- description: nls.localize('chat.disableAIFeatures', "Disable and hide built-in AI features provided by GitHub Copilot, including chat and inline suggestions."),
-- default: false,
-+ default: true,
- scope: ConfigurationScope.WINDOW
-diff --git a/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts b/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts
-index ddb5df4..7831288 100644
---- a/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts
-+++ b/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.ts
-@@ -70,10 +70,9 @@ const chatViewDescriptor: IViewDescriptor = {
- ctorDescriptor: new SyncDescriptor(ChatViewPane),
-- when: ContextKeyExpr.or(
-- ContextKeyExpr.or(
-- ChatContextKeys.Setup.hidden,
-- ChatContextKeys.Setup.disabled
-- )?.negate(),
-- ChatContextKeys.panelParticipantRegistered,
-- ChatContextKeys.extensionInvalid
-- )
-+ when: ContextKeyExpr.and(
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
-+ ChatContextKeys.Setup.disabled.negate(),
-+ ChatContextKeys.Setup.hidden.negate(),
-+ ChatContextKeys.panelParticipantRegistered,
-+ ChatContextKeys.extensionInvalid.negate()
-+ )
- };
-diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts
-index 4a71579..f8b3e83 100644
---- a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts
-+++ b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts
-@@ -228,2 +228,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
- ChatContextKeys.Setup.untrusted,
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- ChatContextKeys.Setup.installed.negate(),
-@@ -346,2 +347,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
- ChatContextKeys.Setup.hidden.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- ChatContextKeys.Setup.installed.negate(),
-@@ -518,2 +520,3 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
- ChatContextKeys.Setup.disabled.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- ChatContextKeys.Setup.installed.negate(),
-diff --git a/src/vs/workbench/contrib/chat/common/actions/chatContextKeys.ts b/src/vs/workbench/contrib/chat/common/actions/chatContextKeys.ts
-index c8fc17b..fbd2afd 100644
---- a/src/vs/workbench/contrib/chat/common/actions/chatContextKeys.ts
-+++ b/src/vs/workbench/contrib/chat/common/actions/chatContextKeys.ts
-@@ -163,3 +163,3 @@ export namespace ChatContextKeyExprs {
- export const chatSetupTriggerContext = ContextKeyExpr.or(
-- ChatContextKeys.Setup.installed.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- ChatContextKeys.Entitlement.canSignUp
-diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts
-index e9b4077..b33d6f2 100644
---- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts
-+++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts
-@@ -133,3 +133,9 @@ MenuRegistry.appendMenuItem(MenuId.InlineChatEditorAffordance, {
- order: 1,
-- when: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasNonEmptySelection, CTX_INLINE_CHAT_FILE_BELONGS_TO_CHAT.negate(), ChatEntitlementContextKeys.Setup.hidden.negate()),
-+ when: ContextKeyExpr.and(
-+ EditorContextKeys.writable,
-+ EditorContextKeys.hasNonEmptySelection,
-+ CTX_INLINE_CHAT_FILE_BELONGS_TO_CHAT.negate(),
-+ ChatEntitlementContextKeys.Setup.hidden.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
-+ ),
- command: {
-diff --git a/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts b/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
-index 864cc4f..b877a8e 100644
---- a/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
-+++ b/src/vs/workbench/contrib/mcp/browser/mcpServersView.ts
-@@ -554,3 +554,3 @@ export class McpServersViewsContribution extends Disposable implements IWorkbenc
- ctorDescriptor: new SyncDescriptor(DefaultBrowseMcpServersView, [{}]),
-- when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ChatContextKeys.Setup.hidden.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyExpr.or(ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`), ProductQualityContext.notEqualsTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`))),
-+ when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ContextKeyExpr.has('config.chat.disableAIFeatures').negate(), ChatContextKeys.Setup.hidden.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyExpr.or(ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`), ProductQualityContext.notEqualsTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`))),
- weight: 40,
-@@ -569,3 +569,3 @@ export class McpServersViewsContribution extends Disposable implements IWorkbenc
- ctorDescriptor: new SyncDescriptor(DefaultBrowseMcpServersView, [{ showWelcome: true }]),
-- when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ChatContextKeys.Setup.hidden.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`).negate(), ProductQualityContext.isEqualTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`).negate()),
-+ when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext.toNegated(), ContextKeyExpr.has('config.chat.disableAIFeatures').negate(), ChatContextKeys.Setup.hidden.negate(), McpServersGalleryStatusContext.isEqualTo(McpGalleryManifestStatus.Available), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceUrlConfig}`).negate(), ProductQualityContext.isEqualTo('stable'), ContextKeyDefinedExpr.create(`config.${mcpGalleryServiceEnablementConfig}`).negate()),
- weight: 40,
-diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts
-index 8f2ea73..429e28f 100644
---- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts
-+++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts
-@@ -705,3 +705,3 @@ registerAction2(class extends Action2 {
- ChatContextKeys.Setup.disabled.negate(),
-- ChatContextKeys.Setup.installed.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- ContextKeyExpr.in(ResourceContextKey.Resource.key, 'git.mergeChanges'),
-diff --git a/src/vs/workbench/contrib/scm/browser/scmInput.ts b/src/vs/workbench/contrib/scm/browser/scmInput.ts
-index a35d479..da5a449 100644
---- a/src/vs/workbench/contrib/scm/browser/scmInput.ts
-+++ b/src/vs/workbench/contrib/scm/browser/scmInput.ts
-@@ -850,2 +850,3 @@ registerAction2(class extends Action2 {
- ChatContextKeys.Setup.disabled.negate(),
-+ ContextKeyExpr.has('config.chat.disableAIFeatures').negate(),
- ChatContextKeys.Setup.installed.negate(),
diff --git a/patches/fix-npm-preinstall.patch b/patches/fix-npm-preinstall.patch
deleted file mode 100644
index 994243ee076..00000000000
--- a/patches/fix-npm-preinstall.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/build/npm/preinstall.ts b/build/npm/preinstall.ts
-index 3476fca..e23329f 100644
---- a/build/npm/preinstall.ts
-+++ b/build/npm/preinstall.ts
-@@ -129,3 +129,3 @@ function installHeaders() {
- // Refs https://chromium-review.googlesource.com/c/v8/v8/+/6879784
-- if (process.platform === 'linux') {
-+ if (process.platform === 'linux' && local) {
- const homedir = os.homedir();
-@@ -133,3 +133,3 @@ function installHeaders() {
- const nodeGypCache = path.join(cachePath, 'node-gyp');
-- const localHeaderPath = path.join(nodeGypCache, local!.target, 'include', 'node');
-+ const localHeaderPath = path.join(nodeGypCache, local.target, 'include', 'node');
- if (fs.existsSync(localHeaderPath)) {
diff --git a/patches/insider/system-extensions.patch b/patches/insider/19-system-extensions.patch
similarity index 54%
rename from patches/insider/system-extensions.patch
rename to patches/insider/19-system-extensions.patch
index 1f95eb5b905..1fad325c36d 100644
--- a/patches/insider/system-extensions.patch
+++ b/patches/insider/19-system-extensions.patch
@@ -1,13 +1,13 @@
diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
-index 150908a..0759a8d 100644
+index 26f44277..896ab329 100644
--- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
+++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts
-@@ -104,2 +104,3 @@ export class Extension implements IExtension {
+@@ -112,2 +112,3 @@ export class Extension implements IExtension {
@IFileService private readonly fileService: IFileService,
+ // @ts-ignore
- @IProductService private readonly productService: IProductService
-@@ -325,3 +326,3 @@ export class Extension implements IExtension {
+ @IProductService private readonly productService: IProductService,
+@@ -342,3 +343,3 @@ export class Extension implements IExtension {
// Do not allow updating system extensions in stable
-- if (this.type === ExtensionType.System && this.productService.quality === 'stable') {
-+ if (this.type === ExtensionType.System) {
+- if (this.type === ExtensionType.System && this.productService.quality === 'stable' && !this.productService.builtInExtensionsEnabledWithAutoUpdates?.some(id => id.toLowerCase() === this.identifier.id.toLowerCase())) {
++ if (this.type === ExtensionType.System && !this.productService.builtInExtensionsEnabledWithAutoUpdates?.some(id => id.toLowerCase() === this.identifier.id.toLowerCase())) {
return false;
diff --git a/patches/linux/rpm.patch b/patches/linux/00-asset-fix-rpm-version.patch
similarity index 100%
rename from patches/linux/rpm.patch
rename to patches/linux/00-asset-fix-rpm-version.patch
diff --git a/patches/linux/fix-npm-postinstall.patch b/patches/linux/00-build-improve-qemu.patch
similarity index 72%
rename from patches/linux/fix-npm-postinstall.patch
rename to patches/linux/00-build-improve-qemu.patch
index b287302b0bd..5206db23d3e 100644
--- a/patches/linux/fix-npm-postinstall.patch
+++ b/patches/linux/00-build-improve-qemu.patch
@@ -1,11 +1,11 @@
diff --git a/build/npm/postinstall.ts b/build/npm/postinstall.ts
-index ae2651c..3bc46fa 100644
+index dc154d4b..f5ef3c57 100644
--- a/build/npm/postinstall.ts
+++ b/build/npm/postinstall.ts
@@ -74,5 +74,7 @@ async function npmInstallAsync(dir: string, opts?: child_process.SpawnOptions):
- if (process.env['npm_config_arch'] === 'arm64') {
-- run('sudo', ['docker', 'run', '--rm', '--privileged', 'multiarch/qemu-user-static', '--reset', '-p', 'yes'], syncOpts);
+- run('sudo', ['docker', 'run', '--rm', '--privileged', 'vscodehub.azurecr.io/multiarch/qemu-user-static@sha256:fe60359c92e86a43cc87b3d906006245f77bfc0565676b80004cc666e4feb9f0', '--reset', '-p', 'yes'], syncOpts);
- }
+ const emulateArchList = ['arm64', 'arm', 'ppc64', 'riscv64', 's390x', 'loong64'];
+ if (process.env['DISABLE_QEMU'] !== 'true' && !!process.env['npm_config_arch'] && emulateArchList.includes(process.env['npm_config_arch'])) {
diff --git a/patches/linux/cli.patch b/patches/linux/00-cli-fix-unused.patch
similarity index 100%
rename from patches/linux/cli.patch
rename to patches/linux/00-cli-fix-unused.patch
diff --git a/patches/linux/update-xdg-path.patch b/patches/linux/00-env-improve-xdg-path.patch
similarity index 100%
rename from patches/linux/update-xdg-path.patch
rename to patches/linux/00-env-improve-xdg-path.patch
diff --git a/patches/linux/feat-logs-home.patch b/patches/linux/00-log-use-state-home.patch
similarity index 68%
rename from patches/linux/feat-logs-home.patch
rename to patches/linux/00-log-use-state-home.patch
index cdf6a4e85c6..cc49e37d96c 100644
--- a/patches/linux/feat-logs-home.patch
+++ b/patches/linux/00-log-use-state-home.patch
@@ -1,13 +1,13 @@
diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts
-index 4a14c83..59c963b 100644
+index 4fdf7227..fa05f304 100644
--- a/src/vs/platform/environment/common/environment.ts
+++ b/src/vs/platform/environment/common/environment.ts
-@@ -137,2 +137,3 @@ export interface INativeEnvironmentService extends IEnvironmentService {
+@@ -141,2 +141,3 @@ export interface INativeEnvironmentService extends IEnvironmentService {
userDataPath: string;
+ userStatePath: string;
diff --git a/src/vs/platform/environment/common/environmentService.ts b/src/vs/platform/environment/common/environmentService.ts
-index 535132f..edd76bc 100644
+index 004d0614..7f0af774 100644
--- a/src/vs/platform/environment/common/environmentService.ts
+++ b/src/vs/platform/environment/common/environmentService.ts
@@ -28,2 +28,4 @@ export interface INativeEnvironmentPaths {
@@ -27,22 +27,20 @@ index 535132f..edd76bc 100644
+ this.args.logsPath = join(this.userStatePath, key);
}
diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts
-index ae9e7e1..3c6c6c5 100644
+index 8652144b..62fc4ea6 100644
--- a/src/vs/platform/environment/node/environmentService.ts
+++ b/src/vs/platform/environment/node/environmentService.ts
@@ -11,2 +11,3 @@ import { getUserDataPath } from './userDataPath.js';
import { IProductService } from '../../product/common/productService.js';
+import { getUserStatePath } from './userStatePath.js';
-@@ -18,3 +19,4 @@ export class NativeEnvironmentService extends AbstractNativeEnvironmentService {
- tmpDir: tmpdir(),
-- userDataDir: getUserDataPath(args, productService.nameShort)
-+ userDataDir: getUserDataPath(args, productService.nameShort),
-+ userStateDir: getUserStatePath(args, productService.nameShort)
+@@ -20,2 +21,3 @@ export class NativeEnvironmentService extends AbstractNativeEnvironmentService {
+ userDataDir: getUserDataPath(args, productService.nameShort),
++ userStateDir: getUserStatePath(args, productService.nameShort),
}, productService);
diff --git a/src/vs/platform/environment/node/userStatePath.ts b/src/vs/platform/environment/node/userStatePath.ts
new file mode 100644
-index 0000000..53f9e2f
+index 00000000..53f9e2f1
--- /dev/null
+++ b/src/vs/platform/environment/node/userStatePath.ts
@@ -0,0 +1,42 @@
@@ -88,36 +86,57 @@ index 0000000..53f9e2f
+
+ return join(appStatePath, productName);
+}
+diff --git a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts
+index 37cd505a..9ae46919 100644
+--- a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts
++++ b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts
+@@ -24,4 +24,6 @@ class TestEnvironmentService extends AbstractNativeEnvironmentService {
+ const userDataDir = _appSettingsHome.fsPath.replace(/\/User$/, '');
++ const userStateDir = _appSettingsHome.fsPath.replace(/\/State/, '');
+ const paths: INativeEnvironmentPaths = {
+ userDataDir,
++ userStateDir,
+ homeDir: userDataDir,
+diff --git a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts
+index c8ec2ae6..e6ad98a3 100644
+--- a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts
++++ b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts
+@@ -25,4 +25,6 @@ class TestEnvironmentService extends AbstractNativeEnvironmentService {
+ const userDataDir = _appSettingsHome.fsPath.replace(/\/User$/, '');
++ const userStateDir = _appSettingsHome.fsPath.replace(/\/State/, '');
+ const paths: INativeEnvironmentPaths = {
+ userDataDir,
++ userStateDir,
+ homeDir: userDataDir,
diff --git a/src/vs/platform/window/common/window.ts b/src/vs/platform/window/common/window.ts
-index fa297d1..839fd60 100644
+index 291648bc..29c28d21 100644
--- a/src/vs/platform/window/common/window.ts
+++ b/src/vs/platform/window/common/window.ts
-@@ -443,2 +443,3 @@ export interface INativeWindowConfiguration extends IWindowConfiguration, Native
+@@ -444,2 +444,3 @@ export interface INativeWindowConfiguration extends IWindowConfiguration, Native
userDataDir: string;
+ userStateDir: string;
diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts
-index 117dfd2..6b0458b 100644
+index 9feeb83e..53975c9f 100644
--- a/src/vs/platform/windows/electron-main/windowsMainService.ts
+++ b/src/vs/platform/windows/electron-main/windowsMainService.ts
-@@ -1511,2 +1511,3 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
+@@ -1562,2 +1562,3 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
userDataDir: this.environmentMainService.userDataPath,
+ userStateDir: this.environmentMainService.userStatePath,
diff --git a/src/vs/workbench/services/environment/electron-browser/environmentService.ts b/src/vs/workbench/services/environment/electron-browser/environmentService.ts
-index 6cfa517..46286c6 100644
+index 1abd21a9..eafaaa1f 100644
--- a/src/vs/workbench/services/environment/electron-browser/environmentService.ts
+++ b/src/vs/workbench/services/environment/electron-browser/environmentService.ts
-@@ -153,3 +153,3 @@ export class NativeWorkbenchEnvironmentService extends AbstractNativeEnvironment
- ) {
-- super(configuration, { homeDir: configuration.homeDir, tmpDir: configuration.tmpDir, userDataDir: configuration.userDataDir }, productService);
-+ super(configuration, { homeDir: configuration.homeDir, tmpDir: configuration.tmpDir, userDataDir: configuration.userDataDir, userStateDir: configuration.userStateDir }, productService);
- }
+@@ -166,2 +166,3 @@ export class NativeWorkbenchEnvironmentService extends AbstractNativeEnvironment
+ userDataDir: configuration.userDataDir,
++ userStateDir: configuration.userStateDir,
+ },
diff --git a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts
-index 6b7307e..c74476a 100644
+index 7420d5e5..767502b0 100644
--- a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts
+++ b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts
-@@ -74,2 +74,3 @@ const TestNativeWindowConfiguration: INativeWindowConfiguration = {
+@@ -76,2 +76,3 @@ const TestNativeWindowConfiguration: INativeWindowConfiguration = {
userDataDir: joinPath(homeDir, product.nameShort).fsPath,
+ userStateDir: joinPath(homeDir, product.nameShort).fsPath,
profiles: { profile: NULL_PROFILE, all: [NULL_PROFILE], home: homeDir },
diff --git a/patches/linux/fix-global-policy.patch b/patches/linux/00-policy-use-custom-path.patch
similarity index 100%
rename from patches/linux/fix-global-policy.patch
rename to patches/linux/00-policy-use-custom-path.patch
diff --git a/patches/linux/fix-reh-bootstrap.patch b/patches/linux/00-remote-fix-bootstrap.patch
similarity index 100%
rename from patches/linux/fix-reh-bootstrap.patch
rename to patches/linux/00-remote-fix-bootstrap.patch
diff --git a/patches/linux/00-terminal-cmd-in-shell.patch b/patches/linux/00-terminal-cmd-in-shell.patch
new file mode 100644
index 00000000000..9bf4bc56cc6
--- /dev/null
+++ b/patches/linux/00-terminal-cmd-in-shell.patch
@@ -0,0 +1,13 @@
+diff --git a/src/vs/platform/externalTerminal/node/externalTerminalService.ts b/src/vs/platform/externalTerminal/node/externalTerminalService.ts
+index e7cf3f54588..80075787abf 100644
+--- a/src/vs/platform/externalTerminal/node/externalTerminalService.ts
++++ b/src/vs/platform/externalTerminal/node/externalTerminalService.ts
+@@ -327,7 +327,7 @@ export class LinuxExternalTerminalService extends ExternalTerminalService implem
+ const env = getSanitizedEnvironment(process);
+ const basename = path.basename(exec).toLowerCase();
+ const args = basename === 'ghostty' && cwd ? [`--working-directory=${cwd}`] : [];
+- const child = spawner.spawn(exec, args, { cwd, env });
++ const child = spawner.spawn(exec, args, { cwd, env, shell: true });
+ child.on('error', e);
+ child.on('exit', () => c());
+ });
diff --git a/patches/linux/fix-build.patch b/patches/linux/31-build-fix-dependencies.patch
similarity index 83%
rename from patches/linux/fix-build.patch
rename to patches/linux/31-build-fix-dependencies.patch
index f7479d157f3..05722881271 100644
--- a/patches/linux/fix-build.patch
+++ b/patches/linux/31-build-fix-dependencies.patch
@@ -1,5 +1,5 @@
diff --git a/build/linux/dependencies-generator.ts b/build/linux/dependencies-generator.ts
-index 874c802..04731cf 100644
+index eb1d73d0..29ec956e 100644
--- a/build/linux/dependencies-generator.ts
+++ b/build/linux/dependencies-generator.ts
@@ -13,3 +13,3 @@ import { type DebianArchString, isDebianArchString } from './debian/types.ts';
@@ -18,118 +18,34 @@ index 874c802..04731cf 100644
+ // files.push(path.join(buildDir, 'bin', product.tunnelApplicationName));
// Add the main executable.
diff --git a/build/package-lock.json b/build/package-lock.json
-index b78c4c8..58ee897 100644
+index db113606..a2d58933 100644
--- a/build/package-lock.json
+++ b/build/package-lock.json
@@ -17,3 +17,2 @@
"@electron/get": "^2.0.0",
- "@electron/osx-sign": "^2.0.0",
"@types/ansi-colors": "^3.2.0",
-@@ -106,5 +105,5 @@
- "node_modules/@azure/core-auth": {
-- "version": "1.9.0",
-- "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz",
-- "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==",
-+ "version": "1.10.1",
-+ "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz",
-+ "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==",
- "dev": true,
-@@ -112,4 +111,4 @@
- "dependencies": {
-- "@azure/abort-controller": "^2.0.0",
-- "@azure/core-util": "^1.11.0",
-+ "@azure/abort-controller": "^2.1.2",
-+ "@azure/core-util": "^1.13.0",
- "tslib": "^2.6.2"
-@@ -117,3 +116,3 @@
+@@ -121,3 +120,3 @@
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
-@@ -236,5 +235,5 @@
- "node_modules/@azure/core-rest-pipeline": {
-- "version": "1.18.0",
-- "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.0.tgz",
-- "integrity": "sha512-QSoGUp4Eq/gohEFNJaUOwTN7BCc2nHTjjbm75JT0aD7W65PWM1H/tItz0GsABn22uaKyGxiMhWQLt2r+FGU89Q==",
-+ "version": "1.22.2",
-+ "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz",
-+ "integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==",
- "dev": true,
-@@ -242,9 +241,8 @@
- "dependencies": {
-- "@azure/abort-controller": "^2.0.0",
-- "@azure/core-auth": "^1.8.0",
-- "@azure/core-tracing": "^1.0.1",
-- "@azure/core-util": "^1.11.0",
-- "@azure/logger": "^1.0.0",
-- "http-proxy-agent": "^7.0.0",
-- "https-proxy-agent": "^7.0.0",
-+ "@azure/abort-controller": "^2.1.2",
-+ "@azure/core-auth": "^1.10.0",
-+ "@azure/core-tracing": "^1.3.0",
-+ "@azure/core-util": "^1.13.0",
-+ "@azure/logger": "^1.3.0",
-+ "@typespec/ts-http-runtime": "^0.3.0",
- "tslib": "^2.6.2"
-@@ -252,3 +250,3 @@
+@@ -188,3 +187,3 @@
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
-@@ -269,5 +267,5 @@
- "node_modules/@azure/core-tracing": {
-- "version": "1.2.0",
-- "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz",
-- "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==",
-+ "version": "1.3.1",
-+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz",
-+ "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==",
- "dev": true,
-@@ -278,3 +276,3 @@
+@@ -201,3 +200,3 @@
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
-@@ -282,5 +280,5 @@
- "node_modules/@azure/core-util": {
-- "version": "1.11.0",
-- "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz",
-- "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==",
-+ "version": "1.13.1",
-+ "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz",
-+ "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==",
- "dev": true,
-@@ -288,3 +286,4 @@
- "dependencies": {
-- "@azure/abort-controller": "^2.0.0",
-+ "@azure/abort-controller": "^2.1.2",
-+ "@typespec/ts-http-runtime": "^0.3.0",
- "tslib": "^2.6.2"
-@@ -292,3 +291,3 @@
+@@ -352,3 +351,3 @@
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
-@@ -371,11 +370,13 @@
- "node_modules/@azure/logger": {
-- "version": "1.0.1",
-- "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.1.tgz",
-- "integrity": "sha512-QYQeaJ+A5x6aMNu8BG5qdsVBnYBop9UMwgUvGihSjf1PdZZXB+c/oMdM2ajKwzobLBh9e9QuMQkN9iL+IxLBLA==",
-+ "version": "1.3.0",
-+ "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz",
-+ "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==",
- "dev": true,
-+ "license": "MIT",
- "dependencies": {
-- "tslib": "^2.0.0"
-+ "@typespec/ts-http-runtime": "^0.3.0",
-+ "tslib": "^2.6.2"
- },
- "engines": {
-- "node": ">=8.0.0"
-+ "node": ">=20.0.0"
- }
-@@ -482,5 +483,5 @@
+@@ -447,5 +446,5 @@
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
@@ -138,7 +54,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"dev": true,
-@@ -539,50 +540,2 @@
+@@ -504,50 +503,2 @@
},
- "node_modules/@electron/osx-sign": {
- "version": "2.0.0",
@@ -189,7 +105,7 @@ index b78c4c8..58ee897 100644
- }
- },
"node_modules/@esbuild/aix-ppc64": {
-@@ -1367,5 +1320,5 @@
+@@ -1322,5 +1273,5 @@
"node_modules/@textlint/ast-node-types": {
- "version": "15.2.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz",
@@ -198,7 +114,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.4.1.tgz",
+ "integrity": "sha512-XifMpBMdo0E1Fuh85YdcYAgy+okNg9WKBzIPIO4JUDnSWUVFihnogrM4cjDapeHkgzSgulwR8oJVJ17eyxI1bA==",
"dev": true,
-@@ -1374,5 +1327,5 @@
+@@ -1329,5 +1280,5 @@
"node_modules/@textlint/linter-formatter": {
- "version": "15.2.2",
- "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.2.2.tgz",
@@ -207,7 +123,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.4.1.tgz",
+ "integrity": "sha512-kAV7Sup3vwvqxKvBbf9lx/JaPHkRybQp/LLvA73U1AorPZE6XyfBAFG24BbMiCs4OX1ax4g7kXRuFPgMLWRf+g==",
"dev": true,
-@@ -1382,8 +1335,8 @@
+@@ -1337,8 +1288,8 @@
"@azu/style-format": "^1.0.1",
- "@textlint/module-interop": "15.2.2",
- "@textlint/resolver": "15.2.2",
@@ -221,7 +137,7 @@ index b78c4c8..58ee897 100644
+ "debug": "^4.4.3",
+ "js-yaml": "^4.1.0",
"lodash": "^4.17.21",
-@@ -1459,2 +1412,9 @@
+@@ -1414,2 +1365,9 @@
},
+ "node_modules/@textlint/linter-formatter/node_modules/emoji-regex": {
+ "version": "8.0.0",
@@ -231,7 +147,7 @@ index b78c4c8..58ee897 100644
+ "license": "MIT"
+ },
"node_modules/@textlint/linter-formatter/node_modules/has-flag": {
-@@ -1476,2 +1436,17 @@
+@@ -1431,2 +1389,17 @@
},
+ "node_modules/@textlint/linter-formatter/node_modules/string-width": {
+ "version": "4.2.3",
@@ -249,7 +165,7 @@ index b78c4c8..58ee897 100644
+ }
+ },
"node_modules/@textlint/linter-formatter/node_modules/strip-ansi": {
-@@ -1503,5 +1478,5 @@
+@@ -1458,5 +1431,5 @@
"node_modules/@textlint/module-interop": {
- "version": "15.2.2",
- "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.2.2.tgz",
@@ -258,7 +174,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.4.1.tgz",
+ "integrity": "sha512-jHtM2E5CR68P3z/+FGrEU5pml2fQVzEo2sez9FEjrVHSPCrHtqHcPaKfsYbQJjc9C48ObwaWrCzRNaL3KedNCQ==",
"dev": true,
-@@ -1510,5 +1485,5 @@
+@@ -1465,5 +1438,5 @@
"node_modules/@textlint/resolver": {
- "version": "15.2.2",
- "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.2.2.tgz",
@@ -267,7 +183,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.4.1.tgz",
+ "integrity": "sha512-uVssyG3XXXKNY+O7NOajGvQZTyOuhPviwlq7Xek6ZT9K1eDQtA8074cPkAQoLMYhi/TUyOE5P5kpz42UF8Lmdw==",
"dev": true,
-@@ -1517,5 +1492,5 @@
+@@ -1472,5 +1445,5 @@
"node_modules/@textlint/types": {
- "version": "15.2.2",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.2.2.tgz",
@@ -276,12 +192,12 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.4.1.tgz",
+ "integrity": "sha512-WByVZ3zblbvuI+voWQplUP7seSTKXI9z6TMVXEB3dY3JFrZCIXWKNfLbETX5lZV7fYkCMaDtILO1l6s11wdbQA==",
"dev": true,
-@@ -1523,3 +1498,3 @@
+@@ -1478,3 +1451,3 @@
"dependencies": {
- "@textlint/ast-node-types": "15.2.2"
+ "@textlint/ast-node-types": "15.4.1"
}
-@@ -1617,12 +1592,2 @@
+@@ -1572,12 +1545,2 @@
},
- "node_modules/@types/graceful-fs": {
- "version": "4.1.9",
@@ -294,29 +210,16 @@ index b78c4c8..58ee897 100644
- }
- },
"node_modules/@types/gulp": {
-@@ -1944,2 +1909,17 @@
- },
-+ "node_modules/@typespec/ts-http-runtime": {
-+ "version": "0.3.2",
-+ "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz",
-+ "integrity": "sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==",
-+ "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/@vscode/iconv-lite-umd": {
-@@ -2270,2 +2250,3 @@
+@@ -1900,5 +1863,5 @@
+ "node_modules/@typespec/ts-http-runtime": {
+- "version": "0.3.5",
+- "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz",
+- "integrity": "sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==",
++ "version": "0.3.6",
++ "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz",
++ "integrity": "sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==",
"dev": true,
-+ "license": "ISC",
- "bin": {
-@@ -2347,5 +2328,5 @@
+@@ -2335,5 +2298,5 @@
"node_modules/ansi-escapes": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz",
@@ -325,11 +228,11 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz",
+ "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==",
"dev": true,
-@@ -2392,2 +2373,3 @@
+@@ -2380,2 +2343,3 @@
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
-@@ -2422,17 +2404,7 @@
+@@ -2410,17 +2374,7 @@
"node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -351,25 +254,25 @@ index b78c4c8..58ee897 100644
- "license": "BSD-3-Clause"
+ "license": "Python-2.0"
},
-@@ -2480,2 +2452,3 @@
+@@ -2468,2 +2422,3 @@
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
-@@ -2564,2 +2537,3 @@
+@@ -2552,2 +2507,3 @@
"dev": true,
+ "license": "MIT",
"optional": true,
-@@ -2575,3 +2549,4 @@
+@@ -2563,3 +2519,4 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
-@@ -2677,2 +2652,3 @@
+@@ -2681,2 +2638,3 @@
"dev": true,
+ "license": "MIT",
"dependencies": {
-@@ -2736,6 +2712,7 @@
+@@ -2740,6 +2698,7 @@
"node_modules/cheerio": {
- "version": "1.0.0-rc.12",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
@@ -380,7 +283,7 @@ index b78c4c8..58ee897 100644
"dev": true,
+ "license": "MIT",
"dependencies": {
-@@ -2744,9 +2721,13 @@
+@@ -2748,9 +2707,13 @@
"domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "htmlparser2": "^8.0.1",
@@ -399,7 +302,7 @@ index b78c4c8..58ee897 100644
- "node": ">= 6"
+ "node": ">=20.18.1"
},
-@@ -2961,6 +2942,7 @@
+@@ -2965,6 +2928,7 @@
"node_modules/css-what": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
@@ -410,13 +313,13 @@ index b78c4c8..58ee897 100644
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
-@@ -3119,3 +3101,4 @@
+@@ -3157,3 +3121,4 @@
}
- ]
+ ],
+ "license": "BSD-2-Clause"
},
-@@ -3137,6 +3120,7 @@
+@@ -3175,6 +3140,7 @@
"node_modules/domutils": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -427,12 +330,12 @@ index b78c4c8..58ee897 100644
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
-@@ -3144,3 +3128,3 @@
+@@ -3182,3 +3148,3 @@
"domelementtype": "^2.3.0",
- "domhandler": "^5.0.1"
+ "domhandler": "^5.0.3"
},
-@@ -3211,5 +3195,5 @@
+@@ -3249,5 +3215,5 @@
"node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -441,7 +344,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true,
-@@ -3217,2 +3201,16 @@
+@@ -3255,2 +3221,16 @@
},
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.1",
@@ -458,7 +361,7 @@ index b78c4c8..58ee897 100644
+ }
+ },
"node_modules/end-of-stream": {
-@@ -3227,6 +3225,7 @@
+@@ -3265,6 +3245,7 @@
"node_modules/entities": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
@@ -469,7 +372,7 @@ index b78c4c8..58ee897 100644
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
-@@ -3367,16 +3366,2 @@
+@@ -3405,16 +3386,2 @@
},
- "node_modules/esprima": {
- "version": "4.0.1",
@@ -486,19 +389,19 @@ index b78c4c8..58ee897 100644
- }
- },
"node_modules/events": {
-@@ -3418,2 +3403,3 @@
+@@ -3456,2 +3423,3 @@
"dev": true,
+ "license": "ISC",
"dependencies": {
-@@ -3617,2 +3603,3 @@
+@@ -3665,2 +3633,3 @@
"dev": true,
+ "license": "ISC",
"optional": true
-@@ -3924,2 +3911,3 @@
+@@ -3972,2 +3941,3 @@
"dev": true,
+ "license": "MIT",
"engines": {
-@@ -3983,5 +3971,5 @@
+@@ -4031,5 +4001,5 @@
"node_modules/htmlparser2": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
@@ -507,7 +410,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
+ "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
"dev": true,
-@@ -3994,7 +3982,21 @@
+@@ -4042,7 +4012,21 @@
],
+ "license": "MIT",
"dependencies": {
@@ -532,7 +435,7 @@ index b78c4c8..58ee897 100644
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
-@@ -4048,2 +4050,15 @@
+@@ -4096,2 +4080,15 @@
},
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
@@ -548,7 +451,7 @@ index b78c4c8..58ee897 100644
+ }
+ },
"node_modules/ieee754": {
-@@ -4080,5 +4095,5 @@
+@@ -4128,5 +4125,5 @@
"node_modules/index-to-position": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz",
@@ -557,11 +460,11 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
+ "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
"dev": true,
-@@ -4114,2 +4129,3 @@
+@@ -4162,2 +4159,3 @@
"dev": true,
+ "license": "MIT",
"optional": true
-@@ -4288,5 +4304,5 @@
+@@ -4360,5 +4358,5 @@
"node_modules/js-yaml": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
@@ -570,25 +473,25 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
-@@ -4294,4 +4310,3 @@
+@@ -4366,4 +4364,3 @@
"dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "argparse": "^2.0.1"
},
-@@ -4360,2 +4375,3 @@
- "dev": true,
-+ "license": "BSD-2-Clause",
- "dependencies": {
-@@ -4438,2 +4454,3 @@
+@@ -4486,2 +4483,3 @@
"hasInstallScript": true,
+ "license": "MIT",
"optional": true,
-@@ -4449,2 +4466,3 @@
+@@ -4497,2 +4495,3 @@
+ "dev": true,
++ "license": "BSD-2-Clause",
+ "dependencies": {
+@@ -4603,2 +4602,3 @@
"dev": true,
+ "license": "MIT",
"dependencies": {
-@@ -4531,9 +4549,2 @@
+@@ -4628,9 +4628,2 @@
},
- "node_modules/markdown-it/node_modules/argparse": {
- "version": "2.0.1",
@@ -598,19 +501,23 @@ index b78c4c8..58ee897 100644
- "license": "Python-2.0"
- },
"node_modules/matcher": {
-@@ -4543,2 +4554,3 @@
+@@ -4640,2 +4633,3 @@
"dev": true,
-+ "license": "(MIT OR WTFPL)",
++ "license": "MIT",
"optional": true,
-@@ -4556,2 +4568,3 @@
+@@ -4653,2 +4647,3 @@
"dev": true,
-+ "license": "MIT",
++ "license": "(MIT OR WTFPL)",
"optional": true,
-@@ -4693,2 +4706,3 @@
+@@ -4713,2 +4708,3 @@
"dev": true,
+ "license": "ISC",
+ "bin": {
+@@ -4791,2 +4787,3 @@
+ "dev": true,
++ "license": "MIT",
"optional": true
-@@ -4709,6 +4723,7 @@
+@@ -4807,6 +4804,7 @@
"node_modules/napi-build-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
@@ -621,11 +528,11 @@ index b78c4c8..58ee897 100644
"dev": true,
+ "license": "MIT",
"optional": true
-@@ -4755,2 +4770,3 @@
+@@ -4847,2 +4845,3 @@
"dev": true,
-+ "license": "MIT",
++ "license": "ISC",
"optional": true
-@@ -4770,5 +4786,5 @@
+@@ -4862,5 +4861,5 @@
"node_modules/node-sarif-builder": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.2.0.tgz",
@@ -634,12 +541,12 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.3.1.tgz",
+ "integrity": "sha512-8z5dAbhpxmk/WRQHXlv4V0h+9Y4Ugk+w08lyhV/7E/CQX9yDdBc3025/EG+RSMJU2aPFh/IQ7XDV7Ti5TLt/TA==",
"dev": true,
-@@ -4780,3 +4796,3 @@
+@@ -4872,3 +4871,3 @@
"engines": {
- "node": ">=18"
+ "node": ">=20"
}
-@@ -4857,5 +4873,5 @@
+@@ -4949,5 +4948,5 @@
"node_modules/normalize-package-data/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
@@ -648,7 +555,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
-@@ -4985,5 +5001,5 @@
+@@ -5079,5 +5078,5 @@
"node_modules/p-map": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
@@ -657,7 +564,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
+ "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==",
"dev": true,
-@@ -5063,8 +5079,9 @@
+@@ -5157,8 +5156,9 @@
"node_modules/parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
@@ -671,7 +578,7 @@ index b78c4c8..58ee897 100644
- "entities": "^4.4.0"
+ "entities": "^6.0.0"
},
-@@ -5075,8 +5092,22 @@
+@@ -5169,8 +5169,22 @@
"node_modules/parse5-htmlparser2-tree-adapter": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
@@ -698,7 +605,7 @@ index b78c4c8..58ee897 100644
"dependencies": {
- "domhandler": "^5.0.2",
"parse5": "^7.0.0"
-@@ -5087,2 +5118,15 @@
+@@ -5181,2 +5195,15 @@
},
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.1",
@@ -713,8 +620,8 @@ index b78c4c8..58ee897 100644
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
- "node_modules/path-is-absolute": {
-@@ -5106,5 +5150,5 @@
+ "node_modules/path-expression-matcher": {
+@@ -5216,5 +5243,5 @@
"node_modules/path-scurry": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
@@ -723,20 +630,20 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
"dev": true,
-@@ -5237,2 +5281,3 @@
+@@ -5296,2 +5323,3 @@
+ "dev": true,
++ "license": "ISC",
+ "dependencies": {
+@@ -5348,2 +5376,3 @@
"dev": true,
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
"optional": true,
-@@ -5244,3 +5289,3 @@
+@@ -5355,3 +5384,3 @@
"mkdirp-classic": "^0.5.3",
- "napi-build-utils": "^1.0.1",
+ "napi-build-utils": "^2.0.0",
"node-abi": "^3.3.0",
-@@ -5292,2 +5337,3 @@
- "dev": true,
-+ "license": "ISC",
- "dependencies": {
-@@ -5385,22 +5431,2 @@
+@@ -5490,22 +5519,2 @@
},
- "node_modules/rc-config-loader/node_modules/argparse": {
- "version": "2.0.1",
@@ -759,7 +666,11 @@ index b78c4c8..58ee897 100644
- }
- },
"node_modules/read": {
-@@ -5591,7 +5617,15 @@
+@@ -5653,2 +5662,3 @@
+ "dev": true,
++ "license": "MIT",
+ "optional": true,
+@@ -5709,7 +5719,15 @@
},
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
@@ -779,27 +690,23 @@ index b78c4c8..58ee897 100644
+ "dev": true,
+ "license": "ISC"
},
-@@ -5642,2 +5676,3 @@
+@@ -5760,2 +5778,3 @@
"dev": true,
+ "license": "MIT",
"optional": true
-@@ -5649,2 +5684,3 @@
- "dev": true,
-+ "license": "MIT",
- "optional": true,
-@@ -5789,2 +5825,3 @@
+@@ -5907,2 +5926,3 @@
],
+ "license": "BSD-3-Clause",
"optional": true
-@@ -5810,2 +5847,3 @@
+@@ -5928,2 +5948,3 @@
],
+ "license": "MIT",
"optional": true,
-@@ -5889,2 +5927,3 @@
+@@ -6007,2 +6028,3 @@
"dev": true,
+ "license": "MIT",
"engines": {
-@@ -5968,5 +6007,5 @@
+@@ -6076,5 +6098,5 @@
"node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -808,7 +715,7 @@ index b78c4c8..58ee897 100644
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
-@@ -5990,31 +6029,11 @@
+@@ -6098,31 +6120,11 @@
"dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
@@ -846,7 +753,7 @@ index b78c4c8..58ee897 100644
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
-@@ -6031,2 +6050,9 @@
+@@ -6139,2 +6141,9 @@
},
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "8.0.0",
@@ -856,18 +763,18 @@ index b78c4c8..58ee897 100644
+ "license": "MIT"
+ },
"node_modules/string-width/node_modules/strip-ansi": {
-@@ -6124,4 +6150,5 @@
+@@ -6232,4 +6241,5 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"dev": true,
+ "license": "MIT",
"optional": true,
-@@ -6159,2 +6186,3 @@
+@@ -6267,2 +6277,3 @@
"dev": true,
+ "license": "MIT",
"dependencies": {
-@@ -6245,2 +6273,24 @@
+@@ -6353,2 +6364,24 @@
},
+ "node_modules/table/node_modules/emoji-regex": {
+ "version": "8.0.0",
@@ -892,23 +799,14 @@ index b78c4c8..58ee897 100644
+ }
+ },
"node_modules/table/node_modules/strip-ansi": {
-@@ -6376,5 +6426,5 @@
- "node_modules/tmp": {
-- "version": "0.2.4",
-- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz",
-- "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==",
-+ "version": "0.2.5",
-+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
-+ "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
- "dev": true,
-@@ -6500,4 +6550,5 @@
+@@ -6608,4 +6641,5 @@
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
+ "license": "Apache-2.0",
"optional": true,
-@@ -6549,2 +6600,12 @@
+@@ -6657,2 +6691,12 @@
},
+ "node_modules/undici": {
+ "version": "7.16.0",
@@ -921,13 +819,13 @@ index b78c4c8..58ee897 100644
+ }
+ },
"node_modules/undici-types": {
-@@ -6588,3 +6649,4 @@
+@@ -6690,3 +6734,4 @@
"integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
-@@ -6768,2 +6830,25 @@
+@@ -6862,2 +6907,25 @@
},
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
@@ -953,7 +851,7 @@ index b78c4c8..58ee897 100644
+ }
+ },
"node_modules/which": {
-@@ -6872,2 +6957,24 @@
+@@ -6966,2 +7034,24 @@
},
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
@@ -978,7 +876,7 @@ index b78c4c8..58ee897 100644
+ }
+ },
"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
-@@ -6898,27 +7005,2 @@
+@@ -6992,27 +7082,2 @@
},
- "node_modules/wrap-ansi/node_modules/emoji-regex": {
- "version": "9.2.2",
@@ -1006,7 +904,7 @@ index b78c4c8..58ee897 100644
- }
- },
"node_modules/wrappy": {
-@@ -6975,2 +7057,47 @@
+@@ -7085,2 +7150,47 @@
},
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "5.0.1",
@@ -1055,10 +953,106 @@ index b78c4c8..58ee897 100644
+ },
"node_modules/yauzl": {
diff --git a/build/package.json b/build/package.json
-index 785f04f..e523427 100644
+index e12cb930..47301b94 100644
--- a/build/package.json
+++ b/build/package.json
@@ -11,3 +11,2 @@
"@electron/get": "^2.0.0",
- "@electron/osx-sign": "^2.0.0",
"@types/ansi-colors": "^3.2.0",
+diff --git a/package-lock.json b/package-lock.json
+index 81d315f0..9bb1f3ef 100644
+--- a/package-lock.json
++++ b/package-lock.json
+@@ -5741,2 +5741,11 @@
+ },
++ "node_modules/buildcheck": {
++ "version": "0.0.7",
++ "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz",
++ "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==",
++ "optional": true,
++ "engines": {
++ "node": ">=10.0.0"
++ }
++ },
+ "node_modules/bundle-name": {
+@@ -6547,2 +6556,16 @@
+ },
++ "node_modules/cpu-features": {
++ "version": "0.0.10",
++ "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
++ "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
++ "hasInstallScript": true,
++ "optional": true,
++ "dependencies": {
++ "buildcheck": "~0.0.6",
++ "nan": "^2.19.0"
++ },
++ "engines": {
++ "node": ">=10.0.0"
++ }
++ },
+ "node_modules/cross-spawn": {
+@@ -17541,5 +17564,2 @@
+ },
+- "node_modules/ssh2/node_modules/cpu-features": {
+- "optional": true
+- },
+ "node_modules/stable": {
+diff --git a/package.json b/package.json
+index 36485330..57661aee 100644
+--- a/package.json
++++ b/package.json
+@@ -273,3 +273,3 @@
+ "ssh2": {
+- "cpu-features": "0.0.0"
++ "cpu-features": "0.0.10"
+ },
+diff --git a/remote/package-lock.json b/remote/package-lock.json
+index a829c6d5..7397ebd3 100644
+--- a/remote/package-lock.json
++++ b/remote/package-lock.json
+@@ -1053,2 +1053,11 @@
+ },
++ "node_modules/buildcheck": {
++ "version": "0.0.7",
++ "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz",
++ "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==",
++ "optional": true,
++ "engines": {
++ "node": ">=10.0.0"
++ }
++ },
+ "node_modules/chownr": {
+@@ -1076,2 +1085,16 @@
+ },
++ "node_modules/cpu-features": {
++ "version": "0.0.10",
++ "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
++ "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
++ "hasInstallScript": true,
++ "optional": true,
++ "dependencies": {
++ "buildcheck": "~0.0.6",
++ "nan": "^2.19.0"
++ },
++ "engines": {
++ "node": ">=10.0.0"
++ }
++ },
+ "node_modules/debug": {
+@@ -1682,5 +1705,2 @@
+ },
+- "node_modules/ssh2/node_modules/cpu-features": {
+- "optional": true
+- },
+ "node_modules/string_decoder": {
+diff --git a/remote/package.json b/remote/package.json
+index 879eb7d6..7332cf03 100644
+--- a/remote/package.json
++++ b/remote/package.json
+@@ -61,3 +61,3 @@
+ "ssh2": {
+- "cpu-features": "0.0.0"
++ "cpu-features": "0.0.10"
+ },
diff --git a/patches/linux/arch-0-support.patch b/patches/linux/41-arch-add-support.patch
similarity index 61%
rename from patches/linux/arch-0-support.patch
rename to patches/linux/41-arch-add-support.patch
index 65e8f4794ab..4394112b736 100644
--- a/patches/linux/arch-0-support.patch
+++ b/patches/linux/41-arch-add-support.patch
@@ -1,5 +1,5 @@
diff --git a/build/azure-pipelines/linux/setup-env.sh b/build/azure-pipelines/linux/setup-env.sh
-index f0d5fe6..fdb3707 100755
+index 2f275d15..d844eb03 100755
--- a/build/azure-pipelines/linux/setup-env.sh
+++ b/build/azure-pipelines/linux/setup-env.sh
@@ -2,3 +2,3 @@
@@ -13,71 +13,93 @@ index f0d5fe6..fdb3707 100755
+ SYSROOT_ARCH="$SYSROOT_ARCH" VSCODE_SYSROOT_DIR="$VSCODE_REMOTE_SYSROOT_DIR" node -e 'import { getVSCodeSysroot } from "./build/linux/debian/install-sysroot.ts"; (async () => { await getVSCodeSysroot(process.env["SYSROOT_ARCH"]); })()'
fi
diff --git a/build/gulpfile.reh.ts b/build/gulpfile.reh.ts
-index 8e7f6bb..0874203 100644
+index 62c30da5..85817274 100644
--- a/build/gulpfile.reh.ts
+++ b/build/gulpfile.reh.ts
-@@ -239,9 +239,23 @@ function nodejs(platform: string, arch: string): NodeJS.ReadWriteStream | undefi
- case 'linux':
-- return (product.nodejsRepository !== 'https://nodejs.org' ?
+@@ -275,9 +276,34 @@ function nodejs(platform: string, arch: string): NodeJS.ReadWriteStream | undefi
+ case 'linux': {
+- const downloaded = (product.nodejsRepository !== 'https://nodejs.org' ?
- fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName!, checksumSha256 }) :
- fetchUrls(`/dist/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}.tar.gz`, { base: 'https://nodejs.org', checksumSha256 })
- ).pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
- .pipe(filter('**/node'))
- .pipe(util.setExecutableBit('**'))
- .pipe(rename('node'));
-+ if (process.env.VSCODE_NODEJS_SITE && process.env.VSCODE_NODEJS_URLROOT) {
-+ return fetchUrls(`${process.env.VSCODE_NODEJS_URLROOT}/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}${process.env.VSCODE_NODEJS_URLSUFFIX}.tar.gz`, { base: process.env.VSCODE_NODEJS_SITE, checksumSha256 })
++ let downloaded: NodeJS.ReadWriteStream;
++ if (process.env.VSCODE_NODEJS_REPOSITORY) {
++ const nodejsVersion = (process.env.VSCODE_NODEJS_TAG ?? `${nodeVersion}-${internalNodeVersion}`).replace(/^v/, '');
++ const nodejsName = process.env.VSCODE_NODEJS_NAME ?? expectedName!;
++ const nodejsChecksumSha256 = getNodeChecksum(nodejsName) ?? checksumSha256;
++ downloaded = fetchGithub(process.env.VSCODE_NODEJS_REPOSITORY, { version: nodejsVersion, name: nodejsName, checksumSha256: nodejsChecksumSha256 })
+ .pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
+ .pipe(filter('**/node'))
+ .pipe(util.setExecutableBit('**'))
+ .pipe(rename('node'));
+ }
-+ if (product.nodejsRepository !== 'https://nodejs.org') {
-+ return fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName!, checksumSha256 })
++ else if (process.env.VSCODE_NODEJS_SITE && process.env.VSCODE_NODEJS_URLROOT) {
++ downloaded = fetchUrls(`${process.env.VSCODE_NODEJS_URLROOT}/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}${process.env.VSCODE_NODEJS_URLSUFFIX}.tar.gz`, { base: process.env.VSCODE_NODEJS_SITE, checksumSha256 })
++ .pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
++ .pipe(filter('**/node'))
++ .pipe(util.setExecutableBit('**'))
++ .pipe(rename('node'));
++ }
++ else if (product.nodejsRepository !== 'https://nodejs.org') {
++ downloaded = fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName!, checksumSha256 })
+ .pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
+ .pipe(filter('**/node'))
+ .pipe(util.setExecutableBit('**'))
+ .pipe(rename('node'));
+ }
+ else {
-+ return fetchUrls(`/dist/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}.tar.gz`, { base: 'https://nodejs.org', checksumSha256 })
++ downloaded = fetchUrls(`/dist/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}.tar.gz`, { base: 'https://nodejs.org', checksumSha256 })
+ .pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
+ .pipe(filter('**/node'))
+ .pipe(util.setExecutableBit('**'))
+ .pipe(rename('node'));
+ }
- case 'alpine':
+ return platform === 'linux' && arch === 'x64' ? downloaded.pipe(patchElfLoadAlign()) : downloaded;
diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
-index 25a3600..c9402f3 100644
+index 53987f88..50e75b95 100644
--- a/build/gulpfile.vscode.ts
+++ b/build/gulpfile.vscode.ts
-@@ -516,4 +516,15 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
+@@ -425,4 +425,17 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
+ const electronOverride: { repo?: string; tag?: string } = {};
+ if (process.env.VSCODE_ELECTRON_REPOSITORY) {
+ // official electron doesn't support all arch, override the repo with `VSCODE_ELECTRON_REPOSITORY`.
+ electronOverride.repo = process.env.VSCODE_ELECTRON_REPOSITORY;
++ console.log('Using Electron Repository:', electronOverride.repo);
+ }
+
+ if (process.env.VSCODE_ELECTRON_TAG) {
+ electronOverride.tag = process.env.VSCODE_ELECTRON_TAG;
++ console.log('Using Electron Tag:', electronOverride.tag);
+ }
+
const electronConfig = {
...config,
+ ...electronOverride,
platform,
+diff --git a/build/lib/electron.ts b/build/lib/electron.ts
+index 016c25f7..a04f56bb 100644
+--- a/build/lib/electron.ts
++++ b/build/lib/electron.ts
+@@ -103,3 +103,3 @@ function darwinBundleDocumentTypes(types: { [name: string]: string | string[] },
+ const { msBuildId } = util.getElectronVersion();
+-const electronVersion = '42.2.0';
++const electronVersion = process.env.VSCODE_ELECTRON_VERSION ?? '42.2.0';
+
diff --git a/build/linux/debian/dep-lists.ts b/build/linux/debian/dep-lists.ts
-index 46c257d..78bfb66 100644
+index 7690e25d..42692905 100644
--- a/build/linux/debian/dep-lists.ts
+++ b/build/linux/debian/dep-lists.ts
-@@ -141,3 +141,3 @@ export const referenceGeneratedDepsByArch = {
+@@ -143,3 +143,3 @@ export const referenceGeneratedDepsByArch = {
'xdg-utils (>= 1.0.2)'
- ]
+ ],
};
diff --git a/build/linux/debian/install-sysroot.ts b/build/linux/debian/install-sysroot.ts
-index 0dfc69a..7b6ac8b 100644
+index 0dfc69a0..7b6ac8bb 100644
--- a/build/linux/debian/install-sysroot.ts
+++ b/build/linux/debian/install-sysroot.ts
@@ -82,3 +82,5 @@ async function fetchUrl(options: IFetchOptions, retries = 10, retryDelay = 1000)
diff --git a/patches/linux/arch-1-ppc64le.patch b/patches/linux/42-arch-add-ppc64le.patch
similarity index 86%
rename from patches/linux/arch-1-ppc64le.patch
rename to patches/linux/42-arch-add-ppc64le.patch
index f94aa0f866e..a8909135aca 100644
--- a/patches/linux/arch-1-ppc64le.patch
+++ b/patches/linux/42-arch-add-ppc64le.patch
@@ -1,8 +1,8 @@
diff --git a/build/azure-pipelines/linux/setup-env.sh b/build/azure-pipelines/linux/setup-env.sh
-index fdb3707..67bc741 100755
+index d844eb03..e18eb1c1 100755
--- a/build/azure-pipelines/linux/setup-env.sh
+++ b/build/azure-pipelines/linux/setup-env.sh
-@@ -76,2 +76,14 @@ elif [ "$npm_config_arch" == "arm" ]; then
+@@ -90,2 +90,14 @@ elif [ "$npm_config_arch" == "arm" ]; then
export VSCODE_REMOTE_LDFLAGS="--sysroot=$VSCODE_REMOTE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot -L$VSCODE_REMOTE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/arm-linux-gnueabihf -L$VSCODE_REMOTE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/lib/arm-linux-gnueabihf"
+elif [ "$npm_config_arch" == "ppc64" ]; then
+ # Set compiler toolchain for client native modules
@@ -18,7 +18,7 @@ index fdb3707..67bc741 100755
+ export VSCODE_REMOTE_LDFLAGS="--sysroot=$VSCODE_REMOTE_SYSROOT_DIR/powerpc64le-linux-gnu/powerpc64le-linux-gnu/sysroot -L$VSCODE_REMOTE_SYSROOT_DIR/powerpc64le-linux-gnu/powerpc64le-linux-gnu/sysroot/usr/lib/powerpc64le-linux-gnu -L$VSCODE_REMOTE_SYSROOT_DIR/powerpc64le-linux-gnu/powerpc64le-linux-gnu/sysroot/lib/powerpc64le-linux-gnu"
fi
diff --git a/build/azure-pipelines/linux/verify-glibc-requirements.sh b/build/azure-pipelines/linux/verify-glibc-requirements.sh
-index 5294177..1e33aeb 100755
+index 52941776..1e33aebb 100755
--- a/build/azure-pipelines/linux/verify-glibc-requirements.sh
+++ b/build/azure-pipelines/linux/verify-glibc-requirements.sh
@@ -9,2 +9,4 @@ elif [ "$VSCODE_ARCH" == "armhf" ]; then
@@ -27,37 +27,38 @@ index 5294177..1e33aeb 100755
+ TRIPLE="powerpc64le-linux-gnu"
fi
diff --git a/build/checksums/vscode-sysroot.txt b/build/checksums/vscode-sysroot.txt
-index 847383e..37186f4 100644
+index 847383e7..04962e71 100644
--- a/build/checksums/vscode-sysroot.txt
+++ b/build/checksums/vscode-sysroot.txt
-@@ -7 +7,2 @@ ac4b6b14b4cec027a22a51bbbb049b3504958a78106c8a8d5cec144206b767d1 x86_64-linux-g
+@@ -7 +7,3 @@ ac4b6b14b4cec027a22a51bbbb049b3504958a78106c8a8d5cec144206b767d1 x86_64-linux-g
1ebb6ef1fe2983269fd0855a88f9c9a37f9b515d16524a9146198e4cabdf34f7 x86_64-linux-gnu-glibc-2.28-gcc-8.5.0.tar.gz
+fa8176d27be18bb0eeb7f55b0fa22255050b430ef68c29136599f02976eb0b1b powerpc64le-linux-gnu-glibc-2.28.tar.gz
++2d1a21d3ed310a62e229f056839cccd52c96c7d7c63542b7ba7c34ff20a3f832 powerpc64le-linux-gnu-glibc-2.28-gcc-10.5.0.tar.gz
diff --git a/build/gulpfile.reh.ts b/build/gulpfile.reh.ts
-index 012df0b..a7da071 100644
+index 8ecd10b2..469b73e8 100644
--- a/build/gulpfile.reh.ts
+++ b/build/gulpfile.reh.ts
-@@ -52,2 +52,3 @@ const BUILD_TARGETS = [
+@@ -51,2 +51,3 @@ const BUILD_TARGETS = [
{ platform: 'linux', arch: 'arm64' },
+ { platform: 'linux', arch: 'ppc64le' },
{ platform: 'alpine', arch: 'arm64' },
diff --git a/build/gulpfile.scan.ts b/build/gulpfile.scan.ts
-index 19e50c0..47b25cf 100644
+index 972b335a..6d3d8991 100644
--- a/build/gulpfile.scan.ts
+++ b/build/gulpfile.scan.ts
-@@ -24,2 +24,3 @@ const BUILD_TARGETS = [
+@@ -23,2 +23,3 @@ const BUILD_TARGETS = [
{ platform: 'linux', arch: 'arm64' },
+ { platform: 'linux', arch: 'ppc64le' },
];
diff --git a/build/gulpfile.vscode.linux.ts b/build/gulpfile.vscode.linux.ts
-index c5d2163..da4fc1f 100644
+index 45179160..18454fd9 100644
--- a/build/gulpfile.vscode.linux.ts
+++ b/build/gulpfile.vscode.linux.ts
-@@ -32,2 +32,3 @@ function getDebPackageArch(arch: string): string {
+@@ -31,2 +31,3 @@ function getDebPackageArch(arch: string): string {
case 'arm64': return 'arm64';
+ case 'ppc64le': return 'ppc64el';
default: throw new Error(`Unknown arch: ${arch}`);
-@@ -142,2 +143,3 @@ function getRpmPackageArch(arch: string): string {
+@@ -141,2 +142,3 @@ function getRpmPackageArch(arch: string): string {
case 'arm64': return 'aarch64';
+ case 'ppc64le': return 'ppc64le';
default: throw new Error(`Unknown arch: ${arch}`);
@@ -66,15 +67,15 @@ index c5d2163..da4fc1f 100644
+ { arch: 'ppc64le' },
];
diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
-index ce46a41..3389ede 100644
+index d192dd89..8bec6a04 100644
--- a/build/gulpfile.vscode.ts
+++ b/build/gulpfile.vscode.ts
-@@ -614,2 +614,3 @@ const BUILD_TARGETS = [
+@@ -641,2 +641,3 @@ const BUILD_TARGETS = [
{ platform: 'linux', arch: 'arm64' },
+ { platform: 'linux', arch: 'ppc64le' },
];
diff --git a/build/linux/debian/calculate-deps.ts b/build/linux/debian/calculate-deps.ts
-index 98a9630..6c6bbf5 100644
+index 98a96302..6c6bbf55 100644
--- a/build/linux/debian/calculate-deps.ts
+++ b/build/linux/debian/calculate-deps.ts
@@ -61,2 +61,9 @@ function calculatePackageDeps(binaryPath: string, arch: DebianArchString, chromi
@@ -88,10 +89,10 @@ index 98a9630..6c6bbf5 100644
+ break;
}
diff --git a/build/linux/debian/dep-lists.ts b/build/linux/debian/dep-lists.ts
-index 78bfb66..5acd3a0 100644
+index 42692905..0601c349 100644
--- a/build/linux/debian/dep-lists.ts
+++ b/build/linux/debian/dep-lists.ts
-@@ -142,2 +142,41 @@ export const referenceGeneratedDepsByArch = {
+@@ -144,2 +144,41 @@ export const referenceGeneratedDepsByArch = {
],
+ 'ppc64el': [
+ 'ca-certificates',
@@ -134,18 +135,19 @@ index 78bfb66..5acd3a0 100644
+ ],
};
diff --git a/build/linux/debian/install-sysroot.ts b/build/linux/debian/install-sysroot.ts
-index 7b6ac8b..dde47ba 100644
+index 7b6ac8bb..ef7dd2ba 100644
--- a/build/linux/debian/install-sysroot.ts
+++ b/build/linux/debian/install-sysroot.ts
-@@ -158,2 +158,6 @@ export async function getVSCodeSysroot(arch: DebianArchString, isMusl: boolean =
+@@ -158,2 +158,7 @@ export async function getVSCodeSysroot(arch: DebianArchString, isMusl: boolean =
break;
+ case 'ppc64le':
++ case 'ppc64el':
+ expectedName = `powerpc64le-linux-gnu${prefix}.tar.gz`;
+ triple = `powerpc64le-linux-gnu`;
+ break;
}
diff --git a/build/linux/debian/types.ts b/build/linux/debian/types.ts
-index e97485e..c56d067 100644
+index e97485ef..c56d0678 100644
--- a/build/linux/debian/types.ts
+++ b/build/linux/debian/types.ts
@@ -5,6 +5,6 @@
@@ -158,10 +160,10 @@ index e97485e..c56d067 100644
+ return ['amd64', 'armhf', 'arm64', 'ppc64el', 'ppc64le'].includes(s);
}
diff --git a/build/linux/rpm/dep-lists.ts b/build/linux/rpm/dep-lists.ts
-index 0424c8d..c7e0820 100644
+index e9f414e4..887e9275 100644
--- a/build/linux/rpm/dep-lists.ts
+++ b/build/linux/rpm/dep-lists.ts
-@@ -318,2 +318,102 @@ export const referenceGeneratedDepsByArch = {
+@@ -335,2 +335,102 @@ export const referenceGeneratedDepsByArch = {
'xdg-utils'
+ ],
+ "ppc64le": [
@@ -265,7 +267,7 @@ index 0424c8d..c7e0820 100644
+ 'xdg-utils'
]
diff --git a/build/linux/rpm/types.ts b/build/linux/rpm/types.ts
-index c6a01da..3f3c3f5 100644
+index c6a01da1..3f3c3f5f 100644
--- a/build/linux/rpm/types.ts
+++ b/build/linux/rpm/types.ts
@@ -5,6 +5,6 @@
@@ -278,41 +280,46 @@ index c6a01da..3f3c3f5 100644
+ return ['x86_64', 'armv7hl', 'aarch64', 'ppc64le'].includes(s);
}
diff --git a/cli/src/update_service.rs b/cli/src/update_service.rs
-index 3b7ef5c..ec97760 100644
+index 82d2814c..69367048 100644
--- a/cli/src/update_service.rs
+++ b/cli/src/update_service.rs
-@@ -183,2 +183,3 @@ pub enum Platform {
+@@ -179,2 +179,3 @@ pub enum Platform {
LinuxARM32Legacy,
+ LinuxPPC64LE,
DarwinX64,
-@@ -201,2 +202,3 @@ impl Platform {
+@@ -197,2 +198,3 @@ impl Platform {
Platform::LinuxARM32Legacy => "armhf",
+ Platform::LinuxPPC64LE => "ppc64le",
Platform::DarwinX64 => "x64",
-@@ -220,2 +222,3 @@ impl Platform {
+@@ -216,2 +218,3 @@ impl Platform {
Platform::LinuxARM32Legacy => "linux",
+ Platform::LinuxPPC64LE => "linux",
Platform::DarwinX64 => "darwin",
-@@ -248,2 +251,4 @@ impl Platform {
+@@ -244,2 +247,4 @@ impl Platform {
Some(Platform::LinuxARM64)
+ } else if cfg!(all(target_os = "linux", target_arch = "powerpc64")) {
+ Some(Platform::LinuxPPC64LE)
} else if cfg!(all(target_os = "macos", target_arch = "x86_64")) {
-@@ -275,2 +280,3 @@ impl fmt::Display for Platform {
+@@ -271,2 +276,3 @@ impl fmt::Display for Platform {
Platform::LinuxARM32Legacy => "LinuxARM32Legacy",
+ Platform::LinuxPPC64LE => "LinuxPPC64LE",
Platform::DarwinX64 => "DarwinX64",
diff --git a/cli/src/util/prereqs.rs b/cli/src/util/prereqs.rs
-index 44c8597..679aacb 100644
+index 83dd024b..e499af60 100644
--- a/cli/src/util/prereqs.rs
+++ b/cli/src/util/prereqs.rs
-@@ -82,2 +82,4 @@ impl PreReqChecker {
+@@ -83,2 +83,4 @@ impl PreReqChecker {
Platform::LinuxARM32
+ } else if cfg!(target_arch = "powerpc64") {
+ Platform::LinuxPPC64LE
} else {
+@@ -208,2 +210,4 @@ async fn check_glibcxx_version() -> Result {
+ const DEFAULT_LIB_PATH: &str = "/usr/lib64/libstdc++.so.6";
++ #[cfg(target_arch = "powerpc64")]
++ const DEFAULT_LIB_PATH: &str = "/usr/lib64/libstdc++.so.6";
+ #[cfg(any(target_arch = "x86", target_arch = "arm"))]
diff --git a/resources/server/bin/helpers/check-requirements-linux.sh b/resources/server/bin/helpers/check-requirements-linux.sh
-index 8ea4c0b..94028e3 100644
+index 8ea4c0b5..94028e34 100644
--- a/resources/server/bin/helpers/check-requirements-linux.sh
+++ b/resources/server/bin/helpers/check-requirements-linux.sh
@@ -55,2 +55,3 @@ case $ARCH in
@@ -320,28 +327,28 @@ index 8ea4c0b..94028e3 100644
+ ppc64le) LDCONFIG_ARCH="64bit";;
esac
diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts
-index ab11f6b..fd1ec31 100644
+index 7b0415e4..26197506 100644
--- a/src/vs/platform/extensionManagement/common/extensionManagement.ts
+++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts
-@@ -48,2 +48,3 @@ export function TargetPlatformToString(targetPlatform: TargetPlatform) {
+@@ -49,2 +49,3 @@ export function TargetPlatformToString(targetPlatform: TargetPlatform) {
case TargetPlatform.LINUX_ARMHF: return 'Linux ARM';
+ case TargetPlatform.LINUX_PPC64LE: return 'Linux PowerPC64';
-@@ -71,2 +72,3 @@ export function toTargetPlatform(targetPlatform: string): TargetPlatform {
+@@ -72,2 +73,3 @@ export function toTargetPlatform(targetPlatform: string): TargetPlatform {
case TargetPlatform.LINUX_ARMHF: return TargetPlatform.LINUX_ARMHF;
+ case TargetPlatform.LINUX_PPC64LE: return TargetPlatform.LINUX_PPC64LE;
-@@ -106,2 +108,5 @@ export function getTargetPlatform(platform: Platform | 'alpine', arch: string |
+@@ -107,2 +109,5 @@ export function getTargetPlatform(platform: Platform | 'alpine', arch: string |
}
+ if (arch === 'ppc64le') {
+ return TargetPlatform.LINUX_PPC64LE;
+ }
return TargetPlatform.UNKNOWN;
diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts
-index 021ad01..60cd058 100644
+index e26d74e2..5fb399dd 100644
--- a/src/vs/platform/extensions/common/extensions.ts
+++ b/src/vs/platform/extensions/common/extensions.ts
-@@ -342,2 +342,3 @@ export const enum TargetPlatform {
+@@ -345,2 +345,3 @@ export const enum TargetPlatform {
LINUX_ARMHF = 'linux-armhf',
+ LINUX_PPC64LE = 'linux-ppc64le',
diff --git a/patches/linux/arch-2-riscv64.patch b/patches/linux/43-arch-add-riscv64.patch
similarity index 92%
rename from patches/linux/arch-2-riscv64.patch
rename to patches/linux/43-arch-add-riscv64.patch
index 637d8085b3f..2fa0895f36a 100644
--- a/patches/linux/arch-2-riscv64.patch
+++ b/patches/linux/43-arch-add-riscv64.patch
@@ -6,6 +6,16 @@ index f986b4e..557990e 100644
{ platform: 'linux', arch: 'ppc64le' },
+ { platform: 'linux', arch: 'riscv64' },
{ platform: 'alpine', arch: 'arm64' },
+diff --git a/build/checksums/nodejs.txt b/build/checksums/nodejs.txt
+index 12a2a80d..8d429dc4 100644
+--- a/build/checksums/nodejs.txt
++++ b/build/checksums/nodejs.txt
+@@ -2,4 +2,5 @@
+ ffd5ee293467927f3ee731a553eb88fd1f48cf74eebc2d74a6babe4af228673b node-v24.15.0-darwin-x64.tar.gz
+ 73afc234d558c24919875f51c2d1ea002a2ada4ea6f83601a383869fefa64eed node-v24.15.0-linux-arm64.tar.gz
+ 44836872d9aec49f1e6b52a9a922872db9a2b02d235a616a5681b6a85fec8d89 node-v24.15.0-linux-x64.tar.gz
++65109e57e34279184efcca5888bc156cff3d24bf8eead73de16a28a313c18884 node-v24.18.0-linux-riscv64-local1.tar.gz
+ 49a54c103f4919ce64199a043ef5cd309507de491d718085edee089cd8e87543 win-arm64/node.exe
diff --git a/build/gulpfile.scan.ts b/build/gulpfile.scan.ts
index 47b25cf..dd5bb56 100644
--- a/build/gulpfile.scan.ts
diff --git a/patches/linux/arch-3-loong64.patch b/patches/linux/44-arch-add-loong64.patch
similarity index 100%
rename from patches/linux/arch-3-loong64.patch
rename to patches/linux/44-arch-add-loong64.patch
diff --git a/patches/linux/arch-4-s390x.patch b/patches/linux/45-arch-add-s390x.patch
similarity index 94%
rename from patches/linux/arch-4-s390x.patch
rename to patches/linux/45-arch-add-s390x.patch
index 163b71a1a2b..efab08d79ae 100644
--- a/patches/linux/arch-4-s390x.patch
+++ b/patches/linux/45-arch-add-s390x.patch
@@ -1,5 +1,5 @@
diff --git a/build/azure-pipelines/linux/setup-env.sh b/build/azure-pipelines/linux/setup-env.sh
-index 6ff90d4..381150d 100755
+index 67bc741..4f0521b 100755
--- a/build/azure-pipelines/linux/setup-env.sh
+++ b/build/azure-pipelines/linux/setup-env.sh
@@ -88,2 +88,14 @@ elif [ "$npm_config_arch" == "ppc64" ]; then
@@ -18,17 +18,17 @@ index 6ff90d4..381150d 100755
+ export VSCODE_REMOTE_LDFLAGS="--sysroot=$VSCODE_REMOTE_SYSROOT_DIR/s390x-linux-gnu/s390x-linux-gnu/sysroot -L$VSCODE_REMOTE_SYSROOT_DIR/s390x-linux-gnu/s390x-linux-gnu/sysroot/usr/lib/s390x-linux-gnu -L$VSCODE_REMOTE_SYSROOT_DIR/s390x-linux-gnu/s390x-linux-gnu/sysroot/lib/s390x-linux-gnu"
fi
diff --git a/build/checksums/vscode-sysroot.txt b/build/checksums/vscode-sysroot.txt
-index 3fedbe9..3c4e291 100644
+index dd159f8..8e8cbe9 100644
--- a/build/checksums/vscode-sysroot.txt
+++ b/build/checksums/vscode-sysroot.txt
-@@ -8 +8,2 @@ f82c8dacbb9dd85819e4801909eb4e842ac12c899632aa75b4839383a18c7501 arm-rpi-linux-
- fa8176d27be18bb0eeb7f55b0fa22255050b430ef68c29136599f02976eb0b1b powerpc64le-linux-gnu-glibc-2.28.tar.gz
+@@ -8 +8,2 @@ ac4b6b14b4cec027a22a51bbbb049b3504958a78106c8a8d5cec144206b767d1 x86_64-linux-g
+ 2d1a21d3ed310a62e229f056839cccd52c96c7d7c63542b7ba7c34ff20a3f832 powerpc64le-linux-gnu-glibc-2.28-gcc-10.5.0.tar.gz
+7055f3d40e7195fb1e13f0fbaf5ffadf781bddaca5fd5e0d9972f4157a203fb5 s390x-linux-gnu-glibc-2.28.tar.gz
diff --git a/build/gulpfile.reh.ts b/build/gulpfile.reh.ts
-index af8403a..a697f8c 100644
+index e6ff02c..65f7efe 100644
--- a/build/gulpfile.reh.ts
+++ b/build/gulpfile.reh.ts
-@@ -55,2 +55,3 @@ const BUILD_TARGETS = [
+@@ -59,2 +59,3 @@ const BUILD_TARGETS = [
{ platform: 'linux', arch: 'loong64' },
+ { platform: 'linux', arch: 's390x' },
{ platform: 'alpine', arch: 'arm64' },
@@ -57,10 +57,10 @@ index e146586..ca18865 100644
+ { arch: 's390x' },
];
diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
-index d5f3ed8..ac87a54 100644
+index e1e5265..295a755 100644
--- a/build/gulpfile.vscode.ts
+++ b/build/gulpfile.vscode.ts
-@@ -520,2 +520,3 @@ const BUILD_TARGETS = [
+@@ -705,2 +705,3 @@ const BUILD_TARGETS = [
{ platform: 'linux', arch: 'loong64' },
+ { platform: 'linux', arch: 's390x' },
];
@@ -78,7 +78,7 @@ index 5ee005e..71fb92e 100644
+ break;
}
diff --git a/build/linux/debian/dep-lists.ts b/build/linux/debian/dep-lists.ts
-index 7ea5910..9498993 100644
+index 0e28f90..6e81b12 100644
--- a/build/linux/debian/dep-lists.ts
+++ b/build/linux/debian/dep-lists.ts
@@ -221,2 +221,42 @@ export const referenceGeneratedDepsByArch = {
@@ -125,10 +125,10 @@ index 7ea5910..9498993 100644
+ ],
};
diff --git a/build/linux/debian/install-sysroot.ts b/build/linux/debian/install-sysroot.ts
-index 6e5246c..89fac34 100644
+index aece9b9..52a25ce 100644
--- a/build/linux/debian/install-sysroot.ts
+++ b/build/linux/debian/install-sysroot.ts
-@@ -166,2 +166,6 @@ export async function getVSCodeSysroot(arch: DebianArchString, isMusl: boolean =
+@@ -167,2 +167,6 @@ export async function getVSCodeSysroot(arch: DebianArchString, isMusl: boolean =
break;
+ case 's390x':
+ expectedName = `s390x-linux-gnu${prefix}.tar.gz`;
@@ -149,10 +149,10 @@ index 5d63ed2..5f793e2 100644
+ return ['amd64', 'armhf', 'arm64', 'ppc64el', 'ppc64le', 'riscv64', 's390x'].includes(s);
}
diff --git a/build/linux/rpm/dep-lists.ts b/build/linux/rpm/dep-lists.ts
-index fba6ee4..33efc80 100644
+index c7e0820..03528c0 100644
--- a/build/linux/rpm/dep-lists.ts
+++ b/build/linux/rpm/dep-lists.ts
-@@ -416,2 +416,102 @@ export const referenceGeneratedDepsByArch = {
+@@ -418,2 +418,102 @@ export const referenceGeneratedDepsByArch = {
'xdg-utils'
+ ],
+ "s390x": [
@@ -277,7 +277,7 @@ index dc9faac..9078cc9 100644
+ s390x) LDCONFIG_ARCH="64bit";;
esac
diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts
-index 7162d83..f6bb8fd 100644
+index 9a67e9d..aeb7dc0 100644
--- a/src/vs/platform/extensionManagement/common/extensionManagement.ts
+++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts
@@ -51,2 +51,3 @@ export function TargetPlatformToString(targetPlatform: TargetPlatform) {
@@ -295,10 +295,10 @@ index 7162d83..f6bb8fd 100644
+ }
return TargetPlatform.UNKNOWN;
diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts
-index f93e0ca..c4cc8c9 100644
+index 7b11edb..b8a6193 100644
--- a/src/vs/platform/extensions/common/extensions.ts
+++ b/src/vs/platform/extensions/common/extensions.ts
-@@ -334,2 +334,3 @@ export const enum TargetPlatform {
+@@ -346,2 +346,3 @@ export const enum TargetPlatform {
LINUX_LOONG64 = 'linux-loong64',
+ LINUX_S390X = 'linux-s390x',
diff --git a/patches/linux/client/disable-remote.patch b/patches/linux/client/00-build-disable-remote.patch
similarity index 100%
rename from patches/linux/client/disable-remote.patch
rename to patches/linux/client/00-build-disable-remote.patch
diff --git a/patches/linux/client/avoid-crash-16k-page-size.patch b/patches/linux/client/00-system-support-16k-page-size.patch
similarity index 100%
rename from patches/linux/client/avoid-crash-16k-page-size.patch
rename to patches/linux/client/00-system-support-16k-page-size.patch
diff --git a/patches/linux/reh/s390x/package.json.patch b/patches/linux/reh/s390x/00-build-override-dependency.patch
similarity index 100%
rename from patches/linux/reh/s390x/package.json.patch
rename to patches/linux/reh/s390x/00-build-override-dependency.patch
diff --git a/patches/osx/fix-emulated-urls.patch b/patches/osx/00-ui-update-emulated-urls.patch
similarity index 100%
rename from patches/osx/fix-emulated-urls.patch
rename to patches/osx/00-ui-update-emulated-urls.patch
diff --git a/patches/osx/fix-codesign.patch.no b/patches/osx/fix-codesign.patch.no
deleted file mode 100644
index f5fdd145dc1..00000000000
--- a/patches/osx/fix-codesign.patch.no
+++ /dev/null
@@ -1,30 +0,0 @@
-diff --git a/build/darwin/sign.js b/build/darwin/sign.js
-index dff30fd..df48bee 100644
---- a/build/darwin/sign.js
-+++ b/build/darwin/sign.js
-@@ -56,5 +56,7 @@ async function main(buildDir) {
- ignore: (filePath) => {
-+ const ext = path_1.default.extname(filePath);
- return filePath.includes(gpuHelperAppName) ||
- filePath.includes(rendererHelperAppName) ||
-- filePath.includes(pluginHelperAppName);
-+ filePath.includes(pluginHelperAppName) ||
-+ ext == '.asar' || ext == '.dat' || ext == '.gif' || ext == '.icns' || ext == '.ico' || ext == '.json' || ext == '.mp3' || ext == '.nib' || ext == '.pak' || ext == '.png' || ext == '.scpt' || ext == '.ttf' || ext == '.wasm' || ext == '.woff' || ext == '.woff2';
- }
-diff --git a/build/darwin/sign.ts b/build/darwin/sign.ts
-index ecf1627..a414032 100644
---- a/build/darwin/sign.ts
-+++ b/build/darwin/sign.ts
-@@ -60,6 +60,9 @@ async function main(buildDir?: string): Promise {
- ignore: (filePath: string) => {
-- return filePath.includes(gpuHelperAppName) ||
-- filePath.includes(rendererHelperAppName) ||
-- filePath.includes(pluginHelperAppName);
-+ const ext = path.extname(filePath);
-+ return filePath.includes(gpuHelperAppName) ||
-+ filePath.includes(rendererHelperAppName) ||
-+ filePath.includes(pluginHelperAppName) ||
-+ ext == '.asar' || ext == '.dat' || ext == '.gif' || ext == '.icns' || ext == '.ico' || ext == '.json' || ext == '.mp3' || ext == '.nib' || ext == '.pak' || ext == '.png' || ext == '.scpt' || ext == '.ttf' || ext == '.wasm' || ext == '.woff' || ext == '.woff2';
- }
-+
- };
diff --git a/patches/update-electron.patch.no b/patches/update-electron.patch.no
deleted file mode 100644
index 63dde91df35..00000000000
--- a/patches/update-electron.patch.no
+++ /dev/null
@@ -1,203 +0,0 @@
-diff --git a/.npmrc b/.npmrc
-index e4a5cc2..e3be238 100644
---- a/.npmrc
-+++ b/.npmrc
-@@ -1,3 +1,3 @@
- disturl="https://electronjs.org/headers"
--target="39.2.3"
-+target="39.2.7"
- ms_build_id="12895514"
-diff --git a/build/checksums/electron.txt b/build/checksums/electron.txt
-index ace84ba..5da4475 100644
---- a/build/checksums/electron.txt
-+++ b/build/checksums/electron.txt
-@@ -1,75 +1,75 @@
--1e88807c749e69c9a1b2abef105cf30dbec4fddc365afcaa624b1e2df80fe636 *chromedriver-v39.2.3-darwin-arm64.zip
--5cadee0db7684ae48a7f9f4f1310c3f6e1518b0fa88cf3efb36f58984763d43d *chromedriver-v39.2.3-darwin-x64.zip
--8de5ed25a12029ca999455c1cadf28341ec5e0de87a3a0c27dbb24df99f154b1 *chromedriver-v39.2.3-linux-arm64.zip
--766b16d8b1297738a0d1fa7e44d992142558f6e12820197746913385590f033e *chromedriver-v39.2.3-linux-armv7l.zip
--f35049fe3d8dbfdb7c541b59bdca6982b571761bb8cb7fc85515ceaea9451de9 *chromedriver-v39.2.3-linux-x64.zip
--bffe049ac205d87d14d8d2fb61c8f4dfd72b6d60fcd72ebedf7ef78c90ed52d9 *chromedriver-v39.2.3-mas-arm64.zip
--95a7142ba2ba6a418c6d804729dbe4f1fee897cd9ecaf32e554bb9cabff52b9c *chromedriver-v39.2.3-mas-x64.zip
--da1a59e49c16f7b0924b8b43847a19c93110f7d3b5d511cc41d7ec43a5d3807a *chromedriver-v39.2.3-win32-arm64.zip
--9ba84c1e03e31dd630439d53c975b51c21aa4038526dc01970b94464303db5c7 *chromedriver-v39.2.3-win32-ia32.zip
--82d88829e894277d737188afe22a2c82611107f7b31aeb221ae67e56a580dceb *chromedriver-v39.2.3-win32-x64.zip
--aca80a76b97d4b0aa3001882bd8cb7a8fb3f1df75cbc4f0d74eaad0c9df53c9b *electron-api.json
--0fb6f376da5f1bb06125134cd8e33d79a76c4d47b0bc51d20c3359e092095b98 *electron-v39.2.3-darwin-arm64-dsym-snapshot.zip
--6a9e67878637191edcefbd36b070137c3ca4f674307c255864eb9720128905c4 *electron-v39.2.3-darwin-arm64-dsym.zip
--30fd6a23a4a70de3882525c1666af98a2cf07e0826c54bef8f466efb25b1d2ec *electron-v39.2.3-darwin-arm64-symbols.zip
--2128a27c1b0fd80be9d608fb293639f76611b4108eca1e045c933fd04097a7b1 *electron-v39.2.3-darwin-arm64.zip
--68435db35b408d7eb3b9f208f2a7aa803bb8578f409ee99bab435118951a21a5 *electron-v39.2.3-darwin-x64-dsym-snapshot.zip
--59e821dbe0083d4e28a77dff5f72fa65c0db7e7966d760ebb5a41af92da43958 *electron-v39.2.3-darwin-x64-dsym.zip
--cdbe6988a9c9277d5a1acd2f3aaf08e603050f3dae0c10dee4b10d7a6f7cf818 *electron-v39.2.3-darwin-x64-symbols.zip
--f8085a04dc35bfe0c32c36e6feffde07de16459bf36dfab422760181717f5ac0 *electron-v39.2.3-darwin-x64.zip
--ce57eb6bd0ddfa1d37d8a35615276aeb60c19ae0636f21da3270cf07844074b4 *electron-v39.2.3-linux-arm64-debug.zip
--d2652381b24dc05c57a4ce4835b6efc796e6af14419ec80a9ab31f1c3c53f143 *electron-v39.2.3-linux-arm64-symbols.zip
--c58c5904d6015cbbfa5f04fbda5c83b9a276a3565b5f3fa166795c789b055cdd *electron-v39.2.3-linux-arm64.zip
--f0f0be5ea43c0fe84b9609dd5d2b98904c2d4bb8ced9c7c72b72cef377f2734a *electron-v39.2.3-linux-armv7l-debug.zip
--f08ae5371aca8a9f3775a6855c74da71d8817bd9f135c3ba975d428d14f3c42f *electron-v39.2.3-linux-armv7l-symbols.zip
--d7c2f0b5038c49b1e637f8dbda945be4e6f3a6d7ebf802543e6ef5093c9641ff *electron-v39.2.3-linux-armv7l.zip
--aa8b9e4b5eed3a0d2271c01d34551d7dc3e9be30a68af06604c1e2cd3cf93223 *electron-v39.2.3-linux-x64-debug.zip
--d5ebf9628e055b03c90d2d6d4ed86f443b900e264ff34061c953541e27fad5f9 *electron-v39.2.3-linux-x64-symbols.zip
--5eb51ebcb60487c4fc3a5b74ffb57a03eefd48def32200adf310ffaba4153d64 *electron-v39.2.3-linux-x64.zip
--f6cc53c0a45c73779c837d71693f54cc18b12b7148c82c689e2b059772182b84 *electron-v39.2.3-mas-arm64-dsym-snapshot.zip
--0caf9b7b958a7d2ba7e6f757f885842efda3ebc794a2ac048b90cde2926281ee *electron-v39.2.3-mas-arm64-dsym.zip
--c3164da6588c546e728b6fa0754042328cdb43e28dbb0fbcfbda740ed58038fe *electron-v39.2.3-mas-arm64-symbols.zip
--36ea0a98a0480096b4bc6e22c194e999cdfd7f1263c51f08d2815985a8a39ef7 *electron-v39.2.3-mas-arm64.zip
--73d356aa3b51cb261d30f0c27ce354b904d17c3c05c124a1f41112d085e66852 *electron-v39.2.3-mas-x64-dsym-snapshot.zip
--083f53e15a93404b309754df6b5e785785b28e01fdab08a89a45e5024f44e046 *electron-v39.2.3-mas-x64-dsym.zip
--cdd8aaf3b90aedc8c09a44efa03ec67e8426102fad7333ff6bfc257dc6fa01b7 *electron-v39.2.3-mas-x64-symbols.zip
--517d26f9b76b23976d0fc1dcc366e2b50b782592d9b0fc1d814dd1e7ce66efef *electron-v39.2.3-mas-x64.zip
--1a83af2259feb361f7ceb79e047b701ea8297d616487d9d6a79530014d5000c7 *electron-v39.2.3-win32-arm64-pdb.zip
--a154f036378a81859804f660773f6d434770fc311af86dfe01ace5346b9dc788 *electron-v39.2.3-win32-arm64-symbols.zip
--4aae37230f86b1590f102aa038268299bfb55ce2bf3b76ac4d6159e7b6a69f8e *electron-v39.2.3-win32-arm64-toolchain-profile.zip
--b68d623d70c4d0ed76c979027d2a4f6a16bc8dee6f243f5bc2064b4bb52bb34d *electron-v39.2.3-win32-arm64.zip
--be73842257d098ac911b3363e0c11b1d51ab8f6ebd641e512a2e15ccbea73193 *electron-v39.2.3-win32-ia32-pdb.zip
--5f65391f51b5d46d5e0ec7018f3febc0f5b6f072b57310d6d6c9b014de911ff4 *electron-v39.2.3-win32-ia32-symbols.zip
--4aae37230f86b1590f102aa038268299bfb55ce2bf3b76ac4d6159e7b6a69f8e *electron-v39.2.3-win32-ia32-toolchain-profile.zip
--6668fadbdd0283225f4bc60c711f8cd8ac316f43f486cd8a1f62a6a35f89cf7a *electron-v39.2.3-win32-ia32.zip
--430aa905803772476fc1f943e87e4a319d33880d88e08472504531b96834dff1 *electron-v39.2.3-win32-x64-pdb.zip
--9adb254e6ee0d96311cc8056049814436b7e973757d026aac3b533820be027ec *electron-v39.2.3-win32-x64-symbols.zip
--4aae37230f86b1590f102aa038268299bfb55ce2bf3b76ac4d6159e7b6a69f8e *electron-v39.2.3-win32-x64-toolchain-profile.zip
--d4365ad128bbdcb3df99dc4a0ad9de85c5e920903070a473b55377253b6c3fdd *electron-v39.2.3-win32-x64.zip
--feb2f068cd1e2f70bdd7816c13e58dcff9add18fdc8c8e19145a5fd343be541a *electron.d.ts
--4fe4db7f974c64497ddc07c3955a7d83dcfeba61bcec704b33638a4848038d49 *ffmpeg-v39.2.3-darwin-arm64.zip
--8fa2eb8ce5bdf2ecc4cf1f5ebc0f46a4e466fb4841513d482b99838b265995af *ffmpeg-v39.2.3-darwin-x64.zip
--bc72228a7380bc491783602d823bbe2d75e9e417d9b93a40a64be6ff5e3a1bcc *ffmpeg-v39.2.3-linux-arm64.zip
--322698b5ebfae62c34e98c2589b0906b99c15a8181ca3b6d1ffe166ec7d99ab1 *ffmpeg-v39.2.3-linux-armv7l.zip
--40d23294d7bcc48cb3f647f278672021e969a6332cd3cbb06ee681833759626a *ffmpeg-v39.2.3-linux-x64.zip
--4fe4db7f974c64497ddc07c3955a7d83dcfeba61bcec704b33638a4848038d49 *ffmpeg-v39.2.3-mas-arm64.zip
--8fa2eb8ce5bdf2ecc4cf1f5ebc0f46a4e466fb4841513d482b99838b265995af *ffmpeg-v39.2.3-mas-x64.zip
--d324af171e0ae820ec72075924ace2bda96e837ccc79e22b652dda6f82b673b6 *ffmpeg-v39.2.3-win32-arm64.zip
--d982077305d0e4296bed95eb7d2f1048a90b06cfb84d5ddf2a1928e1f07c4dba *ffmpeg-v39.2.3-win32-ia32.zip
--fa65c30f970f9724f4353d068a640592b09a15593b943fa7544cd07e9cace90e *ffmpeg-v39.2.3-win32-x64.zip
--244cd79cf68540e83449ad7d73183416413b3d603cee4496ec07705cbd9338ee *hunspell_dictionaries.zip
--f995e05259eeae64f0e6fbb6d2863aa2fc5846e3ff2dfb3cd22defc3bbbb68d7 *libcxx-objects-v39.2.3-linux-arm64.zip
--3607b4a15aa5f2dbd9e2338ca5451ad8ff646bdac415f9845352d53be1c26ddf *libcxx-objects-v39.2.3-linux-armv7l.zip
--b5020533566dbf22b0b890caa766eb2f4d11675fb1c79c2f41bc54da45a34fc2 *libcxx-objects-v39.2.3-linux-x64.zip
--919a2cc35920b21fbcc5834e858c400f51b607f084c593883c637dba27b9d29a *libcxx_headers.zip
--34e4b44f9c5e08b557a2caed55456ce7690abab910196a783a2a47b58d2b9ac9 *libcxxabi_headers.zip
--661d3578cabe5c98d806d5eeeaee48ac0c997114b9cd76388581e58f6d1c2ce1 *mksnapshot-v39.2.3-darwin-arm64.zip
--c3032c90522e4491e3de641fade3c90be109269108d4ff39b55dbf7331e6eb9a *mksnapshot-v39.2.3-darwin-x64.zip
--bcd8fb45f3b093208346dc2dd2e0b5b70d117e26a70b9619921b26a7f99ba310 *mksnapshot-v39.2.3-linux-arm64-x64.zip
--647762d3d8b01b5123ec11ea5b6984d7b78a26c79ea4d159a3b9fa780de03321 *mksnapshot-v39.2.3-linux-armv7l-x64.zip
--86c0febd8e9ddd8b700c6fb633ec1406bf4fe19ddc2801cb50c01ad345c8ce6e *mksnapshot-v39.2.3-linux-x64.zip
--3676ffc5f489b7d7faafe36fdb5f0f4ce98c8d6fcedfacf6feded7f21b2a50ea *mksnapshot-v39.2.3-mas-arm64.zip
--728936a18c11727d32730c89060dca2d998e7df9159f12bcba2bdf1b51584aad *mksnapshot-v39.2.3-mas-x64.zip
--a3ef9ab1ad5c8172c029dcc36abdc979ecf01f235516120f666595d4d5d02aee *mksnapshot-v39.2.3-win32-arm64-x64.zip
--02584df98255591438ffcc6589bd1ee60af8b8897d08079e7a7dd054e09614fe *mksnapshot-v39.2.3-win32-ia32.zip
--d4dd9de8637d7d8240b7a0686916c0fe84058ad00db9422f5491fbbd7a53cf4b *mksnapshot-v39.2.3-win32-x64.zip
-+ab4c5ce64b92082b15f11ed2a89766fa5542b33d656872678ca0aee99e51a7c8 *chromedriver-v39.2.7-darwin-arm64.zip
-+976f03f6e5e1680e5f8449bd04da531aabec0b664ff462a14f0d41fad0b437af *chromedriver-v39.2.7-darwin-x64.zip
-+28649b04333820f826ea658d18f8111e0a187b3afc498af05b5c59b27ac00155 *chromedriver-v39.2.7-linux-arm64.zip
-+149033ccf7f909214c7d69788bdef2e4ce164cae1091a2f8220f62e495576f9b *chromedriver-v39.2.7-linux-armv7l.zip
-+6a071551518eddc688dd348d3e63b0c55f744589a041943e5706bebfd5337f19 *chromedriver-v39.2.7-linux-x64.zip
-+824ea4699fd6aa6822e453496ebf576174d04e0f0991843b77eb346a842725bc *chromedriver-v39.2.7-mas-arm64.zip
-+aa991650a765b2bc168f8b742341048fa030ee9e3bd0d0799e1b1d29a4c55d0b *chromedriver-v39.2.7-mas-x64.zip
-+a8fc4467bf9be10de3e341648ccd6ad6d618b4456a744137e9f19bd5f9d9bd37 *chromedriver-v39.2.7-win32-arm64.zip
-+01b247563a054617530e454646b086352bc03e02ad4f18e5b65b4e3dfd276a1e *chromedriver-v39.2.7-win32-ia32.zip
-+a8bc2b9052ac8dadeaf88ea9cd6e46ec0032eee2345a0548741bfed922520579 *chromedriver-v39.2.7-win32-x64.zip
-+23486b3effffe5b3bc3ca70261fc9abe2396fd5d018652494f73e3f48cfe57cf *electron-api.json
-+8bee9e905544e60e08468efca91481ec467ab8f108a81846c365782ba0fc737c *electron-v39.2.7-darwin-arm64-dsym-snapshot.zip
-+3be97c3152cd4a84a6fe4013f7e4712422015f4beeb13eb35f8b4d223307d39a *electron-v39.2.7-darwin-arm64-dsym.zip
-+6d5551120d0564fc5596a3b724258da2ce632663d12782c8fdf15a2cc461ed95 *electron-v39.2.7-darwin-arm64-symbols.zip
-+bda657a77c074ee0c6a0e5d5f6de17918d7cf959306b454f6fadb07a08588883 *electron-v39.2.7-darwin-arm64.zip
-+39f0aab332506455337edff540d007c509e72d8c419cdc57f88a0312848f51c9 *electron-v39.2.7-darwin-x64-dsym-snapshot.zip
-+1efed54563ede59d7ae9ba3d548b3e93ede1a4e5dfa510ca22036ea2dd8a2956 *electron-v39.2.7-darwin-x64-dsym.zip
-+3b9bfe84905870c9c36939ffac545d388213ffbb296b969f35ae2a098f6a32b7 *electron-v39.2.7-darwin-x64-symbols.zip
-+d7535e64ad54efcf0fae84d7fea4c2ee4727eec99c78d2a5acc695285cb0a9f0 *electron-v39.2.7-darwin-x64.zip
-+59a3bd71f9c1b355dfbc43f233126cd32b82a53439f0d419e6349044d39e8bbf *electron-v39.2.7-linux-arm64-debug.zip
-+1b326f1a5bea47d9be742554434ddf4f094d7bcdd256f440b808359dc78fcd33 *electron-v39.2.7-linux-arm64-symbols.zip
-+445465a43bd2ffaec09877f4ed46385065632a4683c2806cc6211cc73c110024 *electron-v39.2.7-linux-arm64.zip
-+300c8d11d82cd1257b08e5a08c5e315f758133b627c0271a0f249ba3cb4533d2 *electron-v39.2.7-linux-armv7l-debug.zip
-+034dca3c137c7bfe0736456c1aa0941721e3a9f3a8a72a2786cb817d4edb0f9d *electron-v39.2.7-linux-armv7l-symbols.zip
-+5de99e9f4de8c9ac2fb93df725e834e3e93194c08c99968def7f7b78594fc97c *electron-v39.2.7-linux-armv7l.zip
-+64ef2ae24ae0869ebadb34b178fd7e8375d750d7afe39b42cfa28824f0d11445 *electron-v39.2.7-linux-x64-debug.zip
-+63466c4b6024ae38fdb38ff116abd561b9e36b8d4cd8f8aefbe41289950dba0c *electron-v39.2.7-linux-x64-symbols.zip
-+2f5285ef563dca154aa247696dddef545d3d895dd9b227ed423ea0d43737c22c *electron-v39.2.7-linux-x64.zip
-+ef5a108c1d10148aa031300da10c78feee797afe4ca2a2839819fd8434529860 *electron-v39.2.7-mas-arm64-dsym-snapshot.zip
-+9dd01dc9071b1db9d8fb5e9c81eaa96f551db0a982994881e5750cde2432b0f0 *electron-v39.2.7-mas-arm64-dsym.zip
-+2cf34289d79906c81b3dfd043fbe19a9604cecedd9ebda6576fa3c6f27edfe23 *electron-v39.2.7-mas-arm64-symbols.zip
-+5658d58eacb99fb2a22df0d52ca0507d79f03c85515a123d5e9bee5e0749b93d *electron-v39.2.7-mas-arm64.zip
-+92cd45c3fa64e2889fd1bc6b165c4d12bea40786ce59d6d204cadec6039a8e2a *electron-v39.2.7-mas-x64-dsym-snapshot.zip
-+21464abc837aeab1609fbfa33aa82793e9d32a597db28ea4da483a9d6b6c668a *electron-v39.2.7-mas-x64-dsym.zip
-+8d6e7ffee482514b62465e418049bdf717d308118461e5d97480f5a0eb0b9e20 *electron-v39.2.7-mas-x64-symbols.zip
-+e3b4169ab7bf3bc35cc720ef99032acd3d0eb1521524b5c4667898758dd4e9a3 *electron-v39.2.7-mas-x64.zip
-+3f1d549214a2430d57e5ab8d3cc9d89363340b16905014e35417c632a94732f6 *electron-v39.2.7-win32-arm64-pdb.zip
-+984e1d7718bc920e75a38b114ff73fa52647349763f76e91b64458e5d0fde65f *electron-v39.2.7-win32-arm64-symbols.zip
-+ed66f333ff7b385b2f40845178dc2dc4f25cc887510d766433392733fdd272a3 *electron-v39.2.7-win32-arm64-toolchain-profile.zip
-+56c6f8d957239b7e8d5a214255f39007d44abc98f701ab61054afa83ad46e80f *electron-v39.2.7-win32-arm64.zip
-+c885a8af3226f28081106fa89106f4668b907a53ab3997f3b101b487a76d2878 *electron-v39.2.7-win32-ia32-pdb.zip
-+34edebab8fb5458d97a23461213b39360b5652f8dd6fe8bf7f9c10a17b25a1d2 *electron-v39.2.7-win32-ia32-symbols.zip
-+ed66f333ff7b385b2f40845178dc2dc4f25cc887510d766433392733fdd272a3 *electron-v39.2.7-win32-ia32-toolchain-profile.zip
-+85acd7db5dbb39e16d6c798a649342969569caa2c71d6b5bb1f0c8ae96bca32e *electron-v39.2.7-win32-ia32.zip
-+e6a8e1164106548a1cdf266c615d259feada249e1449df8af1f7e04252575e86 *electron-v39.2.7-win32-x64-pdb.zip
-+90e1feeff5968265b68d8343e27b9f329b27882747633dd10555740de67d58cc *electron-v39.2.7-win32-x64-symbols.zip
-+ed66f333ff7b385b2f40845178dc2dc4f25cc887510d766433392733fdd272a3 *electron-v39.2.7-win32-x64-toolchain-profile.zip
-+3464537fa4be6b7b073f1c9b694ac2eb1f632d6ec36f6eeac9e00d8a279f188c *electron-v39.2.7-win32-x64.zip
-+40c772eb189d100087b75da6c2ad1aeb044f1d661c90543592546a654b0b6d5b *electron.d.ts
-+5a904c2edd12542ce2b6685938cdafe21cf90cd552f2f654058353d1a3d8ee43 *ffmpeg-v39.2.7-darwin-arm64.zip
-+91fc23e9008f43ad3c46f690186d77b291a803451b6d89ac82aadb8ae2dd7995 *ffmpeg-v39.2.7-darwin-x64.zip
-+a44607619c6742c1f9d729265a687b467a25ba397081ac12bc2c0d9ab4bea37b *ffmpeg-v39.2.7-linux-arm64.zip
-+8128ec9be261e2c1017f9b8213f948426119306e5d3acdb59392f32b2c2f0204 *ffmpeg-v39.2.7-linux-armv7l.zip
-+a201a2a64a49ab39def2d38a73e92358ebb57ecae99b0bbc8058353c4be23ea1 *ffmpeg-v39.2.7-linux-x64.zip
-+5a904c2edd12542ce2b6685938cdafe21cf90cd552f2f654058353d1a3d8ee43 *ffmpeg-v39.2.7-mas-arm64.zip
-+91fc23e9008f43ad3c46f690186d77b291a803451b6d89ac82aadb8ae2dd7995 *ffmpeg-v39.2.7-mas-x64.zip
-+6fa4278a41d9c5d733369aa4cce694ba219eb72f7fd181060547c3a4920b5902 *ffmpeg-v39.2.7-win32-arm64.zip
-+12b9e02c0fd07e8bc233c7c4ebab5c737eca05c41f1c5178867cad313433561b *ffmpeg-v39.2.7-win32-ia32.zip
-+caedeb04aa648af14b5a20c9ca902c97eb531a456c7965639465f8764b5d95e0 *ffmpeg-v39.2.7-win32-x64.zip
-+f1320ff95f2cce0f0f7225b45f2b9340aeb38b341b4090f0e58f58dc2da2f3a9 *hunspell_dictionaries.zip
-+8f4ffd7534f21e40621c515bacd178b809c2e52d1687867c60dfdb97ed17fecb *libcxx-objects-v39.2.7-linux-arm64.zip
-+0497730c82e1e76b6a4c22b1af4ebb7821ff6ccb838b78503c0cc93d8a8f03ee *libcxx-objects-v39.2.7-linux-armv7l.zip
-+271e3538eb241f1bc83a103ea7d4c8408ee6bd38322ed50dca781f54d002a590 *libcxx-objects-v39.2.7-linux-x64.zip
-+9a243728553395448f783591737fb229a327499d6853b51e201c36e4aaa9796f *libcxx_headers.zip
-+db3018609bce502c307c59074b3d5273080a68fb50ac1e7fc580994a2e80cc25 *libcxxabi_headers.zip
-+509d0890d1a524efe2c68aae18d2c8fd6537e788b94c9f63fd9f9ca3be98fdb9 *mksnapshot-v39.2.7-darwin-arm64.zip
-+f0a98b428a6a1f8dc4a4663e876a3984157ac8757922cde7461f19755942c180 *mksnapshot-v39.2.7-darwin-x64.zip
-+22fda3b708ab14325b2bfba8e875fbf48b6eacea347ecf1ef41cf24b09b4af8f *mksnapshot-v39.2.7-linux-arm64-x64.zip
-+e7b89dbab3449c0a1862b4d129b3ee384cb5bcd53e149eae05df14744ee55cb5 *mksnapshot-v39.2.7-linux-armv7l-x64.zip
-+53b3ed9f3a69444915ef1eef688c8f8168d52c3d5232834b8aa249cf210b41b6 *mksnapshot-v39.2.7-linux-x64.zip
-+181d962eaa93d8d997b1daf99ae016b3d9d8a5ae037c96a8475490396a8d655f *mksnapshot-v39.2.7-mas-arm64.zip
-+de005b619da1c1afcd8f8b6c70facb1dc388c46a66f8eff3058c8a08323df173 *mksnapshot-v39.2.7-mas-x64.zip
-+6eea0bee6097cf2cfe3ae42b35f847304697c4a4eec84f5b60d1cbbe324a8490 *mksnapshot-v39.2.7-win32-arm64-x64.zip
-+3e769269aa0b51ef9664a982235bc9299fc58743dcf7bce585d49a9f4a074abd *mksnapshot-v39.2.7-win32-ia32.zip
-+51337124892bf76d214f89975d42ec0474199cdfac2f9e08664d86ae8e6ba43e *mksnapshot-v39.2.7-win32-x64.zip
-\ No newline at end of file
-diff --git a/cgmanifest.json b/cgmanifest.json
-index 1148b4e..88150cc 100644
---- a/cgmanifest.json
-+++ b/cgmanifest.json
-@@ -531,4 +531,4 @@
- "repositoryUrl": "https://github.com/electron/electron",
-- "commitHash": "14565211f7fd33f3fe2f75ec1254cfa57d5bc848",
-- "tag": "39.2.3"
-+ "commitHash": "4d18062d0f0ca34c455bc7ec032dd7959a0365b6",
-+ "tag": "39.2.7"
- }
-diff --git a/package-lock.json b/package-lock.json
-index 2b1154b..cbe427e 100644
---- a/package-lock.json
-+++ b/package-lock.json
-@@ -100,3 +100,3 @@
- "deemon": "^1.13.6",
-- "electron": "39.2.3",
-+ "electron": "39.2.7",
- "eslint": "^9.36.0",
-@@ -6188,5 +6188,5 @@
- "node_modules/electron": {
-- "version": "39.2.3",
-- "resolved": "https://registry.npmjs.org/electron/-/electron-39.2.3.tgz",
-- "integrity": "sha512-j7k7/bj3cNA29ty54FzEMRUoqirE+RBQPhPFP+XDuM93a1l2WcDPiYumxKWz+iKcXxBJLFdMIAlvtLTB/RfCkg==",
-+ "version": "39.2.7",
-+ "resolved": "https://registry.npmjs.org/electron/-/electron-39.2.7.tgz",
-+ "integrity": "sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==",
- "dev": true,
-diff --git a/package.json b/package.json
-index 9ef8381..f732fa8 100644
---- a/package.json
-+++ b/package.json
-@@ -162,3 +162,3 @@
- "deemon": "^1.13.6",
-- "electron": "39.2.3",
-+ "electron": "39.2.7",
- "eslint": "^9.36.0",
diff --git a/patches/version-1-update.patch b/patches/version-1-update.patch
deleted file mode 100644
index 168fa340cff..00000000000
--- a/patches/version-1-update.patch
+++ /dev/null
@@ -1,343 +0,0 @@
-diff --git a/src/vs/platform/update/common/update.ts b/src/vs/platform/update/common/update.ts
-index bc90a03..f8885b9 100644
---- a/src/vs/platform/update/common/update.ts
-+++ b/src/vs/platform/update/common/update.ts
-@@ -54,3 +54,4 @@ export const enum UpdateType {
- Archive,
-- Snap
-+ Snap,
-+ WindowsInstaller,
- }
-@@ -120 +121,38 @@ export interface IUpdateService {
- }
-+
-+export type Architecture =
-+ | "arm"
-+ | "arm64"
-+ | "ia32"
-+ | "loong64"
-+ | "mips"
-+ | "mipsel"
-+ | "ppc"
-+ | "ppc64"
-+ | "riscv64"
-+ | "s390"
-+ | "s390x"
-+ | "x64";
-+
-+export type Platform =
-+ | "aix"
-+ | "android"
-+ | "darwin"
-+ | "freebsd"
-+ | "haiku"
-+ | "linux"
-+ | "openbsd"
-+ | "sunos"
-+ | "win32"
-+ | "cygwin"
-+ | "netbsd";
-+
-+export type Quality =
-+ | "insider"
-+ | "stable";
-+
-+export type Target =
-+ | "archive"
-+ | "msi"
-+ | "system"
-+ | "user";
-\ No newline at end of file
-diff --git a/src/vs/platform/update/electron-main/abstractUpdateService.ts b/src/vs/platform/update/electron-main/abstractUpdateService.ts
-index c943bca..1395594 100644
---- a/src/vs/platform/update/electron-main/abstractUpdateService.ts
-+++ b/src/vs/platform/update/electron-main/abstractUpdateService.ts
-@@ -17,4 +17,4 @@ import { ILogService } from '../../log/common/log.js';
- import { IProductService } from '../../product/common/productService.js';
--import { IRequestService } from '../../request/common/request.js';
--import { AvailableForDownload, DisablementReason, IUpdateService, State, StateType, UpdateType } from '../common/update.js';
-+import { IRequestService, NO_FETCH_TELEMETRY } from '../../request/common/request.js';
-+import { Architecture, AvailableForDownload, DisablementReason, IUpdateService, Platform, State, StateType, Target, UpdateType } from '../common/update.js';
-
-@@ -25,12 +25,8 @@ export interface IUpdateURLOptions {
-
--export function createUpdateURL(baseUpdateUrl: string, platform: string, quality: string, commit: string, options?: IUpdateURLOptions): string {
-- const url = new URL(`${baseUpdateUrl}/api/update/${platform}/${quality}/${commit}`);
--
-- if (options?.background) {
-- url.searchParams.set('bg', 'true');
-+export function createUpdateURL(productService: IProductService, quality: string, platform: Platform, architecture: Architecture, target?: Target): string {
-+ if (target) {
-+ return `${productService.updateUrl}/${quality}/${platform}/${architecture}/${target}/latest.json`;
-+ } else {
-+ return `${productService.updateUrl}/${quality}/${platform}/${architecture}/latest.json`;
- }
--
-- url.searchParams.set('u', options?.internalOrg ?? 'none');
--
-- return url.toString();
- }
-@@ -322,3 +318,3 @@ export abstract class AbstractUpdateService implements IUpdateService {
-
-- if (mode === 'none') {
-+ if (mode === 'none' || mode === 'manual') {
- return undefined;
-@@ -336,3 +332,3 @@ export abstract class AbstractUpdateService implements IUpdateService {
- try {
-- const context = await this.requestService.request({ url, headers, callSite: 'updateService.isLatestVersion' }, token);
-+ const context = await this.requestService.request({ url, headers, callSite: NO_FETCH_TELEMETRY }, token);
- const statusCode = context.res.statusCode;
-diff --git a/src/vs/platform/update/electron-main/updateService.darwin.ts b/src/vs/platform/update/electron-main/updateService.darwin.ts
-index 40b38a2..323919e 100644
---- a/src/vs/platform/update/electron-main/updateService.darwin.ts
-+++ b/src/vs/platform/update/electron-main/updateService.darwin.ts
-@@ -16,3 +16,3 @@ import { ILogService } from '../../log/common/log.js';
- import { IProductService } from '../../product/common/productService.js';
--import { asJson, IRequestService } from '../../request/common/request.js';
-+import { asJson, IRequestService, NO_FETCH_TELEMETRY } from '../../request/common/request.js';
- import { ITelemetryService } from '../../telemetry/common/telemetry.js';
-@@ -22,2 +22,3 @@ import { AbstractUpdateService, createUpdateURL, getUpdateRequestHeaders, IUpdat
- import { INodeProcess } from '../../../base/common/platform.js';
-+import * as semver from 'semver';
-
-@@ -99,15 +100,4 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
-
-- protected buildUpdateFeedUrl(quality: string, commit: string, options?: IUpdateURLOptions): string | undefined {
-- const assetID = this.productService.darwinUniversalAssetId ?? (process.arch === 'x64' ? 'darwin' : 'darwin-arm64');
-- const url = createUpdateURL(this.productService.updateUrl!, assetID, quality, commit, options);
-- const headers = getUpdateRequestHeaders(this.productService.version);
-- try {
-- this.logService.trace('update#buildUpdateFeedUrl - setting feed URL for Electron autoUpdater', { url, assetID, quality, commit, headers });
-- electron.autoUpdater.setFeedURL({ url, headers });
-- } catch (e) {
-- // application is very likely not signed
-- this.logService.error('Failed to set update feed URL', e);
-- return undefined;
-- }
-- return url;
-+ protected buildUpdateFeedUrl(quality: string, _commit: string, _options?: IUpdateURLOptions): string | undefined {
-+ return createUpdateURL(this.productService, quality, process.platform, process.arch);
- }
-@@ -154,3 +144,30 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
- this.logService.trace('update#doCheckForUpdates - using Electron autoUpdater', { url, explicit, background });
-- electron.autoUpdater.checkForUpdates();
-+ this.requestService.request({ url, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None)
-+ .then(asJson)
-+ .then(update => {
-+ if (!update || !update.url || !update.version || !update.productVersion) {
-+ this.setState(State.Idle(UpdateType.Setup, undefined, explicit || undefined));
-+
-+ return Promise.resolve(null);
-+ }
-+
-+ const fetchedVersion = /\d+\.\d+\.\d+\.\d+/.test(update.productVersion) ? update.productVersion.replace(/(\d+\.\d+\.\d+)\.\d+(\-\w+)?/, '$1$2') : update.productVersion.replace(/(\d+\.\d+\.)0+(\d+)(\-\w+)?/, '$1$2$3')
-+ const currentVersion = this.productService.version.replace(/(\d+\.\d+\.)0+(\d+)(\-\w+)?/, '$1$2$3')
-+
-+ if(semver.compareBuild(currentVersion, fetchedVersion) >= 0) {
-+ this.setState(State.Idle(UpdateType.Setup, undefined, explicit || undefined));
-+ }
-+ else {
-+ electron.autoUpdater.setFeedURL({ url });
-+ electron.autoUpdater.checkForUpdates();
-+ }
-+
-+ return Promise.resolve(null);
-+ })
-+ .then(undefined, err => {
-+ this.logService.error(err);
-+ // only show message when explicitly checking for updates
-+ const message: string | undefined = explicit ? (err.message || err) : undefined;
-+ this.setState(State.Idle(UpdateType.Setup, message));
-+ });
- }
-@@ -167,3 +184,3 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
- try {
-- const context = await this.requestService.request({ url, headers, callSite: 'updateService.darwin.checkForUpdates' }, CancellationToken.None);
-+ const context = await this.requestService.request({ url, headers, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None);
- const statusCode = context.res.statusCode;
-diff --git a/src/vs/platform/update/electron-main/updateService.linux.ts b/src/vs/platform/update/electron-main/updateService.linux.ts
-index 0eb5d74..8ce708e 100644
---- a/src/vs/platform/update/electron-main/updateService.linux.ts
-+++ b/src/vs/platform/update/electron-main/updateService.linux.ts
-@@ -13,5 +13,6 @@ import { INativeHostMainService } from '../../native/electron-main/nativeHostMai
- import { IProductService } from '../../product/common/productService.js';
--import { asJson, IRequestService } from '../../request/common/request.js';
-+import { asJson, IRequestService, NO_FETCH_TELEMETRY } from '../../request/common/request.js';
- import { AvailableForDownload, IUpdate, State, UpdateType } from '../common/update.js';
- import { AbstractUpdateService, createUpdateURL, IUpdateURLOptions } from './abstractUpdateService.js';
-+import * as semver from 'semver';
-
-@@ -32,4 +33,4 @@ export class LinuxUpdateService extends AbstractUpdateService {
-
-- protected buildUpdateFeedUrl(quality: string, commit: string, options?: IUpdateURLOptions): string {
-- return createUpdateURL(this.productService.updateUrl!, `linux-${process.arch}`, quality, commit, options);
-+ protected buildUpdateFeedUrl(quality: string, _commit: string, _options?: IUpdateURLOptions): string {
-+ return createUpdateURL(this.productService, quality, process.platform, process.arch);
- }
-@@ -46,3 +47,3 @@ export class LinuxUpdateService extends AbstractUpdateService {
-
-- this.requestService.request({ url, callSite: 'updateService.linux.checkForUpdates' }, CancellationToken.None)
-+ this.requestService.request({ url, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None)
- .then(asJson)
-@@ -51,5 +52,17 @@ export class LinuxUpdateService extends AbstractUpdateService {
- this.setState(State.Idle(UpdateType.Archive, undefined, explicit || undefined));
-- } else {
-+
-+ return Promise.resolve(null);
-+ }
-+
-+ const fetchedVersion = /\d+\.\d+\.\d+\.\d+/.test(update.productVersion) ? update.productVersion.replace(/(\d+\.\d+\.\d+)\.\d+(\-\w+)?/, '$1$2') : update.productVersion.replace(/(\d+\.\d+\.)0+(\d+)(\-\w+)?/, '$1$2$3')
-+ const currentVersion = this.productService.version.replace(/(\d+\.\d+\.)0+(\d+)(\-\w+)?/, '$1$2$3')
-+
-+ if(semver.compareBuild(currentVersion, fetchedVersion) >= 0) {
-+ this.setState(State.Idle(UpdateType.Archive, undefined, explicit || undefined));
-+ }
-+ else {
- this.setState(State.AvailableForDownload(update));
- }
-+
-+ return Promise.resolve(null);
- })
-diff --git a/src/vs/platform/update/electron-main/updateService.win32.ts b/src/vs/platform/update/electron-main/updateService.win32.ts
-index d02d7c3..4e8c541 100644
---- a/src/vs/platform/update/electron-main/updateService.win32.ts
-+++ b/src/vs/platform/update/electron-main/updateService.win32.ts
-@@ -14,3 +14,2 @@ import { CancellationToken, CancellationTokenSource } from '../../../base/common
- import { memoize } from '../../../base/common/decorators.js';
--import { hash } from '../../../base/common/hash.js';
- import * as path from '../../../base/common/path.js';
-@@ -31,7 +30,8 @@ import { INativeHostMainService } from '../../native/electron-main/nativeHostMai
- import { IProductService } from '../../product/common/productService.js';
--import { asJson, IRequestService } from '../../request/common/request.js';
-+import { asJson, IRequestService, NO_FETCH_TELEMETRY } from '../../request/common/request.js';
- import { ITelemetryService } from '../../telemetry/common/telemetry.js';
--import { AvailableForDownload, DisablementReason, IUpdate, State, StateType, UpdateType } from '../common/update.js';
--import { AbstractUpdateService, createUpdateURL, getUpdateRequestHeaders, IUpdateURLOptions, UpdateErrorClassification } from './abstractUpdateService.js';
-+import { AvailableForDownload, DisablementReason, IUpdate, State, StateType, Target, UpdateType } from '../common/update.js';
-+import { AbstractUpdateService, createUpdateURL, getUpdateRequestHeaders, IUpdateURLOptions } from './abstractUpdateService.js';
- import { INodeProcess } from '../../../base/common/platform.js';
-+import * as semver from 'semver';
-
-@@ -49,5 +49,9 @@ function getUpdateType(): UpdateType {
- if (typeof _updateType === 'undefined') {
-- _updateType = existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))
-- ? UpdateType.Setup
-- : UpdateType.Archive;
-+ if (existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))) {
-+ _updateType = UpdateType.Setup;
-+ } else if (path.basename(path.normalize(path.join(process.execPath, '..', '..'))) === 'Program Files') {
-+ _updateType = UpdateType.WindowsInstaller;
-+ } else {
-+ _updateType = UpdateType.Archive;
-+ }
- }
-@@ -164,3 +168,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
- } else {
-- const fastUpdatesEnabled = this.configurationService.getValue('update.enableWindowsBackgroundUpdates');
-+ const fastUpdatesEnabled = getUpdateType() === UpdateType.Setup && this.configurationService.getValue('update.enableWindowsBackgroundUpdates');
- // GC for background updates in system setup happens via inno_setup since it requires
-@@ -182,12 +186,22 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
-
-- protected buildUpdateFeedUrl(quality: string, commit: string, options?: IUpdateURLOptions): string | undefined {
-- let platform = `win32-${process.arch}`;
--
-- if (getUpdateType() === UpdateType.Archive) {
-- platform += '-archive';
-- } else if (this.productService.target === 'user') {
-- platform += '-user';
-+ protected buildUpdateFeedUrl(quality: string, _commit: string, _options?: IUpdateURLOptions): string | undefined {
-+ let target: Target;
-+
-+ switch (getUpdateType()) {
-+ case UpdateType.Archive:
-+ target = "archive"
-+ break;
-+ case UpdateType.WindowsInstaller:
-+ target = "msi"
-+ break;
-+ default:
-+ if (this.productService.target === 'user') {
-+ target = "user"
-+ }
-+ else {
-+ target = "system"
-+ }
- }
-
-- return createUpdateURL(this.productService.updateUrl!, platform, quality, commit, options);
-+ return createUpdateURL(this.productService, quality, process.platform, process.arch, target);
- }
-@@ -209,3 +223,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
- const headers = getUpdateRequestHeaders(this.productService.version);
-- this.requestService.request({ url, headers, callSite: 'updateService.win32.checkForUpdates' }, CancellationToken.None)
-+ this.requestService.request({ url, headers, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None)
- .then(asJson)
-@@ -226,2 +240,10 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
-
-+ const fetchedVersion = /\d+\.\d+\.\d+\.\d+/.test(update.productVersion) ? update.productVersion.replace(/(\d+\.\d+\.\d+)\.\d+(\-\w+)?/, '$1$2') : update.productVersion.replace(/(\d+\.\d+\.)0+(\d+)(\-\w+)?/, '$1$2$3')
-+ const currentVersion = this.productService.version.replace(/(\d+\.\d+\.)0+(\d+)(\-\w+)?/, '$1$2$3')
-+
-+ if(semver.compareBuild(currentVersion, fetchedVersion) >= 0) {
-+ this.setState(State.Idle(updateType, undefined, explicit || undefined));
-+ return Promise.resolve(null);
-+ }
-+
- if (updateType === UpdateType.Archive) {
-@@ -258,3 +280,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
-
-- return this.requestService.request({ url: update.url, callSite: 'updateService.win32.downloadUpdate' }, CancellationToken.None)
-+ return this.requestService.request({ url: update.url, callSite: NO_FETCH_TELEMETRY }, CancellationToken.None)
- .then(context => {
-@@ -304,3 +326,2 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
- .then(undefined, err => {
-- this.telemetryService.publicLog2<{ messageHash: string }, UpdateErrorClassification>('update:error', { messageHash: String(hash(String(err))) });
- this.logService.error(err);
-@@ -368,20 +389,31 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
- await pfs.Promises.writeFile(this.availableUpdate.updateFilePath, 'flag');
-- const child = spawn(this.availableUpdate.packagePath,
-- [
-- '/verysilent',
-- '/log',
-- `/update="${this.availableUpdate.updateFilePath}"`,
-- `/progress="${progressFilePath}"`,
-- `/sessionend="${sessionEndFlagPath}"`,
-- `/cancel="${cancelFilePath}"`,
-- '/nocloseapplications',
-- '/mergetasks=runcode,!desktopicon,!quicklaunchicon'
-- ],
-- {
-+
-+ let child: ChildProcess
-+
-+ const type = getUpdateType();
-+ if (type == UpdateType.WindowsInstaller) {
-+ child = spawn('msiexec.exe', ['/i', this.availableUpdate.packagePath], {
- detached: true,
-- stdio: ['ignore', 'ignore', 'ignore'],
-- windowsVerbatimArguments: true,
-- env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' }
-- }
-- );
-+ stdio: ['ignore', 'ignore', 'ignore']
-+ });
-+ } else {
-+ child = spawn(this.availableUpdate.packagePath,
-+ [
-+ '/verysilent',
-+ '/log',
-+ `/update="${this.availableUpdate.updateFilePath}"`,
-+ `/progress="${progressFilePath}"`,
-+ `/sessionend="${sessionEndFlagPath}"`,
-+ `/cancel="${cancelFilePath}"`,
-+ '/nocloseapplications',
-+ '/mergetasks=runcode,!desktopicon,!quicklaunchicon'
-+ ],
-+ {
-+ detached: true,
-+ stdio: ['ignore', 'ignore', 'ignore'],
-+ windowsVerbatimArguments: true,
-+ env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' }
-+ }
-+ );
-+ }
-
diff --git a/patches/windows/win7.patch b/patches/windows/00-build-min-version-win7.patch
similarity index 100%
rename from patches/windows/win7.patch
rename to patches/windows/00-build-min-version-win7.patch
diff --git a/patches/windows/00-build-replace-signature.patch b/patches/windows/00-build-replace-signature.patch
new file mode 100644
index 00000000000..ea67bea3ea0
--- /dev/null
+++ b/patches/windows/00-build-replace-signature.patch
@@ -0,0 +1,185 @@
+diff --git a/build/gulpfile.reh.ts b/build/gulpfile.reh.ts
+index 62c30da5..46925452 100644
+--- a/build/gulpfile.reh.ts
++++ b/build/gulpfile.reh.ts
+@@ -33,2 +33,3 @@ import { getCopilotExcludeFilter, getCopilotRuntimePrebuildFiles, getCopilotTgre
+ import { readAgentSdkResults } from './agent-sdk/common.ts';
++import { stripAuthenticodeSignature } from './win32/signature.ts';
+
+@@ -486,34 +487,2 @@ function packageTask(type: string, platform: string, arch: string, sourceFolderN
+
+-function hasAuthenticodeSignature(filePath: string): Promise {
+- return new Promise((resolve, reject) => {
+- const proc = cp.spawn('signtool.exe', ['verify', '/pa', filePath]);
+- proc.on('error', reject);
+- proc.on('exit', code => resolve(code === 0));
+- });
+-}
+-
+-async function stripAuthenticodeSignature(filePath: string): Promise {
+- // ESRP's `signtool /as` (append) fails with 0x800700C1 on PEs whose existing
+- // Authenticode signature was invalidated by rcedit. Strip cleanly first so
+- // rcedit operates on an unsigned PE.
+- if (!await hasAuthenticodeSignature(filePath)) {
+- return;
+- }
+- await new Promise((resolve, reject) => {
+- const proc = cp.spawn('signtool.exe', ['remove', '/s', filePath]);
+- let out = '';
+- proc.stdout?.on('data', chunk => out += chunk.toString());
+- proc.stderr?.on('data', chunk => out += chunk.toString());
+- proc.on('error', reject);
+- proc.on('exit', code => {
+- if (code === 0) {
+- resolve();
+- } else {
+- process.stderr.write(out);
+- reject(new Error(`signtool remove /s failed for ${filePath} (exit ${code})`));
+- }
+- });
+- });
+-}
+-
+ function patchWin32DependenciesTask(destinationFolderName: string) {
+@@ -539,3 +508,3 @@ function patchWin32DependenciesTask(destinationFolderName: string) {
+ 'version-string': {
+- 'CompanyName': 'Microsoft Corporation',
++ 'CompanyName': '!!ORG_NAME!!',
+ 'FileDescription': productContents.nameLong,
+@@ -543,3 +512,3 @@ function patchWin32DependenciesTask(destinationFolderName: string) {
+ 'InternalName': basename,
+- 'LegalCopyright': 'Copyright (C) 2026 Microsoft. All rights reserved',
++ 'LegalCopyright': 'Copyright (C) 2026 !!ORG_NAME!!. All rights reserved',
+ 'OriginalFilename': basename,
+diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
+index 53987f88..bac039b8 100644
+--- a/build/gulpfile.vscode.ts
++++ b/build/gulpfile.vscode.ts
+@@ -21,3 +21,2 @@ import product from '../product.json' with { type: 'json' };
+ import * as crypto from 'crypto';
+-import * as cp from 'child_process';
+ import * as i18n from './lib/i18n.ts';
+@@ -38,2 +37,3 @@ import { spawnTsgo } from './lib/tsgo.ts';
+ import { runEsbuildTranspile, runEsbuildBundle } from './lib/esbuild.ts';
++import { stripAuthenticodeSignature } from './win32/signature.ts';
+
+@@ -532,34 +532,2 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
+
+-function hasAuthenticodeSignature(filePath: string): Promise {
+- return new Promise((resolve, reject) => {
+- const proc = cp.spawn('signtool.exe', ['verify', '/pa', filePath]);
+- proc.on('error', reject);
+- proc.on('exit', code => resolve(code === 0));
+- });
+-}
+-
+-async function stripAuthenticodeSignature(filePath: string): Promise {
+- // ESRP's `signtool /as` (append) fails with 0x800700C1 on PEs whose existing
+- // Authenticode signature was invalidated by rcedit. Strip cleanly first so
+- // rcedit operates on an unsigned PE.
+- if (!await hasAuthenticodeSignature(filePath)) {
+- return;
+- }
+- await new Promise((resolve, reject) => {
+- const proc = cp.spawn('signtool.exe', ['remove', '/s', filePath]);
+- let out = '';
+- proc.stdout?.on('data', chunk => out += chunk.toString());
+- proc.stderr?.on('data', chunk => out += chunk.toString());
+- proc.on('error', reject);
+- proc.on('exit', code => {
+- if (code === 0) {
+- resolve();
+- } else {
+- process.stderr.write(out);
+- reject(new Error(`signtool remove /s failed for ${filePath} (exit ${code})`));
+- }
+- });
+- });
+-}
+-
+ function patchWin32DependenciesTask(destinationFolderName: string) {
+@@ -587,3 +555,3 @@ function patchWin32DependenciesTask(destinationFolderName: string) {
+ 'version-string': {
+- 'CompanyName': 'Microsoft Corporation',
++ 'CompanyName': '!!ORG_NAME!!',
+ 'FileDescription': product.nameLong,
+@@ -591,3 +559,3 @@ function patchWin32DependenciesTask(destinationFolderName: string) {
+ 'InternalName': basename,
+- 'LegalCopyright': 'Copyright (C) 2026 Microsoft. All rights reserved',
++ 'LegalCopyright': 'Copyright (C) 2026 !!ORG_NAME!!. All rights reserved',
+ 'OriginalFilename': basename,
+diff --git a/build/win32/signature.ts b/build/win32/signature.ts
+new file mode 100644
+index 00000000..ee722946
+--- /dev/null
++++ b/build/win32/signature.ts
+@@ -0,0 +1,68 @@
++import * as cp from 'child_process';
++import { promises as fs } from 'node:fs';
++
++export async function stripAuthenticodeSignature(filePath: string): Promise {
++ const signPath = await getSigntoolPath()
++ // ESRP's `signtool /as` (append) fails with 0x800700C1 on PEs whose existing
++ // Authenticode signature was invalidated by rcedit. Strip cleanly first so
++ // rcedit operates on an unsigned PE.
++ if (!await hasAuthenticodeSignature(filePath, signPath)) {
++ return;
++ }
++ await new Promise((resolve, reject) => {
++ const proc = cp.spawn(signPath, ['remove', '/s', filePath]);
++ let out = '';
++ proc.stdout?.on('data', chunk => out += chunk.toString());
++ proc.stderr?.on('data', chunk => out += chunk.toString());
++ proc.on('error', reject);
++ proc.on('exit', code => {
++ if (code === 0) {
++ resolve();
++ } else {
++ process.stderr.write(out);
++ reject(new Error(`signtool remove /s failed for ${filePath} (exit ${code})`));
++ }
++ });
++ });
++}
++
++async function getSigntoolPath(): Promise {
++ const windowsKitsFolder = 'C:/Program Files (x86)/Windows Kits/10/bin/';
++ const folders = await fs.readdir(windowsKitsFolder);
++ let fileName = '';
++ let maxVersion = 0;
++ for (const folder of folders) {
++ if (!folder.endsWith('.0')) {
++ continue;
++ }
++ const folderVersion = parseInt(folder.replace(/\./g,''));
++ if (folderVersion > maxVersion) {
++ const signtoolFilename = `${windowsKitsFolder}${folder}/x64/signtool.exe`;
++ try {
++ const stat = await fs.stat(signtoolFilename);
++ if (stat.isFile()) {
++ fileName = signtoolFilename;
++ maxVersion = folderVersion;
++ }
++ }
++ catch {
++ console.warn('Skipping %s due to error.', signtoolFilename);
++ }
++ }
++ }
++ if(fileName == '') {
++ throw new Error('Unable to find signtool.exe in ' + windowsKitsFolder);
++ }
++
++ console.log(`Signtool location is ${fileName}.`);
++
++ return fileName;
++}
++
++function hasAuthenticodeSignature(filePath: string, signPath: string): Promise {
++ return new Promise((resolve, reject) => {
++ const proc = cp.spawn(signPath, ['verify', '/pa', filePath]);
++ proc.on('error', reject);
++ proc.on('exit', code => resolve(code === 0));
++ });
++}
+\ No newline at end of file
diff --git a/patches/windows/00-remote-use-open-ext.patch b/patches/windows/00-remote-use-open-ext.patch
new file mode 100644
index 00000000000..986f98777ef
--- /dev/null
+++ b/patches/windows/00-remote-use-open-ext.patch
@@ -0,0 +1,73 @@
+diff --git i/resources/win32/bin/code.sh w/resources/win32/bin/code.sh
+index bcf31892c23..f19cde6b9e1 100644
+--- i/resources/win32/bin/code.sh
++++ w/resources/win32/bin/code.sh
+@@ -11,6 +11,7 @@ APP_NAME="@@APPNAME@@"
+ QUALITY="@@QUALITY@@"
+ NAME="@@NAME@@"
+ SERVERDATAFOLDER="@@SERVERDATAFOLDER@@"
++VERSION="@@VERSION@@"
+ VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")"
+ ELECTRON="$VSCODE_PATH/$NAME.exe"
+
+@@ -41,7 +42,7 @@ if [ $IN_WSL = true ]; then
+ CLI=$(wslpath -m "$VSCODE_PATH/resources/app/out/cli.js")
+
+ # use the Remote WSL extension if installed
+- WSL_EXT_ID="ms-vscode-remote.remote-wsl"
++ WSL_EXT_ID="${VSCODE_WSL_EXTENSION_ID:-jeanp413.open-remote-wsl}"
+
+ ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" --locate-extension $WSL_EXT_ID >/tmp/remote-wsl-loc.txt 2>/dev/null /tmp/remote-wsl-loc.txt 2>/dev/null }).win32ContextMenu![arch].clsid))
+- .pipe(replace('@@FileExplorerContextMenuDLL@@', `${quality === 'stable' ? 'code' : 'code_insider'}_explorer_command_${arch}.dll`))
+- .pipe(rename(f => f.dirname = `appx/manifest`)));
+- }
++ // if (quality === 'stable' || quality === 'insider') {
++ // result = es.merge(result, gulp.src('.build/win32/appx/**', { base: '.build/win32' }));
++ // const rawVersion = version.replace(/-\w+$/, '').split('.');
++ // const appxVersion = `${rawVersion[0]}.0.${rawVersion[1]}.${rawVersion[2].slice(1)}`;
++ // result = es.merge(result, gulp.src('resources/win32/appx/AppxManifest.xml', { base: '.' })
++ // .pipe(replace('@@AppxPackageName@@', product.win32AppUserModelId))
++ // .pipe(replace('@@AppxPackageVersion@@', appxVersion))
++ // .pipe(replace('@@AppxPackageDisplayName@@', product.nameLong))
++ // .pipe(replace('@@AppxPackageDescription@@', product.win32NameVersion))
++ // .pipe(replace('@@ApplicationIdShort@@', product.win32RegValueName))
++ // .pipe(replace('@@ApplicationExe@@', product.nameShort + '.exe'))
++ // .pipe(replace('@@FileExplorerContextMenuID@@', quality === 'stable' ? 'OpenWithCode' : 'OpenWithCodeInsiders'))
++ // .pipe(replace('@@FileExplorerContextMenuCLSID@@', (product as { win32ContextMenu?: Record }).win32ContextMenu![arch].clsid))
++ // .pipe(replace('@@FileExplorerContextMenuDLL@@', `${quality === 'stable' ? 'code' : 'code_insider'}_explorer_command_${arch}.dll`))
++ // .pipe(rename(f => f.dirname = `appx/manifest`)));
++ // }
+ } else if (platform === 'linux') {
+diff --git a/build/gulpfile.vscode.win32.ts b/build/gulpfile.vscode.win32.ts
+index 3f168c42..d4bbfc26 100644
+--- a/build/gulpfile.vscode.win32.ts
++++ b/build/gulpfile.vscode.win32.ts
+@@ -113,11 +113,11 @@ function buildWin32Setup(arch: string, target: string): task.CallbackTask {
+
+- if (quality === 'stable' || quality === 'insider') {
+- definitions['AppxPackage'] = `${product.applicationName.replaceAll('-', '_')}_${arch}.appx`;
+- definitions['AppxPackageDll'] = `${product.applicationName.replaceAll('-', '_')}_explorer_command_${arch}.dll`;
+- definitions['AppxPackageName'] = `${product.win32AppUserModelId}`;
+- const ctxMenu = (product as { win32ContextMenu?: Record }).win32ContextMenu;
+- if (ctxMenu && ctxMenu[arch]) {
+- definitions['FileExplorerContextMenuCLSID'] = ctxMenu[arch].clsid;
+- }
+- }
++ // if (quality === 'stable' || quality === 'insider') {
++ // definitions['AppxPackage'] = `${product.applicationName.replaceAll('-', '_')}_${arch}.appx`;
++ // definitions['AppxPackageDll'] = `${product.applicationName.replaceAll('-', '_')}_explorer_command_${arch}.dll`;
++ // definitions['AppxPackageName'] = `${product.win32AppUserModelId}`;
++ // const ctxMenu = (product as { win32ContextMenu?: Record }).win32ContextMenu;
++ // if (ctxMenu && ctxMenu[arch]) {
++ // definitions['FileExplorerContextMenuCLSID'] = ctxMenu[arch].clsid;
++ // }
++ // }
+
diff --git a/patches/windows/appx.patch b/patches/windows/appx.patch
deleted file mode 100644
index 60e992de821..00000000000
--- a/patches/windows/appx.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-diff --git a/build/gulpfile.vscode.ts b/build/gulpfile.vscode.ts
-index d3ab651..d067b5b 100644
---- a/build/gulpfile.vscode.ts
-+++ b/build/gulpfile.vscode.ts
-@@ -432,19 +432,2 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
- .pipe(rename(f => f.dirname = `policies/${f.dirname}`)));
--
-- if (quality === 'stable' || quality === 'insider') {
-- result = es.merge(result, gulp.src('.build/win32/appx/**', { base: '.build/win32' }));
-- const rawVersion = version.replace(/-\w+$/, '').split('.');
-- const appxVersion = `${rawVersion[0]}.0.${rawVersion[1]}.${rawVersion[2]}`;
-- result = es.merge(result, gulp.src('resources/win32/appx/AppxManifest.xml', { base: '.' })
-- .pipe(replace('@@AppxPackageName@@', product.win32AppUserModelId))
-- .pipe(replace('@@AppxPackageVersion@@', appxVersion))
-- .pipe(replace('@@AppxPackageDisplayName@@', product.nameLong))
-- .pipe(replace('@@AppxPackageDescription@@', product.win32NameVersion))
-- .pipe(replace('@@ApplicationIdShort@@', product.win32RegValueName))
-- .pipe(replace('@@ApplicationExe@@', product.nameShort + '.exe'))
-- .pipe(replace('@@FileExplorerContextMenuID@@', quality === 'stable' ? 'OpenWithCode' : 'OpenWithCodeInsiders'))
-- .pipe(replace('@@FileExplorerContextMenuCLSID@@', (product as { win32ContextMenu?: Record }).win32ContextMenu![arch].clsid))
-- .pipe(replace('@@FileExplorerContextMenuDLL@@', `${quality === 'stable' ? 'code' : 'code_insider'}_explorer_command_${arch}.dll`))
-- .pipe(rename(f => f.dirname = `appx/manifest`)));
-- }
- } else if (platform === 'linux') {
-diff --git a/build/gulpfile.vscode.win32.ts b/build/gulpfile.vscode.win32.ts
-index a7b01f0..43c93b8 100644
---- a/build/gulpfile.vscode.win32.ts
-+++ b/build/gulpfile.vscode.win32.ts
-@@ -117,8 +117,2 @@ function buildWin32Setup(arch: string, target: string): task.CallbackTask {
-
-- if (quality === 'stable' || quality === 'insider') {
-- definitions['AppxPackage'] = `${quality === 'stable' ? 'code' : 'code_insider'}_${arch}.appx`;
-- definitions['AppxPackageDll'] = `${quality === 'stable' ? 'code' : 'code_insider'}_explorer_command_${arch}.dll`;
-- definitions['AppxPackageName'] = `${product.win32AppUserModelId}`;
-- }
--
- packageInnoSetup(issPath, { definitions }, cb as (err?: Error | null) => void);
diff --git a/prepare_assets.sh b/prepare_assets.sh
index 269cefac265..5abfd565de5 100755
--- a/prepare_assets.sh
+++ b/prepare_assets.sh
@@ -8,198 +8,15 @@ APP_NAME_LC="$( echo "${APP_NAME}" | awk '{print tolower($0)}' )"
mkdir -p assets
if [[ "${OS_NAME}" == "osx" ]]; then
- if [[ -n "${CERTIFICATE_OSX_P12_DATA}" ]]; then
- if [[ "${CI_BUILD}" == "no" ]]; then
- RUNNER_TEMP="${TMPDIR}"
- fi
-
- CERTIFICATE_P12="${APP_NAME}.p12"
- KEYCHAIN="${RUNNER_TEMP}/buildagent.keychain"
- AGENT_TEMPDIRECTORY="${RUNNER_TEMP}"
- # shellcheck disable=SC2006
- KEYCHAINS=`security list-keychains | xargs`
-
- rm -f "${KEYCHAIN}"
-
- echo "${CERTIFICATE_OSX_P12_DATA}" | base64 --decode > "${CERTIFICATE_P12}"
-
- echo "+ create temporary keychain"
- security create-keychain -p pwd "${KEYCHAIN}"
- security set-keychain-settings -lut 21600 "${KEYCHAIN}"
- security unlock-keychain -p pwd "${KEYCHAIN}"
- # shellcheck disable=SC2086
- security list-keychains -s $KEYCHAINS "${KEYCHAIN}"
- # security show-keychain-info "${KEYCHAIN}"
-
- echo "+ import certificate to keychain"
- security import "${CERTIFICATE_P12}" -k "${KEYCHAIN}" -P "${CERTIFICATE_OSX_P12_PASSWORD}" -T /usr/bin/codesign
- security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k pwd "${KEYCHAIN}" > /dev/null
- # security find-identity "${KEYCHAIN}"
-
- CODESIGN_IDENTITY="$( security find-identity -v -p codesigning "${KEYCHAIN}" | grep -oEi "([0-9A-F]{40})" | head -n 1 )"
-
- echo "+ signing"
- export CODESIGN_IDENTITY AGENT_TEMPDIRECTORY
-
- DEBUG="electron-osx-sign*" node vscode/build/darwin/sign.ts "$( pwd )"
- # codesign --display --entitlements :- ""
-
- echo "+ notarize"
-
- cd "VSCode-darwin-${VSCODE_ARCH}"
- ZIP_FILE="./${APP_NAME}-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.zip"
-
- zip -r -X -y "${ZIP_FILE}" ./*.app
-
- xcrun notarytool store-credentials "${APP_NAME}" --apple-id "${CERTIFICATE_OSX_ID}" --team-id "${CERTIFICATE_OSX_TEAM_ID}" --password "${CERTIFICATE_OSX_APP_PASSWORD}" --keychain "${KEYCHAIN}"
- # xcrun notarytool history --keychain-profile "${APP_NAME}" --keychain "${KEYCHAIN}"
- xcrun notarytool submit "${ZIP_FILE}" --keychain-profile "${APP_NAME}" --wait --keychain "${KEYCHAIN}"
-
- echo "+ attach staple"
- xcrun stapler staple ./*.app
- # spctl --assess -vv --type install ./*.app
-
- rm "${ZIP_FILE}"
-
- cd ..
- fi
-
- if [[ "${SHOULD_BUILD_ZIP}" != "no" ]]; then
- echo "Building and moving ZIP"
- cd "VSCode-darwin-${VSCODE_ARCH}"
- zip -r -X -y "../assets/${APP_NAME}-darwin-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" ./*.app
- cd ..
- fi
-
- if [[ -n "${CERTIFICATE_OSX_P12_DATA}" && "${SHOULD_BUILD_DMG}" != "no" ]]; then
- echo "Building and moving DMG"
- pushd "VSCode-darwin-${VSCODE_ARCH}"
- npx create-dmg ./*.app .
- mv ./*.dmg "../assets/${APP_NAME}.${VSCODE_ARCH}.${RELEASE_VERSION}.dmg"
- popd
- fi
-
- if [[ "${SHOULD_BUILD_SRC}" == "yes" ]]; then
- git archive --format tar.gz --output="./assets/${APP_NAME}-${RELEASE_VERSION}-src.tar.gz" HEAD
- git archive --format zip --output="./assets/${APP_NAME}-${RELEASE_VERSION}-src.zip" HEAD
- fi
-
- if [[ -n "${CERTIFICATE_OSX_P12_DATA}" ]]; then
- echo "+ clean"
- security delete-keychain "${KEYCHAIN}"
- # shellcheck disable=SC2086
- security list-keychains -s $KEYCHAINS
- fi
+ . ./build/osx/prepare_assets.sh
VSCODE_PLATFORM="darwin"
elif [[ "${OS_NAME}" == "windows" ]]; then
- cd vscode || { echo "'vscode' dir not found"; exit 1; }
-
- npm run gulp "vscode-win32-${VSCODE_ARCH}-inno-updater"
-
- if [[ "${SHOULD_BUILD_ZIP}" != "no" ]]; then
- 7z.exe a -tzip "../assets/${APP_NAME}-win32-${VSCODE_ARCH}-${RELEASE_VERSION}.zip" -x!CodeSignSummary*.md -x!tools "../VSCode-win32-${VSCODE_ARCH}/*" -r
- fi
-
- # . ../build/windows/appx/build.sh
-
- if [[ "${SHOULD_BUILD_EXE_SYS}" != "no" ]]; then
- npm run gulp "vscode-win32-${VSCODE_ARCH}-system-setup"
- fi
-
- if [[ "${SHOULD_BUILD_EXE_USR}" != "no" ]]; then
- npm run gulp "vscode-win32-${VSCODE_ARCH}-user-setup"
- fi
-
- if [[ "${VSCODE_ARCH}" == "ia32" || "${VSCODE_ARCH}" == "x64" ]]; then
- if [[ "${SHOULD_BUILD_MSI}" != "no" ]]; then
- . ../build/windows/msi/build.sh
- fi
-
- if [[ "${SHOULD_BUILD_MSI_NOUP}" != "no" ]]; then
- . ../build/windows/msi/build-updates-disabled.sh
- fi
- fi
-
- cd ..
-
- if [[ "${SHOULD_BUILD_EXE_SYS}" != "no" ]]; then
- echo "Moving System EXE"
- mv "vscode\\.build\\win32-${VSCODE_ARCH}\\system-setup\\VSCodeSetup.exe" "assets\\${APP_NAME}Setup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe"
- fi
-
- if [[ "${SHOULD_BUILD_EXE_USR}" != "no" ]]; then
- echo "Moving User EXE"
- mv "vscode\\.build\\win32-${VSCODE_ARCH}\\user-setup\\VSCodeSetup.exe" "assets\\${APP_NAME}UserSetup-${VSCODE_ARCH}-${RELEASE_VERSION}.exe"
- fi
-
- if [[ "${VSCODE_ARCH}" == "ia32" || "${VSCODE_ARCH}" == "x64" ]]; then
- if [[ "${SHOULD_BUILD_MSI}" != "no" ]]; then
- echo "Moving MSI"
- mv "build\\windows\\msi\\releasedir\\${APP_NAME}-${VSCODE_ARCH}-${RELEASE_VERSION}.msi" assets/
- fi
-
- if [[ "${SHOULD_BUILD_MSI_NOUP}" != "no" ]]; then
- echo "Moving MSI with disabled updates"
- mv "build\\windows\\msi\\releasedir\\${APP_NAME}-${VSCODE_ARCH}-updates-disabled-${RELEASE_VERSION}.msi" assets/
- fi
- fi
+ . ./build/windows/prepare_assets.sh
VSCODE_PLATFORM="win32"
else
- cd vscode || { echo "'vscode' dir not found"; exit 1; }
-
- if [[ "${SHOULD_BUILD_APPIMAGE}" != "no" && "${VSCODE_ARCH}" != "x64" ]]; then
- SHOULD_BUILD_APPIMAGE="no"
- fi
-
- if [[ "${SHOULD_BUILD_DEB}" != "no" || "${SHOULD_BUILD_APPIMAGE}" != "no" ]]; then
- npm run gulp "vscode-linux-${VSCODE_ARCH}-prepare-deb"
- npm run gulp "vscode-linux-${VSCODE_ARCH}-build-deb"
- fi
-
- if [[ "${SHOULD_BUILD_RPM}" != "no" ]]; then
- npm run gulp "vscode-linux-${VSCODE_ARCH}-prepare-rpm"
- npm run gulp "vscode-linux-${VSCODE_ARCH}-build-rpm"
- fi
-
- if [[ "${SHOULD_BUILD_APPIMAGE}" != "no" ]]; then
- . ../build/linux/appimage/build.sh
- fi
-
- cd ..
-
- if [[ "${CI_BUILD}" == "no" ]]; then
- . ./stores/snapcraft/build.sh
-
- if [[ "${SKIP_ASSETS}" == "no" ]]; then
- mv stores/snapcraft/build/*.snap assets/
- fi
- fi
-
- if [[ "${SHOULD_BUILD_TAR}" != "no" ]]; then
- echo "Building and moving TAR"
- cd "VSCode-linux-${VSCODE_ARCH}"
- tar czf "../assets/${APP_NAME}-linux-${VSCODE_ARCH}-${RELEASE_VERSION}.tar.gz" .
- cd ..
- fi
-
- if [[ "${SHOULD_BUILD_DEB}" != "no" ]]; then
- echo "Moving DEB"
- mv vscode/.build/linux/deb/*/deb/*.deb assets/
- fi
-
- if [[ "${SHOULD_BUILD_RPM}" != "no" ]]; then
- echo "Moving RPM"
- mv vscode/.build/linux/rpm/*/*.rpm assets/
- fi
-
- if [[ "${SHOULD_BUILD_APPIMAGE}" != "no" ]]; then
- echo "Moving AppImage"
- mv build/linux/appimage/out/*.AppImage* assets/
-
- find assets -name '*.AppImage*' -exec bash -c 'mv $0 ${0/_-_/-}' {} \;
- fi
+ . ./build/linux/prepare_assets.sh
VSCODE_PLATFORM="linux"
fi
diff --git a/prepare_vscode.sh b/prepare_vscode.sh
index 1761c7f24aa..574f938207f 100755
--- a/prepare_vscode.sh
+++ b/prepare_vscode.sh
@@ -144,9 +144,15 @@ echo "ORG_NAME=\"${ORG_NAME}\""
echo "TUNNEL_APP_NAME=\"${TUNNEL_APP_NAME}\""
if [[ "${DISABLE_UPDATE}" == "yes" ]]; then
- mv ../patches/disable-update.patch.yet ../patches/disable-update.patch
+ mv ../patches/00-update-disable.patch.yet ../patches/00-update-disable.patch
fi
+for file in ../patches/*.json; do
+ if [[ -f "${file}" ]]; then
+ apply_actions "${file}"
+ fi
+done
+
for file in ../patches/*.patch; do
if [[ -f "${file}" ]]; then
apply_patch "${file}"
diff --git a/product.json b/product.json
index 0706b1615f3..293d6695cc6 100644
--- a/product.json
+++ b/product.json
@@ -254,6 +254,7 @@
],
"GitHub.copilot-chat": [
"agentSessionsWorkspace",
+ "agentsWindowConfiguration",
"interactive",
"terminalDataWriteEvent",
"terminalExecuteCommandEvent",
@@ -303,9 +304,11 @@
"taskExecutionTerminal",
"dataChannels",
"chatSessionsProvider",
+ "chatSessionCustomizationProvider",
"devDeviceId",
"contribEditorContentMenu",
"tokenInformation",
+ "toolInvocationApproveCombination",
"chatPromptFiles",
"mcpServerDefinitions",
"tabInputMultiDiff",
@@ -313,7 +316,9 @@
"chatHooks",
"chatDebug",
"environmentPower",
- "terminalTitle"
+ "terminalTitle",
+ "languageModelPricing",
+ "chatInputNotification"
],
"GitHub.remotehub": [
"contribRemoteHelp",
@@ -413,6 +418,10 @@
"ms-autodev.vscode-autodev": [
"chatParticipantAdditions"
],
+ "vscjava.migrate-java-to-azure": [
+ "chatParticipantAdditions",
+ "chatParticipantPrivate"
+ ],
"vscjava.vscode-java-upgrade": [
"chatParticipantAdditions",
"chatParticipantPrivate"
@@ -437,6 +446,10 @@
"ms-vscode.vscode-eng-codereview": [
"chatContextProvider"
],
+ "ms-vscode.vscode-chat-customizations-evaluations": [
+ "chatSessionCustomizationProvider",
+ "contribEditorContentMenu"
+ ],
"jeanp413.open-remote-ssh": [
"resolvers",
"tunnels",
diff --git a/release_notes.md b/release_notes.md
index c9fdf950b76..105ce77ae34 100644
--- a/release_notes.md
+++ b/release_notes.md
@@ -187,41 +187,19 @@ update vscode to [@@MS_TAG@@](@@MS_URL@@)
-## ARM 32bits
+## PPC 64bits
-
-## PPC 64bits
-
-
## RISC-V 64bits
diff --git a/stores/snapcraft/insider/snap/local/bin/electron-launch b/stores/snapcraft/insider/snap/local/bin/electron-launch
index ba7f293f666..157939adbe4 100755
--- a/stores/snapcraft/insider/snap/local/bin/electron-launch
+++ b/stores/snapcraft/insider/snap/local/bin/electron-launch
@@ -77,8 +77,6 @@ chmod 700 "$SNAP_USER_DATA/.config"
if [ "$SNAP_ARCH" == "amd64" ]; then
ARCH="x86_64-linux-gnu"
-elif [ "$SNAP_ARCH" == "armhf" ]; then
- ARCH="arm-linux-gnueabihf"
elif [ "$SNAP_ARCH" == "arm64" ]; then
ARCH="aarch64-linux-gnu"
else
diff --git a/stores/snapcraft/stable/snap/local/bin/electron-launch b/stores/snapcraft/stable/snap/local/bin/electron-launch
index ba7f293f666..157939adbe4 100755
--- a/stores/snapcraft/stable/snap/local/bin/electron-launch
+++ b/stores/snapcraft/stable/snap/local/bin/electron-launch
@@ -77,8 +77,6 @@ chmod 700 "$SNAP_USER_DATA/.config"
if [ "$SNAP_ARCH" == "amd64" ]; then
ARCH="x86_64-linux-gnu"
-elif [ "$SNAP_ARCH" == "armhf" ]; then
- ARCH="arm-linux-gnueabihf"
elif [ "$SNAP_ARCH" == "arm64" ]; then
ARCH="aarch64-linux-gnu"
else
diff --git a/upstream/insider.json b/upstream/insider.json
index 7b0d84b78bd..fe07fae52fe 100644
--- a/upstream/insider.json
+++ b/upstream/insider.json
@@ -1,4 +1,4 @@
{
- "tag": "1.112.0",
- "commit": "07ff9d6178ede9a1bd12ad3399074d726ebe6e43"
+ "tag": "1.126.0",
+ "commit": "7e7950df89d055b5a378379db9ee14290772148a"
}
diff --git a/upstream/stable.json b/upstream/stable.json
index 7b0d84b78bd..fe07fae52fe 100644
--- a/upstream/stable.json
+++ b/upstream/stable.json
@@ -1,4 +1,4 @@
{
- "tag": "1.112.0",
- "commit": "07ff9d6178ede9a1bd12ad3399074d726ebe6e43"
+ "tag": "1.126.0",
+ "commit": "7e7950df89d055b5a378379db9ee14290772148a"
}
diff --git a/utils.sh b/utils.sh
index 595aaba3adf..132812c116c 100755
--- a/utils.sh
+++ b/utils.sh
@@ -16,6 +16,32 @@ fi
# All common functions can be added to this file
+apply_actions() {
+ jq -c '.[]' "$1" | while IFS= read -r ENTRY; do
+ ENTRY_ACTION=$( jq -r '.action // empty' <<< "${ENTRY}" )
+
+ case "${ENTRY_ACTION}" in
+ remove)
+ jq -r '.paths[]' <<< "${ENTRY}" | while IFS= read -r ENTRY_PATH; do
+ ENTRY_PATH="${ENTRY_PATH%$'\r'}"
+
+ if [[ -e "${ENTRY_PATH}" ]]; then
+ if rm -rf -- "${ENTRY_PATH}"; then
+ echo "Removed: ${ENTRY_PATH}"
+ else
+ echo "Failed to remove: ${ENTRY_PATH}" >&2
+ exit 4
+ fi
+ else
+ echo "Not found: ${ENTRY_PATH}" >&2
+ exit 4
+ fi
+ done
+ ;;
+ esac
+ done
+}
+
apply_patch() {
if [[ -z "$2" ]]; then
echo applying patch: "$1";