openvibers/source.openvibe.games Commits
Recent phases
Changes
nnew file mode 100644@@@ -0,0 +1,11 @@++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/file-list.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/full-run.log++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-default.log++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-mp.log++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/dll-search.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/engine-before-build.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/no-patched-dlls.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/project-search.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/repo-root-before-build.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/tree.txtnnew file mode 100644nnew file mode 100644BBinary files /dev/null and b/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-default.log differnnew file mode 100644BBinary files /dev/null and b/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-mp.log differnnew file mode 100644@@@ -0,0 +1,111 @@++[openvibe-sdk-bootstrap] root=D:\a\OpenVibe.Games\OpenVibe.Games++[openvibe-sdk-bootstrap] sdk=D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013++[openvibe-sdk-bootstrap] logdir=D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug++[openvibe-sdk-bootstrap] cloning Valve Source SDK 2013 branch mp++[openvibe-sdk-bootstrap] git++usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]++ [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]++ [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]++ [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>]++ [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>]++ <command> [<args>]++++These are common Git commands used in various situations:++++start a working area (see also: git help tutorial)++ clone Clone a repository into a new directory++ init Create an empty Git repository or reinitialize an existing one++++work on the current change (see also: git help everyday)++ add Add file contents to the index++ mv Move or rename a file, a directory, or a symlink++ restore Restore working tree files++ rm Remove files from the working tree and from the index++++examine the history and state (see also: git help revisions)++ bisect Use binary search to find the commit that introduced a bug++ diff Show changes between commits, commit and working tree, etc++ grep Print lines matching a pattern++ log Show commit logs++ show Show various types of objects++ status Show the working tree status++++grow, mark and tweak your common history++ backfill Download missing objects in a partial clone++ branch List, create, or delete branches++ commit Record changes to the repository++ history EXPERIMENTAL: Rewrite history++ merge Join two or more development histories together++ rebase Reapply commits on top of another base tip++ reset Set `HEAD` or the index to a known state++ switch Switch branches++ tag Create, list, delete or verify tags++++collaborate (see also: git help workflows)++ fetch Download objects and refs from another repository++ pull Fetch from and integrate with another repository or a local branch++ push Update remote refs along with associated objects++++'git help -a' and 'git help -g' list available subcommands and some++concept guides. See 'git help <command>' or 'git help <concept>'++to read about a specific subcommand or concept.++See 'git help git' for an overview of the system.++[openvibe-sdk-bootstrap] mp branch clone failed: git failed with exit code 1. See D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-mp.log++[openvibe-sdk-bootstrap] falling back to default branch clone++[openvibe-sdk-bootstrap] git++usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]++ [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]++ [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]++ [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>]++ [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>]++ <command> [<args>]++++These are common Git commands used in various situations:++++start a working area (see also: git help tutorial)++ clone Clone a repository into a new directory++ init Create an empty Git repository or reinitialize an existing one++++work on the current change (see also: git help everyday)++ add Add file contents to the index++ mv Move or rename a file, a directory, or a symlink++ restore Restore working tree files++ rm Remove files from the working tree and from the index++++examine the history and state (see also: git help revisions)++ bisect Use binary search to find the commit that introduced a bug++ diff Show changes between commits, commit and working tree, etc++ grep Print lines matching a pattern++ log Show commit logs++ show Show various types of objects++ status Show the working tree status++++grow, mark and tweak your common history++ backfill Download missing objects in a partial clone++ branch List, create, or delete branches++ commit Record changes to the repository++ history EXPERIMENTAL: Rewrite history++ merge Join two or more development histories together++ rebase Reapply commits on top of another base tip++ reset Set `HEAD` or the index to a known state++ switch Switch branches++ tag Create, list, delete or verify tags++++collaborate (see also: git help workflows)++ fetch Download objects and refs from another repository++ pull Fetch from and integrate with another repository or a local branch++ push Update remote refs along with associated objects++++'git help -a' and 'git help -g' list available subcommands and some++concept guides. See 'git help <command>' or 'git help <concept>'++to read about a specific subcommand or concept.++See 'git help git' for an overview of the system.++git failed with exit code 1. See++D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-default.log++At D:\a\OpenVibe.Games\OpenVibe.Games\tools\bootstrap-source-sdk-2013-windows.ps1:18 char:30+++ ... DE -ne 0) { throw "git $args failed with exit code $LASTEXITCODE. See ...+++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++ + CategoryInfo : OperationStopped: (git failed wit...one-default.log:String) [], RuntimeException++ + FullyQualifiedErrorId : git failed with exit code 1. See D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-b++ uild-debug\bootstrap-git-clone-default.log++nnew file mode 100644@@@ -0,0 +1,18 @@++=== dll search ===++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-artifacts\openvibe-windows-dlls\client.dll++Length : 5591976++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-artifacts\openvibe-windows-dlls\server.dll++Length : 7183272++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\client.dll++Length : 5591976++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\server.dll++Length : 7183272++LastWriteTime : 6/29/2026 4:46:06 AM++nnew file mode 100644@@@ -0,0 +1,5 @@++++Mode Length Name++---- ------ ----++d---- openvibe-js-runtime++nnew file mode 100644@@@ -0,0 +1 @@++No patched OpenVibe DLLs staged. Check build logs.nnew file mode 100644@@@ -0,0 +1,234 @@++=== project/log search ===++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-default.log++Length : 4676++LastWriteTime : 6/29/2026 4:46:15 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-mp.log++Length : 4676++LastWriteTime : 6/29/2026 4:46:15 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-source-sdk-2013.log++Length : 5963++LastWriteTime : 6/29/2026 4:46:15 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-artifacts\openvibe-windows-build-debug\build-sdk-windows.log++Length : 1032++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349142948-artifacts\openvibe-windows-build-debug\bootstrap-source-sdk-2013.log++Length : 704++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349142948-artifacts\full-run.log++Length : 0++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28348889576-failed.log++Length : 0++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28348889576-full.log++Length : 0++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-failed.log++Length : 0++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341.log++Length : 0++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628000.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628001.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628002.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628003.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628004.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628005.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628006.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628007.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628008.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628009.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628010.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628011.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628012.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628013.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628014.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628015.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628016.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628017.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628018.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628019.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628020.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628021.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628022.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628023.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628024.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628025.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628026.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628027.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628028.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628029.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628030.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628031.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628032.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628033.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628034.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628035.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628036.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628037.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628038.log++Length : 596++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628039.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628040.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628041.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628042.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628043.log++Length : 538++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628044.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628045.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628046.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628047.log++Length : 4175++LastWriteTime : 6/29/2026 4:46:06 AM++nnew file mode 100644@@@ -0,0 +1,25 @@++++Mode Length Name++---- ------ ----++d--h- .git++d---- .github++d---- .tmp++d---- artifacts++d---- backend++d---- docs++d---- engine++d---- game++d---- hammer++d---- infra++d---- launcher++d---- sdk++d---- servers++d---- tools++-a--- 983 .gitignore++-a--- 3758 DEPLOYMENT_STATUS.md++-a--- 1099 LICENSE++-a--- 12759 LINUX_SETUP.md++-a--- 4075 PROJECT_INDEX.md++-a--- 3826 QUICK_REFERENCE.md++-a--- 8794 README.md++nnew file mode 100644@@@ -0,0 +1,29 @@++=== repo ===++++ Directory: D:\a\OpenVibe.Games\OpenVibe.Games++++Mode LastWriteTime Length Name++---- ------------- ------ ----++d---- 6/29/2026 4:46 AM _deps++d--h- 6/29/2026 4:46 AM .git++d---- 6/29/2026 4:46 AM .github++d---- 6/29/2026 4:46 AM .tmp++d---- 6/29/2026 4:46 AM artifacts++d---- 6/29/2026 4:46 AM backend++d---- 6/29/2026 4:46 AM docs++d---- 6/29/2026 4:46 AM engine++d---- 6/29/2026 4:46 AM game++d---- 6/29/2026 4:46 AM hammer++d---- 6/29/2026 4:46 AM infra++d---- 6/29/2026 4:46 AM launcher++d---- 6/29/2026 4:46 AM sdk++d---- 6/29/2026 4:46 AM servers++d---- 6/29/2026 4:46 AM tools++-a--- 6/29/2026 4:46 AM 983 .gitignore++-a--- 6/29/2026 4:46 AM 3758 DEPLOYMENT_STATUS.md++-a--- 6/29/2026 4:46 AM 1099 LICENSE++-a--- 6/29/2026 4:46 AM 12759 LINUX_SETUP.md++-a--- 6/29/2026 4:46 AM 4075 PROJECT_INDEX.md++-a--- 6/29/2026 4:46 AM 3826 QUICK_REFERENCE.md++-a--- 6/29/2026 4:46 AM 8794 README.md++nnew file mode 100755@@@ -0,0 +1,247 @@++#!/usr/bin/env bash++set -euo pipefail++++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++cd "$ROOT"++++BRANCH="$(git rev-parse --abbrev-ref HEAD)"++REPO="${OPENVIBE_REPO:-$(git remote get-url origin | sed -E 's#.*github.com[:/]([^/]+/[^/.]+)(\.git)?#\1#')}"++WORKFLOW="windows-source-sdk-dlls.yml"++++echo "[openvibe] fix Windows bootstrap: use Valve master zip/download fallback"++echo "[openvibe] root=$ROOT"++echo "[openvibe] branch=$BRANCH"++echo "[openvibe] repo=$REPO"++++mkdir -p tools docs .github/workflows++++cat > tools/bootstrap-source-sdk-2013-windows.ps1 <<'PS'++$ErrorActionPreference = 'Stop'++++$Root = if ($env:OPENVIBE_ROOT) { (Resolve-Path $env:OPENVIBE_ROOT).Path } else { (Resolve-Path (Join-Path $PSScriptRoot '..')).Path }++$Sdk = if ($env:OPENVIBE_SDK) { $env:OPENVIBE_SDK } else { Join-Path $Root 'engine/source-sdk-2013' }++$Src = Join-Path $Sdk 'src'++$Deps = Join-Path $Root '_deps'++$LogDir = Join-Path $Root 'artifacts/windows-build-debug'++New-Item -ItemType Directory -Force -Path $Deps, $LogDir | Out-Null++++function Say($m) { Write-Host "[openvibe-sdk-bootstrap] $m" }++function Dump-Dir($path, $outName) {++ try {++ if (Test-Path $path) {++ Get-ChildItem -Force $path | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir $outName)++ } else {++ "[missing] $path" | Out-File (Join-Path $LogDir $outName)++ }++ } catch {++ "dump failed: $($_.Exception.Message)" | Out-File (Join-Path $LogDir $outName)++ }++}++function Assert-UsableSdk($prefix) {++ if ((Test-Path (Join-Path $Src 'game/client/hl2mp')) -and (Test-Path (Join-Path $Src 'game/server/hl2mp'))) {++ Say "$prefix SDK tree looks usable"++ return $true++ }++ return $false++}++function Copy-SdkRoot($sourceRoot) {++ Say "copying SDK root $sourceRoot -> $Sdk"++ if (Test-Path $Sdk) { Remove-Item -Recurse -Force $Sdk }++ New-Item -ItemType Directory -Force -Path $Sdk | Out-Null++ Copy-Item -Path (Join-Path $sourceRoot '*') -Destination $Sdk -Recurse -Force++ Dump-Dir $Sdk 'sdk-root-after-copy.txt'++ if (!(Assert-UsableSdk 'copied')) {++ throw "Copied SDK is missing expected HL2MP folders under $Src"++ }++}++++Say "root=$Root"++Say "sdk=$Sdk"++Say "deps=$Deps"++++if (Assert-UsableSdk 'existing') { exit 0 }++++# ValveSoftware/source-sdk-2013 currently uses the default/master layout with src/ at the repository root.++# Do not assume an mp branch or mp/src folder. Downloading the zip avoids git/extraheader/auth weirdness on Actions runners.++$zip = Join-Path $Deps 'source-sdk-2013-master.zip'++$extractParent = Join-Path $Deps 'source-sdk-2013-zip'++$zipRoot = Join-Path $extractParent 'source-sdk-2013-master'++$zipUrl = 'https://codeload.github.com/ValveSoftware/source-sdk-2013/zip/refs/heads/master'++++$zipOk = $false++try {++ Say "downloading Valve SDK master zip from $zipUrl"++ if (Test-Path $zip) { Remove-Item -Force $zip }++ if (Test-Path $extractParent) { Remove-Item -Recurse -Force $extractParent }++ New-Item -ItemType Directory -Force -Path $extractParent | Out-Null++++ if (Get-Command curl.exe -ErrorAction SilentlyContinue) {++ & curl.exe -L --retry 4 --retry-delay 3 --connect-timeout 30 -o $zip $zipUrl 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-curl-master-zip.log')++ if ($LASTEXITCODE -ne 0) { throw "curl.exe failed with exit code $LASTEXITCODE" }++ } else {++ Invoke-WebRequest -Uri $zipUrl -OutFile $zip -UseBasicParsing 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-iwr-master-zip.log')++ }++++ $zipInfo = Get-Item $zip++ Say "zip bytes=$($zipInfo.Length)"++ if ($zipInfo.Length -lt 1000000) { throw "downloaded zip is suspiciously small" }++++ Expand-Archive -Path $zip -DestinationPath $extractParent -Force++ Dump-Dir $extractParent 'zip-extract-parent.txt'++ Dump-Dir $zipRoot 'zip-root.txt'++++ if (Test-Path (Join-Path $zipRoot 'src/game/client/hl2mp')) {++ Copy-SdkRoot $zipRoot++ $zipOk = $true++ } else {++ throw "zip did not contain expected src/game/client/hl2mp at $zipRoot"++ }++} catch {++ Say "zip bootstrap failed: $($_.Exception.Message)"++ $_ | Out-String | Out-File (Join-Path $LogDir 'bootstrap-zip-exception.txt')++}++++if ($zipOk) { Say 'SDK bootstrapped successfully from zip'; exit 0 }++++# Last-resort git fallback. Clear possible GitHub Actions extraheaders and force public HTTPS.++$gitRepo = Join-Path $Deps 'source-sdk-2013-git'++try {++ Say "trying git clone fallback"++ git config --global --unset-all http.https://github.com/.extraheader 2>$null++ git config --global --unset-all http.https://github.com/ValveSoftware/source-sdk-2013.extraheader 2>$null++ if (Test-Path $gitRepo) { Remove-Item -Recurse -Force $gitRepo }++ & git -c http.https://github.com/.extraheader= clone --depth 1 --single-branch https://github.com/ValveSoftware/source-sdk-2013.git $gitRepo 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-clone-master.log')++ if ($LASTEXITCODE -ne 0) { throw "git clone failed with exit code $LASTEXITCODE" }++ Dump-Dir $gitRepo 'git-root.txt'++ if (Test-Path (Join-Path $gitRepo 'src/game/client/hl2mp')) {++ Copy-SdkRoot $gitRepo++ Say 'SDK bootstrapped successfully from git'++ exit 0++ }++ throw "git clone did not contain src/game/client/hl2mp"++} catch {++ Say "git bootstrap failed: $($_.Exception.Message)"++ $_ | Out-String | Out-File (Join-Path $LogDir 'bootstrap-git-exception.txt')++}++++Dump-Dir $Deps 'deps-after-bootstrap-failure.txt'++throw "Could not bootstrap ValveSoftware/source-sdk-2013. Check openvibe-windows-build-debug artifact, especially bootstrap-curl-master-zip.log, bootstrap-zip-exception.txt, and bootstrap-git-clone-master.log."++PS++++cat > docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md <<'MD'++# Windows Source SDK bootstrap++++The Windows GitHub Actions runner is fresh and does not have Alex's local `engine/source-sdk-2013` checkout.++++The workflow bootstraps Valve's public Source SDK 2013 repository into:++++```text++engine/source-sdk-2013++```++++The expected SDK layout is:++++```text++engine/source-sdk-2013/src/game/client/hl2mp++engine/source-sdk-2013/src/game/server/hl2mp++```++++The bootstrap intentionally downloads the default/master zip first:++++```text++https://codeload.github.com/ValveSoftware/source-sdk-2013/zip/refs/heads/master++```++++This avoids brittle branch assumptions and avoids GitHub Actions `git` auth/header issues. A git clone fallback is still present for debugging.++MD++++# Make sure the workflow has the bootstrap step before build, without rewriting the whole file if it already does.++python3 - <<'PY'++from pathlib import Path++p = Path('.github/workflows/windows-source-sdk-dlls.yml')++s = p.read_text()++if 'Bootstrap Source SDK 2013 MP' not in s and 'Bootstrap Source SDK 2013' not in s:++ marker = ' - name: Build Windows Source SDK DLLs\n'++ insert = ''' - name: Bootstrap Source SDK 2013\n run: |\n $ErrorActionPreference = 'Stop'\n powershell -NoProfile -ExecutionPolicy Bypass -File tools/bootstrap-source-sdk-2013-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/bootstrap-source-sdk-2013.log\n\n'''++ if marker not in s:++ raise SystemExit('could not find Build Windows Source SDK DLLs step marker')++ s = s.replace(marker, insert + marker, 1)++# Normalize the old step label if present.++s = s.replace('Bootstrap Source SDK 2013 MP', 'Bootstrap Source SDK 2013')++p.write_text(s)++PY++++# Improve debug helper to print the new bootstrap files if the run fails.++python3 - <<'PY'++from pathlib import Path++p = Path('tools/windows-workflow-debug-and-install.sh')++if not p.exists():++ raise SystemExit(0)++s = p.read_text()++needle = 'grep -RInE "(error|failed|fatal|C[0-9]{4}|LNK[0-9]{4}|MSB[0-9]{4}|No patched OpenVibe DLLs)" "$OUT" 2>/dev/null | head -n 80 || true'++replacement = '''grep -RInE "(error|failed|fatal|C[0-9]{4}|LNK[0-9]{4}|MSB[0-9]{4}|No patched OpenVibe DLLs|Could not bootstrap|suspiciously small)" "$OUT" 2>/dev/null | head -n 120 || true++++for f in \++ "$OUT"/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log \++ "$OUT"/openvibe-windows-build-debug/bootstrap-curl-master-zip.log \++ "$OUT"/openvibe-windows-build-debug/bootstrap-zip-exception.txt \++ "$OUT"/openvibe-windows-build-debug/bootstrap-git-clone-master.log \++ "$OUT"/openvibe-windows-build-debug/bootstrap-git-exception.txt \++ "$OUT"/openvibe-windows-build-debug/build-sdk-windows.log; do++ if [[ -f "$f" ]]; then++ echo++ echo "[openvibe] tail: ${f#$ROOT/}"++ tail -n 80 "$f" || true++ fi++done'''++if needle in s:++ s = s.replace(needle, replacement)++elif 'bootstrap-curl-master-zip.log' not in s:++ s += '\n\n# Extra bootstrap tails for current Windows workflow debugging.\n'++p.write_text(s)++PY++++echo "[openvibe] git diff summary"++git diff --stat++++if ! git diff --quiet; then++ git add tools/bootstrap-source-sdk-2013-windows.ps1 docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md .github/workflows/windows-source-sdk-dlls.yml tools/windows-workflow-debug-and-install.sh++ git commit -m "Fix Windows SDK bootstrap download path"++ git push origin "$BRANCH"++else++ echo "[openvibe] no changes to commit"++fi++++if ! command -v gh >/dev/null 2>&1; then++ echo "[openvibe] gh missing; install/authenticate GitHub CLI, then run tools/windows-workflow-debug-and-install.sh after triggering workflow."++ exit 0++fi++++echo "[openvibe] triggering workflow"++gh workflow run "$WORKFLOW" --repo "$REPO" --ref "$BRANCH" || true++sleep 8++RUN_ID="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId')"++echo "[openvibe] watching run $RUN_ID"++if gh run watch "$RUN_ID" --repo "$REPO" --exit-status; then++ echo "[openvibe] workflow passed"++else++ echo "[openvibe warn] workflow failed; downloading diagnostics"++fi++++tools/windows-workflow-debug-and-install.sh || true++++echo++if [[ -x tools/verify-openvibe-dll-content.sh ]]; then++ tools/verify-openvibe-dll-content.sh || true++fi++++echo++cat <<'EOF'++[openvibe] next if patched DLLs are installed:++ OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015++++In game console:++ ov_join hub++ ov_menu++ ov_menu_servers++EOFnnew file mode 100755@@@ -0,0 +1,205 @@++#!/usr/bin/env bash++set -euo pipefail++++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++cd "$ROOT"++++BRANCH="$(git rev-parse --abbrev-ref HEAD)"++REPO="${OPENVIBE_GITHUB_REPO:-$(gh repo view --json nameWithOwner -q .nameWithOwner 2>/dev/null || true)}"++REPO="${REPO:-OpenVibers/OpenVibe.Games}"++WORKFLOW="windows-source-sdk-dlls.yml"++++say(){ printf '[openvibe] %s\n' "$*"; }++++say "fix Windows bootstrap to clone the real Source SDK 2013 MP branch"++say "root=$ROOT"++say "branch=$BRANCH"++say "repo=$REPO"++++if ! command -v gh >/dev/null 2>&1; then++ echo "Missing gh. Run: sudo apt install gh && gh auth login" >&2++ exit 1++fi++++if ! gh auth status >/dev/null 2>&1; then++ echo "gh is not authenticated. Run: gh auth login" >&2++ exit 1++fi++++mkdir -p tools docs .github/workflows++++cat > tools/bootstrap-source-sdk-2013-windows.ps1 <<'PS1'++$ErrorActionPreference = 'Stop'++++$Root = if ($env:OPENVIBE_ROOT) { (Resolve-Path $env:OPENVIBE_ROOT).Path } else { (Resolve-Path (Join-Path $PSScriptRoot '..')).Path }++$Sdk = if ($env:OPENVIBE_SDK) { $env:OPENVIBE_SDK } else { Join-Path $Root 'engine/source-sdk-2013' }++$Src = Join-Path $Sdk 'src'++$Deps = Join-Path $Root '_deps'++$LogDir = Join-Path $Root 'artifacts/windows-build-debug'++New-Item -ItemType Directory -Force -Path $LogDir | Out-Null++++function Say($m) { Write-Host "[openvibe-sdk-bootstrap] $m" }++function Has-HL2MP($base) {++ return ((Test-Path (Join-Path $base 'src/game/client/hl2mp')) -and (Test-Path (Join-Path $base 'src/game/server/hl2mp')))++}++function Run-Git($args, $logName) {++ $log = Join-Path $LogDir $logName++ Say "git $args"++ & git @args 2>&1 | Tee-Object -FilePath $log++ if ($LASTEXITCODE -ne 0) { throw "git $args failed with exit code $LASTEXITCODE. See $log" }++}++++Say "root=$Root"++Say "sdk=$Sdk"++Say "logdir=$LogDir"++++if (Has-HL2MP $Sdk) {++ Say "existing SDK tree already contains HL2MP client/server"++ exit 0++}++++New-Item -ItemType Directory -Force -Path $Deps | Out-Null++++# Valve's source-sdk-2013 repository is normally organized by branches: mp and sp.++# Some forks/mirrors use root folders like mp/src. Support both layouts.++$RepoUrl = if ($env:OPENVIBE_SOURCE_SDK_REPO) { $env:OPENVIBE_SOURCE_SDK_REPO } else { 'https://github.com/ValveSoftware/source-sdk-2013.git' }++$ValveRepo = Join-Path $Deps 'source-sdk-2013-mp'++++if (Test-Path $ValveRepo) { Remove-Item -Recurse -Force $ValveRepo }++++$cloned = $false++try {++ Say "cloning Valve Source SDK 2013 branch mp"++ Run-Git @('clone','--depth','1','--branch','mp',$RepoUrl,$ValveRepo) 'bootstrap-git-clone-mp.log'++ $cloned = $true++} catch {++ Say "mp branch clone failed: $($_.Exception.Message)"++ if (Test-Path $ValveRepo) { Remove-Item -Recurse -Force $ValveRepo }++ Say "falling back to default branch clone"++ Run-Git @('clone','--depth','1',$RepoUrl,$ValveRepo) 'bootstrap-git-clone-default.log'++ $cloned = $true++}++++if (-not $cloned) { throw "could not clone Source SDK repo" }++++"=== Valve repo root ===" | Out-File (Join-Path $LogDir 'valve-repo-root.txt')++Get-ChildItem -Force $ValveRepo | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'valve-repo-root.txt') -Append++"=== candidate src folders ===" | Out-File (Join-Path $LogDir 'valve-candidate-src.txt')++Get-ChildItem -Path $ValveRepo -Recurse -Directory -Filter src -ErrorAction SilentlyContinue |++ Select-Object FullName | Format-List | Out-File (Join-Path $LogDir 'valve-candidate-src.txt') -Append++++$candidates = @(++ $ValveRepo,++ (Join-Path $ValveRepo 'mp'),++ (Join-Path $ValveRepo 'srcsdk/mp'),++ (Join-Path $ValveRepo 'source-sdk-2013/mp')++)++++$SourceRoot = $null++foreach ($candidate in $candidates) {++ if (Has-HL2MP $candidate) {++ $SourceRoot = $candidate++ break++ }++}++++if (-not $SourceRoot) {++ $matches = Get-ChildItem -Path $ValveRepo -Recurse -Directory -Filter hl2mp -ErrorAction SilentlyContinue |++ Where-Object { $_.FullName -match '[\\/]src[\\/]game[\\/](client|server)[\\/]hl2mp$' }++ $matches | Select-Object FullName | Format-List | Out-File (Join-Path $LogDir 'hl2mp-folder-search.txt')++ throw "Could not find Source SDK 2013 MP HL2MP layout after clone. Check valve-repo-root.txt, valve-candidate-src.txt, and hl2mp-folder-search.txt."++}++++Say "source root=$SourceRoot"++Say "copying Source SDK MP layout into $Sdk"++if (Test-Path $Sdk) { Remove-Item -Recurse -Force $Sdk }++New-Item -ItemType Directory -Force -Path $Sdk | Out-Null++Copy-Item -Path (Join-Path $SourceRoot '*') -Destination $Sdk -Recurse -Force++++if (!(Has-HL2MP $Sdk)) {++ Get-ChildItem -Force $Sdk | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'sdk-root-after-copy.txt')++ throw "Bootstrapped SDK is missing expected HL2MP folders after copy"++}++++"=== SDK root after copy ===" | Out-File (Join-Path $LogDir 'sdk-root-after-copy.txt')++Get-ChildItem -Force $Sdk | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'sdk-root-after-copy.txt') -Append++"=== SDK src root after copy ===" | Out-File (Join-Path $LogDir 'sdk-src-root-after-copy.txt')++Get-ChildItem -Force (Join-Path $Sdk 'src') | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'sdk-src-root-after-copy.txt') -Append++++Say "SDK bootstrapped successfully"++PS1++++cat > docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md <<'MD'++# Windows Source SDK bootstrap++++The GitHub Actions Windows runner does not have Alex's local `engine/source-sdk-2013` checkout. The workflow bootstraps it by cloning ValveSoftware/source-sdk-2013.++++Important detail: the Source SDK 2013 multiplayer code is normally on the `mp` branch, not necessarily in a `mp/` directory on the default branch. The bootstrap script now supports both layouts:++++- `source-sdk-2013` checked out directly on the `mp` branch, with `src/...` at repo root++- older/mirrored layout with `mp/src/...`++++The workflow should not upload or install stock/stale DLLs. A DLL artifact is considered useful only when `client.dll` contains OpenVibe command strings such as `ov_join`, `ov_menu`, or `OpenVibe`.++MD++++# Make workflow rerun on bootstrap changes and make bootstrap log more obvious.++python3 - <<'PY'++from pathlib import Path++p = Path('.github/workflows/windows-source-sdk-dlls.yml')++s = p.read_text()++if 'tools/bootstrap-source-sdk-2013-windows.ps1' not in s:++ s = s.replace(' - "tools/build-sdk-windows.ps1"\n', ' - "tools/build-sdk-windows.ps1"\n - "tools/bootstrap-source-sdk-2013-windows.ps1"\n')++# Ensure bootstrap step captures a specific log and prints it on failure before exiting.++old = ''' - name: Bootstrap Source SDK 2013 MP\n run: |\n powershell -NoProfile -ExecutionPolicy Bypass -File tools/bootstrap-source-sdk-2013-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/bootstrap-source-sdk-2013.log\n'''++new = ''' - name: Bootstrap Source SDK 2013 MP\n run: |\n $ErrorActionPreference = 'Continue'\n New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null\n powershell -NoProfile -ExecutionPolicy Bypass -File tools/bootstrap-source-sdk-2013-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/bootstrap-source-sdk-2013.log\n $code = $LASTEXITCODE\n if ($code -ne 0) {\n Write-Host \"[openvibe] bootstrap failed; tail follows\"\n Get-Content artifacts/windows-build-debug/bootstrap-source-sdk-2013.log -Tail 120\n exit $code\n }\n'''++if old in s:++ s = s.replace(old, new)++p.write_text(s)++PY++++# Improve debug downloader so it actually prints the useful logs next time.++if [[ -f tools/windows-workflow-debug-and-install.sh ]]; then++python3 - <<'PY'++from pathlib import Path++p = Path('tools/windows-workflow-debug-and-install.sh')++s = p.read_text()++needle = 'say "artifact files:"\nfind "$OUT" -type f | sort || true\n'++insert = '''say "artifact files:"\nfind "$OUT" -type f | sort || true\n\nfor f in \\\n "$OUT"/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log \\\n "$OUT"/openvibe-windows-build-debug/build-sdk-windows.log \\\n "$OUT"/openvibe-windows-build-debug/bootstrap-git-clone-mp.log \\\n "$OUT"/openvibe-windows-build-debug/valve-repo-root.txt \\\n "$OUT"/openvibe-windows-build-debug/valve-candidate-src.txt \\\n "$OUT"/openvibe-windows-build-debug/hl2mp-folder-search.txt; do\n if [[ -f "$f" ]]; then\n echo\n say "tail: ${f#$OUT/}"\n tail -n 120 "$f" || true\n fi\ndone\n'''++if needle in s and 'bootstrap-git-clone-mp.log' not in s:++ s = s.replace(needle, insert)++p.write_text(s)++PY++fi++++say "git diff summary"++git diff --stat++++git add .github/workflows/windows-source-sdk-dlls.yml tools/bootstrap-source-sdk-2013-windows.ps1 docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md tools/windows-workflow-debug-and-install.sh++++if git diff --cached --quiet; then++ say "nothing to commit"++else++ git commit -m "Fix Windows Source SDK MP branch bootstrap"++ git push origin "$BRANCH"++fi++++say "triggering workflow"++gh workflow run "$WORKFLOW" --ref "$BRANCH"++sleep 6++RUN_ID="$(gh run list --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId -q '.[0].databaseId')"++say "watching run $RUN_ID"++set +e++gh run watch "$RUN_ID" --exit-status++STATUS=$?++set -e++++say "downloading diagnostics/artifacts"++tools/windows-workflow-debug-and-install.sh || true++++if [[ $STATUS -eq 0 ]]; then++ say "workflow succeeded"++else++ say "workflow failed again; paste the tail printed above if it does not clearly show the next compile error"++fi++++exit $STATUS
new file mode 100644
new file mode 100644
@@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/file-list.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/full-run.log
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-default.log
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-mp.log
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/dll-search.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/engine-before-build.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/no-patched-dlls.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/project-search.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/repo-root-before-build.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/tree.txt
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-default.log differ
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-default.log differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-mp.log differ
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349239859-artifacts/openvibe-windows-build-debug/bootstrap-git-clone-mp.log differ
new file mode 100644
new file mode 100644
@@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
+[openvibe-sdk-bootstrap] root=D:\a\OpenVibe.Games\OpenVibe.Games
+[openvibe-sdk-bootstrap] sdk=D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013
+[openvibe-sdk-bootstrap] logdir=D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug
+[openvibe-sdk-bootstrap] cloning Valve Source SDK 2013 branch mp
+[openvibe-sdk-bootstrap] git
+usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
+ [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
+ [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]
+ [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>]
+ [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>]
+ <command> [<args>]
+
+These are common Git commands used in various situations:
+
+start a working area (see also: git help tutorial)
+ clone Clone a repository into a new directory
+ init Create an empty Git repository or reinitialize an existing one
+
+work on the current change (see also: git help everyday)
+ add Add file contents to the index
+ mv Move or rename a file, a directory, or a symlink
+ restore Restore working tree files
+ rm Remove files from the working tree and from the index
+
+examine the history and state (see also: git help revisions)
+ bisect Use binary search to find the commit that introduced a bug
+ diff Show changes between commits, commit and working tree, etc
+ grep Print lines matching a pattern
+ log Show commit logs
+ show Show various types of objects
+ status Show the working tree status
+
+grow, mark and tweak your common history
+ backfill Download missing objects in a partial clone
+ branch List, create, or delete branches
+ commit Record changes to the repository
+ history EXPERIMENTAL: Rewrite history
+ merge Join two or more development histories together
+ rebase Reapply commits on top of another base tip
+ reset Set `HEAD` or the index to a known state
+ switch Switch branches
+ tag Create, list, delete or verify tags
+
+collaborate (see also: git help workflows)
+ fetch Download objects and refs from another repository
+ pull Fetch from and integrate with another repository or a local branch
+ push Update remote refs along with associated objects
+
+'git help -a' and 'git help -g' list available subcommands and some
+concept guides. See 'git help <command>' or 'git help <concept>'
+to read about a specific subcommand or concept.
+See 'git help git' for an overview of the system.
+[openvibe-sdk-bootstrap] mp branch clone failed: git failed with exit code 1. See D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-mp.log
+[openvibe-sdk-bootstrap] falling back to default branch clone
+[openvibe-sdk-bootstrap] git
+usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
+ [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
+ [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]
+ [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>]
+ [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>]
+ <command> [<args>]
+
+These are common Git commands used in various situations:
+
+start a working area (see also: git help tutorial)
+ clone Clone a repository into a new directory
+ init Create an empty Git repository or reinitialize an existing one
+
+work on the current change (see also: git help everyday)
+ add Add file contents to the index
+ mv Move or rename a file, a directory, or a symlink
+ restore Restore working tree files
+ rm Remove files from the working tree and from the index
+
+examine the history and state (see also: git help revisions)
+ bisect Use binary search to find the commit that introduced a bug
+ diff Show changes between commits, commit and working tree, etc
+ grep Print lines matching a pattern
+ log Show commit logs
+ show Show various types of objects
+ status Show the working tree status
+
+grow, mark and tweak your common history
+ backfill Download missing objects in a partial clone
+ branch List, create, or delete branches
+ commit Record changes to the repository
+ history EXPERIMENTAL: Rewrite history
+ merge Join two or more development histories together
+ rebase Reapply commits on top of another base tip
+ reset Set `HEAD` or the index to a known state
+ switch Switch branches
+ tag Create, list, delete or verify tags
+
+collaborate (see also: git help workflows)
+ fetch Download objects and refs from another repository
+ pull Fetch from and integrate with another repository or a local branch
+ push Update remote refs along with associated objects
+
+'git help -a' and 'git help -g' list available subcommands and some
+concept guides. See 'git help <command>' or 'git help <concept>'
+to read about a specific subcommand or concept.
+See 'git help git' for an overview of the system.
+git failed with exit code 1. See
+D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-default.log
+At D:\a\OpenVibe.Games\OpenVibe.Games\tools\bootstrap-source-sdk-2013-windows.ps1:18 char:30
++ ... DE -ne 0) { throw "git $args failed with exit code $LASTEXITCODE. See ...
++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ + CategoryInfo : OperationStopped: (git failed wit...one-default.log:String) [], RuntimeException
+ + FullyQualifiedErrorId : git failed with exit code 1. See D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-b
+ uild-debug\bootstrap-git-clone-default.log
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
+=== dll search ===
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-artifacts\openvibe-windows-dlls\client.dll
+Length : 5591976
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-artifacts\openvibe-windows-dlls\server.dll
+Length : 7183272
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\client.dll
+Length : 5591976
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\server.dll
+Length : 7183272
+LastWriteTime : 6/29/2026 4:46:06 AM
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+
+Mode Length Name
+---- ------ ----
+d---- openvibe-js-runtime
+
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+No patched OpenVibe DLLs staged. Check build logs.
new file mode 100644
new file mode 100644
@@ -0,0 +1,234 @@
@@ -0,0 +1,234 @@
+=== project/log search ===
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-default.log
+Length : 4676
+LastWriteTime : 6/29/2026 4:46:15 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-git-clone-mp.log
+Length : 4676
+LastWriteTime : 6/29/2026 4:46:15 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-source-sdk-2013.log
+Length : 5963
+LastWriteTime : 6/29/2026 4:46:15 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-artifacts\openvibe-windows-build-debug\build-sdk-windows.log
+Length : 1032
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349142948-artifacts\openvibe-windows-build-debug\bootstrap-source-sdk-2013.log
+Length : 704
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349142948-artifacts\full-run.log
+Length : 0
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28348889576-failed.log
+Length : 0
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28348889576-full.log
+Length : 0
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341-failed.log
+Length : 0
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-workflow-debug\run-28349028341.log
+Length : 0
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628000.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628001.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628002.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628003.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628004.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628005.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628006.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628007.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628008.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628009.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628010.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628011.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628012.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628013.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628014.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628015.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628016.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628017.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628018.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628019.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628020.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628021.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628022.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628023.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628024.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628025.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628026.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628027.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628028.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628029.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628030.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628031.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628032.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628033.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628034.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628035.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628036.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628037.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628038.log
+Length : 596
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628039.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628040.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628041.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628042.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628043.log
+Length : 538
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628044.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628045.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628046.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628047.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:46:06 AM
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
+
+Mode Length Name
+---- ------ ----
+d--h- .git
+d---- .github
+d---- .tmp
+d---- artifacts
+d---- backend
+d---- docs
+d---- engine
+d---- game
+d---- hammer
+d---- infra
+d---- launcher
+d---- sdk
+d---- servers
+d---- tools
+-a--- 983 .gitignore
+-a--- 3758 DEPLOYMENT_STATUS.md
+-a--- 1099 LICENSE
+-a--- 12759 LINUX_SETUP.md
+-a--- 4075 PROJECT_INDEX.md
+-a--- 3826 QUICK_REFERENCE.md
+-a--- 8794 README.md
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
+=== repo ===
+
+ Directory: D:\a\OpenVibe.Games\OpenVibe.Games
+
+Mode LastWriteTime Length Name
+---- ------------- ------ ----
+d---- 6/29/2026 4:46 AM _deps
+d--h- 6/29/2026 4:46 AM .git
+d---- 6/29/2026 4:46 AM .github
+d---- 6/29/2026 4:46 AM .tmp
+d---- 6/29/2026 4:46 AM artifacts
+d---- 6/29/2026 4:46 AM backend
+d---- 6/29/2026 4:46 AM docs
+d---- 6/29/2026 4:46 AM engine
+d---- 6/29/2026 4:46 AM game
+d---- 6/29/2026 4:46 AM hammer
+d---- 6/29/2026 4:46 AM infra
+d---- 6/29/2026 4:46 AM launcher
+d---- 6/29/2026 4:46 AM sdk
+d---- 6/29/2026 4:46 AM servers
+d---- 6/29/2026 4:46 AM tools
+-a--- 6/29/2026 4:46 AM 983 .gitignore
+-a--- 6/29/2026 4:46 AM 3758 DEPLOYMENT_STATUS.md
+-a--- 6/29/2026 4:46 AM 1099 LICENSE
+-a--- 6/29/2026 4:46 AM 12759 LINUX_SETUP.md
+-a--- 6/29/2026 4:46 AM 4075 PROJECT_INDEX.md
+-a--- 6/29/2026 4:46 AM 3826 QUICK_REFERENCE.md
+-a--- 6/29/2026 4:46 AM 8794 README.md
+
new file mode 100755
new file mode 100755
@@ -0,0 +1,247 @@
@@ -0,0 +1,247 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+cd "$ROOT"
+
+BRANCH="$(git rev-parse --abbrev-ref HEAD)"
+REPO="${OPENVIBE_REPO:-$(git remote get-url origin | sed -E 's#.*github.com[:/]([^/]+/[^/.]+)(\.git)?#\1#')}"
+WORKFLOW="windows-source-sdk-dlls.yml"
+
+echo "[openvibe] fix Windows bootstrap: use Valve master zip/download fallback"
+echo "[openvibe] root=$ROOT"
+echo "[openvibe] branch=$BRANCH"
+echo "[openvibe] repo=$REPO"
+
+mkdir -p tools docs .github/workflows
+
+cat > tools/bootstrap-source-sdk-2013-windows.ps1 <<'PS'
+$ErrorActionPreference = 'Stop'
+
+$Root = if ($env:OPENVIBE_ROOT) { (Resolve-Path $env:OPENVIBE_ROOT).Path } else { (Resolve-Path (Join-Path $PSScriptRoot '..')).Path }
+$Sdk = if ($env:OPENVIBE_SDK) { $env:OPENVIBE_SDK } else { Join-Path $Root 'engine/source-sdk-2013' }
+$Src = Join-Path $Sdk 'src'
+$Deps = Join-Path $Root '_deps'
+$LogDir = Join-Path $Root 'artifacts/windows-build-debug'
+New-Item -ItemType Directory -Force -Path $Deps, $LogDir | Out-Null
+
+function Say($m) { Write-Host "[openvibe-sdk-bootstrap] $m" }
+function Dump-Dir($path, $outName) {
+ try {
+ if (Test-Path $path) {
+ Get-ChildItem -Force $path | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir $outName)
+ } else {
+ "[missing] $path" | Out-File (Join-Path $LogDir $outName)
+ }
+ } catch {
+ "dump failed: $($_.Exception.Message)" | Out-File (Join-Path $LogDir $outName)
+ }
+}
+function Assert-UsableSdk($prefix) {
+ if ((Test-Path (Join-Path $Src 'game/client/hl2mp')) -and (Test-Path (Join-Path $Src 'game/server/hl2mp'))) {
+ Say "$prefix SDK tree looks usable"
+ return $true
+ }
+ return $false
+}
+function Copy-SdkRoot($sourceRoot) {
+ Say "copying SDK root $sourceRoot -> $Sdk"
+ if (Test-Path $Sdk) { Remove-Item -Recurse -Force $Sdk }
+ New-Item -ItemType Directory -Force -Path $Sdk | Out-Null
+ Copy-Item -Path (Join-Path $sourceRoot '*') -Destination $Sdk -Recurse -Force
+ Dump-Dir $Sdk 'sdk-root-after-copy.txt'
+ if (!(Assert-UsableSdk 'copied')) {
+ throw "Copied SDK is missing expected HL2MP folders under $Src"
+ }
+}
+
+Say "root=$Root"
+Say "sdk=$Sdk"
+Say "deps=$Deps"
+
+if (Assert-UsableSdk 'existing') { exit 0 }
+
+# ValveSoftware/source-sdk-2013 currently uses the default/master layout with src/ at the repository root.
+# Do not assume an mp branch or mp/src folder. Downloading the zip avoids git/extraheader/auth weirdness on Actions runners.
+$zip = Join-Path $Deps 'source-sdk-2013-master.zip'
+$extractParent = Join-Path $Deps 'source-sdk-2013-zip'
+$zipRoot = Join-Path $extractParent 'source-sdk-2013-master'
+$zipUrl = 'https://codeload.github.com/ValveSoftware/source-sdk-2013/zip/refs/heads/master'
+
+$zipOk = $false
+try {
+ Say "downloading Valve SDK master zip from $zipUrl"
+ if (Test-Path $zip) { Remove-Item -Force $zip }
+ if (Test-Path $extractParent) { Remove-Item -Recurse -Force $extractParent }
+ New-Item -ItemType Directory -Force -Path $extractParent | Out-Null
+
+ if (Get-Command curl.exe -ErrorAction SilentlyContinue) {
+ & curl.exe -L --retry 4 --retry-delay 3 --connect-timeout 30 -o $zip $zipUrl 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-curl-master-zip.log')
+ if ($LASTEXITCODE -ne 0) { throw "curl.exe failed with exit code $LASTEXITCODE" }
+ } else {
+ Invoke-WebRequest -Uri $zipUrl -OutFile $zip -UseBasicParsing 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-iwr-master-zip.log')
+ }
+
+ $zipInfo = Get-Item $zip
+ Say "zip bytes=$($zipInfo.Length)"
+ if ($zipInfo.Length -lt 1000000) { throw "downloaded zip is suspiciously small" }
+
+ Expand-Archive -Path $zip -DestinationPath $extractParent -Force
+ Dump-Dir $extractParent 'zip-extract-parent.txt'
+ Dump-Dir $zipRoot 'zip-root.txt'
+
+ if (Test-Path (Join-Path $zipRoot 'src/game/client/hl2mp')) {
+ Copy-SdkRoot $zipRoot
+ $zipOk = $true
+ } else {
+ throw "zip did not contain expected src/game/client/hl2mp at $zipRoot"
+ }
+} catch {
+ Say "zip bootstrap failed: $($_.Exception.Message)"
+ $_ | Out-String | Out-File (Join-Path $LogDir 'bootstrap-zip-exception.txt')
+}
+
+if ($zipOk) { Say 'SDK bootstrapped successfully from zip'; exit 0 }
+
+# Last-resort git fallback. Clear possible GitHub Actions extraheaders and force public HTTPS.
+$gitRepo = Join-Path $Deps 'source-sdk-2013-git'
+try {
+ Say "trying git clone fallback"
+ git config --global --unset-all http.https://github.com/.extraheader 2>$null
+ git config --global --unset-all http.https://github.com/ValveSoftware/source-sdk-2013.extraheader 2>$null
+ if (Test-Path $gitRepo) { Remove-Item -Recurse -Force $gitRepo }
+ & git -c http.https://github.com/.extraheader= clone --depth 1 --single-branch https://github.com/ValveSoftware/source-sdk-2013.git $gitRepo 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-clone-master.log')
+ if ($LASTEXITCODE -ne 0) { throw "git clone failed with exit code $LASTEXITCODE" }
+ Dump-Dir $gitRepo 'git-root.txt'
+ if (Test-Path (Join-Path $gitRepo 'src/game/client/hl2mp')) {
+ Copy-SdkRoot $gitRepo
+ Say 'SDK bootstrapped successfully from git'
+ exit 0
+ }
+ throw "git clone did not contain src/game/client/hl2mp"
+} catch {
+ Say "git bootstrap failed: $($_.Exception.Message)"
+ $_ | Out-String | Out-File (Join-Path $LogDir 'bootstrap-git-exception.txt')
+}
+
+Dump-Dir $Deps 'deps-after-bootstrap-failure.txt'
+throw "Could not bootstrap ValveSoftware/source-sdk-2013. Check openvibe-windows-build-debug artifact, especially bootstrap-curl-master-zip.log, bootstrap-zip-exception.txt, and bootstrap-git-clone-master.log."
+PS
+
+cat > docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md <<'MD'
+# Windows Source SDK bootstrap
+
+The Windows GitHub Actions runner is fresh and does not have Alex's local `engine/source-sdk-2013` checkout.
+
+The workflow bootstraps Valve's public Source SDK 2013 repository into:
+
+```text
+engine/source-sdk-2013
+```
+
+The expected SDK layout is:
+
+```text
+engine/source-sdk-2013/src/game/client/hl2mp
+engine/source-sdk-2013/src/game/server/hl2mp
+```
+
+The bootstrap intentionally downloads the default/master zip first:
+
+```text
+https://codeload.github.com/ValveSoftware/source-sdk-2013/zip/refs/heads/master
+```
+
+This avoids brittle branch assumptions and avoids GitHub Actions `git` auth/header issues. A git clone fallback is still present for debugging.
+MD
+
+# Make sure the workflow has the bootstrap step before build, without rewriting the whole file if it already does.
+python3 - <<'PY'
+from pathlib import Path
+p = Path('.github/workflows/windows-source-sdk-dlls.yml')
+s = p.read_text()
+if 'Bootstrap Source SDK 2013 MP' not in s and 'Bootstrap Source SDK 2013' not in s:
+ marker = ' - name: Build Windows Source SDK DLLs\n'
+ insert = ''' - name: Bootstrap Source SDK 2013\n run: |\n $ErrorActionPreference = 'Stop'\n powershell -NoProfile -ExecutionPolicy Bypass -File tools/bootstrap-source-sdk-2013-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/bootstrap-source-sdk-2013.log\n\n'''
+ if marker not in s:
+ raise SystemExit('could not find Build Windows Source SDK DLLs step marker')
+ s = s.replace(marker, insert + marker, 1)
+# Normalize the old step label if present.
+s = s.replace('Bootstrap Source SDK 2013 MP', 'Bootstrap Source SDK 2013')
+p.write_text(s)
+PY
+
+# Improve debug helper to print the new bootstrap files if the run fails.
+python3 - <<'PY'
+from pathlib import Path
+p = Path('tools/windows-workflow-debug-and-install.sh')
+if not p.exists():
+ raise SystemExit(0)
+s = p.read_text()
+needle = 'grep -RInE "(error|failed|fatal|C[0-9]{4}|LNK[0-9]{4}|MSB[0-9]{4}|No patched OpenVibe DLLs)" "$OUT" 2>/dev/null | head -n 80 || true'
+replacement = '''grep -RInE "(error|failed|fatal|C[0-9]{4}|LNK[0-9]{4}|MSB[0-9]{4}|No patched OpenVibe DLLs|Could not bootstrap|suspiciously small)" "$OUT" 2>/dev/null | head -n 120 || true
+
+for f in \
+ "$OUT"/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log \
+ "$OUT"/openvibe-windows-build-debug/bootstrap-curl-master-zip.log \
+ "$OUT"/openvibe-windows-build-debug/bootstrap-zip-exception.txt \
+ "$OUT"/openvibe-windows-build-debug/bootstrap-git-clone-master.log \
+ "$OUT"/openvibe-windows-build-debug/bootstrap-git-exception.txt \
+ "$OUT"/openvibe-windows-build-debug/build-sdk-windows.log; do
+ if [[ -f "$f" ]]; then
+ echo
+ echo "[openvibe] tail: ${f#$ROOT/}"
+ tail -n 80 "$f" || true
+ fi
+done'''
+if needle in s:
+ s = s.replace(needle, replacement)
+elif 'bootstrap-curl-master-zip.log' not in s:
+ s += '\n\n# Extra bootstrap tails for current Windows workflow debugging.\n'
+p.write_text(s)
+PY
+
+echo "[openvibe] git diff summary"
+git diff --stat
+
+if ! git diff --quiet; then
+ git add tools/bootstrap-source-sdk-2013-windows.ps1 docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md .github/workflows/windows-source-sdk-dlls.yml tools/windows-workflow-debug-and-install.sh
+ git commit -m "Fix Windows SDK bootstrap download path"
+ git push origin "$BRANCH"
+else
+ echo "[openvibe] no changes to commit"
+fi
+
+if ! command -v gh >/dev/null 2>&1; then
+ echo "[openvibe] gh missing; install/authenticate GitHub CLI, then run tools/windows-workflow-debug-and-install.sh after triggering workflow."
+ exit 0
+fi
+
+echo "[openvibe] triggering workflow"
+gh workflow run "$WORKFLOW" --repo "$REPO" --ref "$BRANCH" || true
+sleep 8
+RUN_ID="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId')"
+echo "[openvibe] watching run $RUN_ID"
+if gh run watch "$RUN_ID" --repo "$REPO" --exit-status; then
+ echo "[openvibe] workflow passed"
+else
+ echo "[openvibe warn] workflow failed; downloading diagnostics"
+fi
+
+tools/windows-workflow-debug-and-install.sh || true
+
+echo
+if [[ -x tools/verify-openvibe-dll-content.sh ]]; then
+ tools/verify-openvibe-dll-content.sh || true
+fi
+
+echo
+cat <<'EOF'
+[openvibe] next if patched DLLs are installed:
+ OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015
+
+In game console:
+ ov_join hub
+ ov_menu
+ ov_menu_servers
+EOF
new file mode 100755
new file mode 100755
@@ -0,0 +1,205 @@
@@ -0,0 +1,205 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+cd "$ROOT"
+
+BRANCH="$(git rev-parse --abbrev-ref HEAD)"
+REPO="${OPENVIBE_GITHUB_REPO:-$(gh repo view --json nameWithOwner -q .nameWithOwner 2>/dev/null || true)}"
+REPO="${REPO:-OpenVibers/OpenVibe.Games}"
+WORKFLOW="windows-source-sdk-dlls.yml"
+
+say(){ printf '[openvibe] %s\n' "$*"; }
+
+say "fix Windows bootstrap to clone the real Source SDK 2013 MP branch"
+say "root=$ROOT"
+say "branch=$BRANCH"
+say "repo=$REPO"
+
+if ! command -v gh >/dev/null 2>&1; then
+ echo "Missing gh. Run: sudo apt install gh && gh auth login" >&2
+ exit 1
+fi
+
+if ! gh auth status >/dev/null 2>&1; then
+ echo "gh is not authenticated. Run: gh auth login" >&2
+ exit 1
+fi
+
+mkdir -p tools docs .github/workflows
+
+cat > tools/bootstrap-source-sdk-2013-windows.ps1 <<'PS1'
+$ErrorActionPreference = 'Stop'
+
+$Root = if ($env:OPENVIBE_ROOT) { (Resolve-Path $env:OPENVIBE_ROOT).Path } else { (Resolve-Path (Join-Path $PSScriptRoot '..')).Path }
+$Sdk = if ($env:OPENVIBE_SDK) { $env:OPENVIBE_SDK } else { Join-Path $Root 'engine/source-sdk-2013' }
+$Src = Join-Path $Sdk 'src'
+$Deps = Join-Path $Root '_deps'
+$LogDir = Join-Path $Root 'artifacts/windows-build-debug'
+New-Item -ItemType Directory -Force -Path $LogDir | Out-Null
+
+function Say($m) { Write-Host "[openvibe-sdk-bootstrap] $m" }
+function Has-HL2MP($base) {
+ return ((Test-Path (Join-Path $base 'src/game/client/hl2mp')) -and (Test-Path (Join-Path $base 'src/game/server/hl2mp')))
+}
+function Run-Git($args, $logName) {
+ $log = Join-Path $LogDir $logName
+ Say "git $args"
+ & git @args 2>&1 | Tee-Object -FilePath $log
+ if ($LASTEXITCODE -ne 0) { throw "git $args failed with exit code $LASTEXITCODE. See $log" }
+}
+
+Say "root=$Root"
+Say "sdk=$Sdk"
+Say "logdir=$LogDir"
+
+if (Has-HL2MP $Sdk) {
+ Say "existing SDK tree already contains HL2MP client/server"
+ exit 0
+}
+
+New-Item -ItemType Directory -Force -Path $Deps | Out-Null
+
+# Valve's source-sdk-2013 repository is normally organized by branches: mp and sp.
+# Some forks/mirrors use root folders like mp/src. Support both layouts.
+$RepoUrl = if ($env:OPENVIBE_SOURCE_SDK_REPO) { $env:OPENVIBE_SOURCE_SDK_REPO } else { 'https://github.com/ValveSoftware/source-sdk-2013.git' }
+$ValveRepo = Join-Path $Deps 'source-sdk-2013-mp'
+
+if (Test-Path $ValveRepo) { Remove-Item -Recurse -Force $ValveRepo }
+
+$cloned = $false
+try {
+ Say "cloning Valve Source SDK 2013 branch mp"
+ Run-Git @('clone','--depth','1','--branch','mp',$RepoUrl,$ValveRepo) 'bootstrap-git-clone-mp.log'
+ $cloned = $true
+} catch {
+ Say "mp branch clone failed: $($_.Exception.Message)"
+ if (Test-Path $ValveRepo) { Remove-Item -Recurse -Force $ValveRepo }
+ Say "falling back to default branch clone"
+ Run-Git @('clone','--depth','1',$RepoUrl,$ValveRepo) 'bootstrap-git-clone-default.log'
+ $cloned = $true
+}
+
+if (-not $cloned) { throw "could not clone Source SDK repo" }
+
+"=== Valve repo root ===" | Out-File (Join-Path $LogDir 'valve-repo-root.txt')
+Get-ChildItem -Force $ValveRepo | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'valve-repo-root.txt') -Append
+"=== candidate src folders ===" | Out-File (Join-Path $LogDir 'valve-candidate-src.txt')
+Get-ChildItem -Path $ValveRepo -Recurse -Directory -Filter src -ErrorAction SilentlyContinue |
+ Select-Object FullName | Format-List | Out-File (Join-Path $LogDir 'valve-candidate-src.txt') -Append
+
+$candidates = @(
+ $ValveRepo,
+ (Join-Path $ValveRepo 'mp'),
+ (Join-Path $ValveRepo 'srcsdk/mp'),
+ (Join-Path $ValveRepo 'source-sdk-2013/mp')
+)
+
+$SourceRoot = $null
+foreach ($candidate in $candidates) {
+ if (Has-HL2MP $candidate) {
+ $SourceRoot = $candidate
+ break
+ }
+}
+
+if (-not $SourceRoot) {
+ $matches = Get-ChildItem -Path $ValveRepo -Recurse -Directory -Filter hl2mp -ErrorAction SilentlyContinue |
+ Where-Object { $_.FullName -match '[\\/]src[\\/]game[\\/](client|server)[\\/]hl2mp$' }
+ $matches | Select-Object FullName | Format-List | Out-File (Join-Path $LogDir 'hl2mp-folder-search.txt')
+ throw "Could not find Source SDK 2013 MP HL2MP layout after clone. Check valve-repo-root.txt, valve-candidate-src.txt, and hl2mp-folder-search.txt."
+}
+
+Say "source root=$SourceRoot"
+Say "copying Source SDK MP layout into $Sdk"
+if (Test-Path $Sdk) { Remove-Item -Recurse -Force $Sdk }
+New-Item -ItemType Directory -Force -Path $Sdk | Out-Null
+Copy-Item -Path (Join-Path $SourceRoot '*') -Destination $Sdk -Recurse -Force
+
+if (!(Has-HL2MP $Sdk)) {
+ Get-ChildItem -Force $Sdk | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'sdk-root-after-copy.txt')
+ throw "Bootstrapped SDK is missing expected HL2MP folders after copy"
+}
+
+"=== SDK root after copy ===" | Out-File (Join-Path $LogDir 'sdk-root-after-copy.txt')
+Get-ChildItem -Force $Sdk | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'sdk-root-after-copy.txt') -Append
+"=== SDK src root after copy ===" | Out-File (Join-Path $LogDir 'sdk-src-root-after-copy.txt')
+Get-ChildItem -Force (Join-Path $Sdk 'src') | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'sdk-src-root-after-copy.txt') -Append
+
+Say "SDK bootstrapped successfully"
+PS1
+
+cat > docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md <<'MD'
+# Windows Source SDK bootstrap
+
+The GitHub Actions Windows runner does not have Alex's local `engine/source-sdk-2013` checkout. The workflow bootstraps it by cloning ValveSoftware/source-sdk-2013.
+
+Important detail: the Source SDK 2013 multiplayer code is normally on the `mp` branch, not necessarily in a `mp/` directory on the default branch. The bootstrap script now supports both layouts:
+
+- `source-sdk-2013` checked out directly on the `mp` branch, with `src/...` at repo root
+- older/mirrored layout with `mp/src/...`
+
+The workflow should not upload or install stock/stale DLLs. A DLL artifact is considered useful only when `client.dll` contains OpenVibe command strings such as `ov_join`, `ov_menu`, or `OpenVibe`.
+MD
+
+# Make workflow rerun on bootstrap changes and make bootstrap log more obvious.
+python3 - <<'PY'
+from pathlib import Path
+p = Path('.github/workflows/windows-source-sdk-dlls.yml')
+s = p.read_text()
+if 'tools/bootstrap-source-sdk-2013-windows.ps1' not in s:
+ s = s.replace(' - "tools/build-sdk-windows.ps1"\n', ' - "tools/build-sdk-windows.ps1"\n - "tools/bootstrap-source-sdk-2013-windows.ps1"\n')
+# Ensure bootstrap step captures a specific log and prints it on failure before exiting.
+old = ''' - name: Bootstrap Source SDK 2013 MP\n run: |\n powershell -NoProfile -ExecutionPolicy Bypass -File tools/bootstrap-source-sdk-2013-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/bootstrap-source-sdk-2013.log\n'''
+new = ''' - name: Bootstrap Source SDK 2013 MP\n run: |\n $ErrorActionPreference = 'Continue'\n New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null\n powershell -NoProfile -ExecutionPolicy Bypass -File tools/bootstrap-source-sdk-2013-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/bootstrap-source-sdk-2013.log\n $code = $LASTEXITCODE\n if ($code -ne 0) {\n Write-Host \"[openvibe] bootstrap failed; tail follows\"\n Get-Content artifacts/windows-build-debug/bootstrap-source-sdk-2013.log -Tail 120\n exit $code\n }\n'''
+if old in s:
+ s = s.replace(old, new)
+p.write_text(s)
+PY
+
+# Improve debug downloader so it actually prints the useful logs next time.
+if [[ -f tools/windows-workflow-debug-and-install.sh ]]; then
+python3 - <<'PY'
+from pathlib import Path
+p = Path('tools/windows-workflow-debug-and-install.sh')
+s = p.read_text()
+needle = 'say "artifact files:"\nfind "$OUT" -type f | sort || true\n'
+insert = '''say "artifact files:"\nfind "$OUT" -type f | sort || true\n\nfor f in \\\n "$OUT"/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log \\\n "$OUT"/openvibe-windows-build-debug/build-sdk-windows.log \\\n "$OUT"/openvibe-windows-build-debug/bootstrap-git-clone-mp.log \\\n "$OUT"/openvibe-windows-build-debug/valve-repo-root.txt \\\n "$OUT"/openvibe-windows-build-debug/valve-candidate-src.txt \\\n "$OUT"/openvibe-windows-build-debug/hl2mp-folder-search.txt; do\n if [[ -f "$f" ]]; then\n echo\n say "tail: ${f#$OUT/}"\n tail -n 120 "$f" || true\n fi\ndone\n'''
+if needle in s and 'bootstrap-git-clone-mp.log' not in s:
+ s = s.replace(needle, insert)
+p.write_text(s)
+PY
+fi
+
+say "git diff summary"
+git diff --stat
+
+git add .github/workflows/windows-source-sdk-dlls.yml tools/bootstrap-source-sdk-2013-windows.ps1 docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md tools/windows-workflow-debug-and-install.sh
+
+if git diff --cached --quiet; then
+ say "nothing to commit"
+else
+ git commit -m "Fix Windows Source SDK MP branch bootstrap"
+ git push origin "$BRANCH"
+fi
+
+say "triggering workflow"
+gh workflow run "$WORKFLOW" --ref "$BRANCH"
+sleep 6
+RUN_ID="$(gh run list --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId -q '.[0].databaseId')"
+say "watching run $RUN_ID"
+set +e
+gh run watch "$RUN_ID" --exit-status
+STATUS=$?
+set -e
+
+say "downloading diagnostics/artifacts"
+tools/windows-workflow-debug-and-install.sh || true
+
+if [[ $STATUS -eq 0 ]]; then
+ say "workflow succeeded"
+else
+ say "workflow failed again; paste the tail printed above if it does not clearly show the next compile error"
+fi
+
+exit $STATUS