openvibers/source.openvibe.games Commits
Next push
Changes
nnew file mode 100644nnew file mode 100644nnew file mode 100644@@@ -0,0 +1,14 @@++[openvibe-win] root=D:\a\OpenVibe.Games\OpenVibe.Games++[openvibe-win] sdk=D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013++[openvibe-win] src=D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013\src++Source SDK checkout is missing from this runner. The workflow must have engine/source-sdk-2013 available in the++repository/submodule before Windows DLLs can build.++Missing: D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013\src++At D:\a\OpenVibe.Games\OpenVibe.Games\tools\build-sdk-windows.ps1:14 char:26+++ if (!(Test-Path $p)) { throw "$msg`nMissing: $p" }+++ ~~~~~~~~~~~~~~~~~~~~~~~~~++ + CategoryInfo : OperationStopped: (Source SDK chec...ce-sdk-2013\src:String) [], RuntimeException++ + FullyQualifiedErrorId : Source SDK checkout is missing from this runner. The workflow must have engine/source-sd++ k-2013 available in the repository/submodule before Windows DLLs can build.++Missing: D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013\src++nnew file mode 100644@@@ -0,0 +1,10 @@++=== dll search ===++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\client.dll++Length : 5591976++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\server.dll++Length : 7183272++LastWriteTime : 6/29/2026 4:39:51 AM++nnew file mode 100644@@@ -0,0 +1,198 @@++=== vc/sln search ===++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\build-sdk-windows.log++Length : 1032++LastWriteTime : 6/29/2026 4:40:01 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628000.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628001.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628002.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628003.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628004.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628005.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628006.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628007.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628008.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628009.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628010.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628011.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628012.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628013.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628014.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628015.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628016.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628017.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628018.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628019.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628020.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628021.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628022.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628023.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628024.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628025.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628026.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628027.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628028.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628029.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628030.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628031.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628032.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628033.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628034.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628035.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628036.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628037.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628038.log++Length : 596++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628039.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628040.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628041.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628042.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628043.log++Length : 538++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628044.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628045.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628046.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628047.log++Length : 4175++LastWriteTime : 6/29/2026 4:39:51 AM++nnew file mode 100644@@@ -0,0 +1,28 @@++=== repo ===++++ Directory: D:\a\OpenVibe.Games\OpenVibe.Games++++Mode LastWriteTime Length Name++---- ------------- ------ ----++d--h- 6/29/2026 4:39 AM .git++d---- 6/29/2026 4:39 AM .github++d---- 6/29/2026 4:39 AM .tmp++d---- 6/29/2026 4:40 AM artifacts++d---- 6/29/2026 4:39 AM backend++d---- 6/29/2026 4:39 AM docs++d---- 6/29/2026 4:39 AM engine++d---- 6/29/2026 4:39 AM game++d---- 6/29/2026 4:39 AM hammer++d---- 6/29/2026 4:39 AM infra++d---- 6/29/2026 4:39 AM launcher++d---- 6/29/2026 4:39 AM sdk++d---- 6/29/2026 4:39 AM servers++d---- 6/29/2026 4:39 AM tools++-a--- 6/29/2026 4:39 AM 983 .gitignore++-a--- 6/29/2026 4:39 AM 3758 DEPLOYMENT_STATUS.md++-a--- 6/29/2026 4:39 AM 1099 LICENSE++-a--- 6/29/2026 4:39 AM 12759 LINUX_SETUP.md++-a--- 6/29/2026 4:39 AM 4075 PROJECT_INDEX.md++-a--- 6/29/2026 4:39 AM 3826 QUICK_REFERENCE.md++-a--- 6/29/2026 4:39 AM 8794 README.md++nnew file mode 100644BBinary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/client.dll differnnew file mode 100644BBinary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/server.dll differnnew file mode 100644nnew file mode 100644nnew file mode 100644@@@ -0,0 +1,9 @@++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/file-list.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/full-run.log++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/dll-search.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/engine-before-build.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/no-patched-dlls.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/project-search.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/repo-root-before-build.txt++/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/tree.txtnnew file mode 100644nnew file mode 100644@@@ -0,0 +1,10 @@++[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] cloning ValveSoftware/source-sdk-2013++git : Cloning into 'D:\a\OpenVibe.Games\OpenVibe.Games\_deps\source-sdk-2013'...++At D:\a\OpenVibe.Games\OpenVibe.Games\tools\bootstrap-source-sdk-2013-windows.ps1:26 char:3+++ git clone --depth 1 https://github.com/ValveSoftware/source-sdk-201 ...+++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++ + CategoryInfo : NotSpecified: (Cloning into 'D...ce-sdk-2013'...:String) [], RemoteException++ + FullyQualifiedErrorId : NativeCommandError++nnew file mode 100644@@@ -0,0 +1,10 @@++=== dll search ===++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\client.dll++Length : 5591976++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\server.dll++Length : 7183272++LastWriteTime : 6/29/2026 4:43:22 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,198 @@++=== project/log search ===++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-source-sdk-2013.log++Length : 704++LastWriteTime : 6/29/2026 4:43:59 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628000.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628001.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628002.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628003.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628004.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628005.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628006.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628007.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628008.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628009.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628010.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628011.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628012.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628013.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628014.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628015.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628016.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628017.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628018.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628019.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628020.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628021.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628022.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628023.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628024.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628025.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628026.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628027.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628028.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628029.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628030.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628031.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628032.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628033.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628034.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628035.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628036.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628037.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628038.log++Length : 596++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628039.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628040.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628041.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628042.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628043.log++Length : 538++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628044.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628045.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628046.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 AM++++FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628047.log++Length : 4175++LastWriteTime : 6/29/2026 4:43:22 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:43 AM _deps++d--h- 6/29/2026 4:43 AM .git++d---- 6/29/2026 4:43 AM .github++d---- 6/29/2026 4:43 AM .tmp++d---- 6/29/2026 4:44 AM artifacts++d---- 6/29/2026 4:43 AM backend++d---- 6/29/2026 4:43 AM docs++d---- 6/29/2026 4:43 AM engine++d---- 6/29/2026 4:43 AM game++d---- 6/29/2026 4:43 AM hammer++d---- 6/29/2026 4:43 AM infra++d---- 6/29/2026 4:43 AM launcher++d---- 6/29/2026 4:43 AM sdk++d---- 6/29/2026 4:43 AM servers++d---- 6/29/2026 4:43 AM tools++-a--- 6/29/2026 4:43 AM 983 .gitignore++-a--- 6/29/2026 4:43 AM 3758 DEPLOYMENT_STATUS.md++-a--- 6/29/2026 4:43 AM 1099 LICENSE++-a--- 6/29/2026 4:43 AM 12759 LINUX_SETUP.md++-a--- 6/29/2026 4:43 AM 4075 PROJECT_INDEX.md++-a--- 6/29/2026 4:43 AM 3826 QUICK_REFERENCE.md++-a--- 6/29/2026 4:43 AM 8794 README.md++nnew file mode 100755@@@ -0,0 +1,520 @@++#!/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:-OpenVibers/OpenVibe.Games}"++WORKFLOW="windows-source-sdk-dlls.yml"++++echo "[openvibe] fix Windows SDK bootstrap + real DLL artifact validation"++echo "[openvibe] root=$ROOT"++echo "[openvibe] branch=$BRANCH"++echo "[openvibe] repo=$REPO"++++mkdir -p tools .github/workflows docs++++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'++$ValveRepo = Join-Path $Deps 'source-sdk-2013'++$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" }++++Say "root=$Root"++Say "sdk=$Sdk"++++if ((Test-Path (Join-Path $Src 'game/client/hl2mp')) -and (Test-Path (Join-Path $Src 'game/server/hl2mp'))) {++ Say "existing SDK tree looks usable"++ exit 0++}++++New-Item -ItemType Directory -Force -Path $Deps | Out-Null++++if (!(Test-Path (Join-Path $ValveRepo '.git'))) {++ Say "cloning ValveSoftware/source-sdk-2013"++ if (Test-Path $ValveRepo) { Remove-Item -Recurse -Force $ValveRepo }++ git clone --depth 1 https://github.com/ValveSoftware/source-sdk-2013.git $ValveRepo 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-clone.log')++} else {++ Say "updating cached Valve source-sdk-2013"++ Push-Location $ValveRepo++ git fetch --depth 1 origin 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-fetch.log')++ git reset --hard origin/master 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-reset.log')++ Pop-Location++}++++$Mp = Join-Path $ValveRepo 'mp'++if (!(Test-Path (Join-Path $Mp 'src'))) {++ Get-ChildItem -Force $ValveRepo | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'valve-repo-root.txt')++ throw "Valve source-sdk-2013 clone does not contain mp/src at $Mp/src"++}++++Say "copying mp branch 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 $Mp '*') -Destination $Sdk -Recurse -Force++++if (!(Test-Path (Join-Path $Src 'game/client/hl2mp')) -or !(Test-Path (Join-Path $Src 'game/server/hl2mp'))) {++ 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"++}++++Say "SDK bootstrapped successfully"++PS1++++cat > tools/build-sdk-windows.ps1 <<'PS1'++param(++ [switch]$InDevShell++)++++$ErrorActionPreference = "Stop"++++$Root = (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"++$Mod = Join-Path $Root "game/openvibe.games"++$OutBin = Join-Path $Mod "bin"++$LogDir = Join-Path $Root "artifacts/windows-build-debug"++New-Item -ItemType Directory -Force -Path $LogDir | Out-Null++++function Say($m) { Write-Host "[openvibe-win] $m" }++function Require($p, $msg) { if (!(Test-Path $p)) { throw "$msg`nMissing: $p" } }++++function Enter-MsvcDevShellIfNeeded {++ if (Get-Command cl.exe -ErrorAction SilentlyContinue) {++ Say "cl.exe already available"++ return++ }++ if ($InDevShell) { throw "cl.exe still not found after entering MSVC dev shell" }++++ $vswhere = Join-Path ${env:ProgramFiles(x86)} "Microsoft Visual Studio/Installer/vswhere.exe"++ if (!(Test-Path $vswhere)) { throw "vswhere.exe not found; Visual Studio Build Tools are not installed" }++++ $install = & $vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath++ if (!$install) { throw "Could not find Visual Studio installation with VC x86/x64 tools" }++++ $vcvars = Join-Path $install "VC/Auxiliary/Build/vcvars32.bat"++ if (!(Test-Path $vcvars)) { throw "vcvars32.bat not found at $vcvars" }++++ Say "relaunching through MSVC x86 dev shell: $vcvars"++ $self = $PSCommandPath++ $cmd = "call `"$vcvars`" && powershell -NoProfile -ExecutionPolicy Bypass -File `"$self`" -InDevShell"++ & cmd.exe /d /s /c $cmd++ exit $LASTEXITCODE++}++++Say "root=$Root"++Say "sdk=$Sdk"++Say "src=$Src"++++$env:OPENVIBE_ROOT = $Root++$env:OPENVIBE_SDK = $Sdk++++if (!(Test-Path $Src)) {++ Say "SDK src missing; bootstrapping Source SDK 2013 MP"++ & powershell -NoProfile -ExecutionPolicy Bypass -File (Join-Path $Root "tools/bootstrap-source-sdk-2013-windows.ps1")++ if ($LASTEXITCODE -ne 0) { throw "bootstrap-source-sdk-2013-windows.ps1 failed with exit code $LASTEXITCODE" }++}++++Require $Src "Source SDK checkout is missing from this runner."++Require (Join-Path $Src "game/client/hl2mp") "Source SDK HL2MP client tree missing."++Require (Join-Path $Src "game/server/hl2mp") "Source SDK HL2MP server tree missing."++++Enter-MsvcDevShellIfNeeded++++# Do not let old/stock repo DLLs get mistaken for a successful new build.++New-Item -ItemType Directory -Force -Path $OutBin | Out-Null++Remove-Item (Join-Path $OutBin "client.dll") -Force -ErrorAction SilentlyContinue++Remove-Item (Join-Path $OutBin "server.dll") -Force -ErrorAction SilentlyContinue++Remove-Item -Recurse -Force (Join-Path $Sdk "game/mod_hl2mp/bin") -ErrorAction SilentlyContinue++++# Apply OpenVibe source files using Git Bash. Skip the Linux QuickJS build inside apply-openvibe-sdk.sh.++$bash = (Get-Command bash -ErrorAction SilentlyContinue)++if ($bash) {++ Say "applying OpenVibe SDK patch through bash"++ $env:OPENVIBE_SKIP_QJS_BUILD = "1"++ & bash "$Root/tools/apply-openvibe-sdk.sh" 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "apply-openvibe-sdk.log")++ if ($LASTEXITCODE -ne 0) { throw "apply-openvibe-sdk.sh failed with exit code $LASTEXITCODE" }++} else {++ throw "Git Bash is required on the Windows runner to apply the OpenVibe SDK patch."++}++++Say "building QuickJS Windows static library"++& powershell -NoProfile -ExecutionPolicy Bypass -File (Join-Path $Root "tools/build-quickjs-lib-windows.ps1") 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "quickjs-windows.log")++if ($LASTEXITCODE -ne 0) { throw "build-quickjs-lib-windows.ps1 failed with exit code $LASTEXITCODE" }++++Set-Location $Src++++# Generate Visual Studio project files if needed.++$solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)++if ($solutions.Count -eq 0) {++ Say "no .sln files found; trying Source SDK project generators"++ $generators = @(++ (Join-Path $Src "creategameprojects.bat"),++ (Join-Path $Src "createallprojects.bat"),++ (Join-Path $Src "createprojects.bat")++ )++ $ran = $false++ foreach ($gen in $generators) {++ if (Test-Path $gen) {++ Say "running $gen"++ & cmd /d /s /c "`"$gen`"" 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "project-generation.log")++ $ran = $true++ break++ }++ }++++ if (-not $ran) {++ $vpc = Join-Path $Src "devtools/bin/vpc.exe"++ if (Test-Path $vpc) {++ Say "running vpc.exe fallback"++ & $vpc /hl2mp +game /mksln OpenVibe_HL2MP.sln 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "vpc.log")++ $ran = $true++ }++ }++++ $solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)++ if ($solutions.Count -eq 0) {++ Get-ChildItem -Path $Src -Force | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir "src-root-after-generator.txt")++ throw "No Visual Studio solution was generated. Check openvibe-windows-build-debug artifact."++ }++}++++Say "solutions found:"++$solutions | ForEach-Object { Say " $($_.FullName)" }++++$solution = $solutions |++ Where-Object { $_.Name -match "hl2mp|game|sdk|everything|OpenVibe" } |++ Select-Object -First 1++if (-not $solution) { $solution = $solutions | Select-Object -First 1 }++Say "selected solution=$($solution.FullName)"++++$configs = @("Release", "Release_HL2MP", "Release HL2MP")++$platforms = @("Win32", "x86")++$targets = @("client_hl2mp", "server_hl2mp", "client", "server", "Build")++++$builtAny = $false++foreach ($cfg in $configs) {++ foreach ($plat in $platforms) {++ foreach ($target in $targets) {++ Say "msbuild cfg=$cfg platform=$plat target=$target"++ $log = Join-Path $LogDir "msbuild-$($cfg -replace '[^A-Za-z0-9]','_')-$plat-$target.log"++ & msbuild $solution.FullName /m /p:Configuration=$cfg /p:Platform=$plat /p:PlatformToolset=v143 /t:$target /v:minimal /nologo 2>&1 | Tee-Object -FilePath $log++ if ($LASTEXITCODE -eq 0) { $builtAny = $true; break }++ }++ if ($builtAny) { break }++ }++ if ($builtAny) { break }++}++++if (-not $builtAny) { throw "MSBuild could not build any known Source SDK HL2MP target. Check uploaded msbuild logs." }++++New-Item -ItemType Directory -Force -Path $OutBin | Out-Null++++$client = Get-ChildItem -Path $Sdk -Recurse -Filter client.dll -ErrorAction SilentlyContinue |++ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|client" } |++ Sort-Object LastWriteTime -Descending |++ Select-Object -First 1++$server = Get-ChildItem -Path $Sdk -Recurse -Filter server.dll -ErrorAction SilentlyContinue |++ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|server" } |++ Sort-Object LastWriteTime -Descending |++ Select-Object -First 1++++if (-not $client) { throw "client.dll was not produced" }++if (-not $server) { throw "server.dll was not produced" }++++Say "copy client=$($client.FullName)"++Say "copy server=$($server.FullName)"++Copy-Item $client.FullName (Join-Path $OutBin "client.dll") -Force++Copy-Item $server.FullName (Join-Path $OutBin "server.dll") -Force++++$clientText = & strings.exe (Join-Path $OutBin "client.dll") 2>$null | Select-String -Pattern "ov_join|ov_menu|OpenVibe" -Quiet++if (-not $clientText) { throw "Built client.dll does not contain OpenVibe strings; refusing to publish stale/stock DLL" }++++Say "done"++PS1++++python3 - <<'PY'++from pathlib import Path++p = Path('tools/apply-openvibe-sdk.sh')++s = p.read_text()++old = '''copy_tree() {\n local src="$1"\n local dst="$2"\n mkdir -p "$dst"\n rsync -a --delete "$src/" "$dst/"\n echo "[openvibe-sdk] copied tree ${dst#$SDK/}"\n}\n'''++new = '''copy_tree() {\n local src="$1"\n local dst="$2"\n mkdir -p "$dst"\n if command -v rsync >/dev/null 2>&1; then\n rsync -a --delete "$src/" "$dst/"\n else\n rm -rf "$dst"\n mkdir -p "$dst"\n cp -R "$src"/. "$dst"/\n fi\n echo "[openvibe-sdk] copied tree ${dst#$SDK/}"\n}\n'''++if old not in s:++ raise SystemExit('Could not patch copy_tree() in tools/apply-openvibe-sdk.sh')++p.write_text(s.replace(old, new))++PY++++cat > .github/workflows/windows-source-sdk-dlls.yml <<'YAML'++name: Build Windows Source DLLs++++on:++ workflow_dispatch:++ inputs:++ diagnostics:++ description: "Upload verbose build diagnostics"++ required: false++ default: "1"++ push:++ branches:++ - codex/openvibe-next-steps++ paths:++ - ".github/workflows/windows-source-sdk-dlls.yml"++ - "tools/bootstrap-source-sdk-2013-windows.ps1"++ - "tools/build-sdk-windows.ps1"++ - "tools/build-quickjs-lib-windows.ps1"++ - "tools/apply-openvibe-sdk.sh"++ - "sdk/openvibe/**"++ - "game/openvibe.games/js/**"++++permissions:++ contents: read++ actions: read++++jobs:++ windows-dlls:++ name: Windows client.dll/server.dll++ runs-on: windows-2022++ defaults:++ run:++ shell: pwsh++++ steps:++ - name: Checkout OpenVibe++ uses: actions/checkout@v4++ with:++ fetch-depth: 1++++ - name: Configure git line endings++ run: |++ git config --global core.autocrlf false++ git config --global core.eol lf++ git status --short++++ - name: Setup MSBuild++ uses: microsoft/setup-msbuild@v2++++ - name: Show toolchain and tree++ run: |++ $ErrorActionPreference = 'Continue'++ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null++ Write-Host "pwd=$(Get-Location)"++ git rev-parse --short HEAD++ where.exe msbuild++ where.exe cl++ where.exe link++ where.exe bash++ where.exe git++ Get-ChildItem -Force | Select-Object Mode,Length,Name | Tee-Object -FilePath artifacts/windows-build-debug/repo-root-before-build.txt++ if (Test-Path engine) { Get-ChildItem -Force engine | Select-Object Mode,Length,Name | Tee-Object -FilePath artifacts/windows-build-debug/engine-before-build.txt } else { Write-Host "[miss] engine directory" }++++ - name: Bootstrap Source SDK 2013 MP++ run: |++ $ErrorActionPreference = 'Stop'++ 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++++ - name: Build Windows Source SDK DLLs++ id: build++ run: |++ $ErrorActionPreference = 'Stop'++ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null++ powershell -NoProfile -ExecutionPolicy Bypass -File tools/build-sdk-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/build-sdk-windows.log++++ - name: Stage build outputs and diagnostics++ if: always()++ run: |++ $ErrorActionPreference = 'Continue'++ New-Item -ItemType Directory -Force -Path artifacts/windows-dlls | Out-Null++ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null++++ "=== repo ===" | Out-File artifacts/windows-build-debug/tree.txt++ Get-ChildItem -Force | Format-Table -AutoSize | Out-File artifacts/windows-build-debug/tree.txt -Append++ "=== dll search ===" | Out-File artifacts/windows-build-debug/dll-search.txt++ Get-ChildItem -Recurse -Force -Include client.dll,server.dll -ErrorAction SilentlyContinue |++ Select-Object FullName,Length,LastWriteTime |++ Format-List | Out-File artifacts/windows-build-debug/dll-search.txt -Append++ "=== project/log search ===" | Out-File artifacts/windows-build-debug/project-search.txt++ Get-ChildItem -Recurse -Force -Include *.sln,*.vcxproj,*.vcproj,*.log -ErrorAction SilentlyContinue |++ Select-Object FullName,Length,LastWriteTime |++ Format-List | Out-File artifacts/windows-build-debug/project-search.txt -Append++++ $client = "game/openvibe.games/bin/client.dll"++ $server = "game/openvibe.games/bin/server.dll"++ $clientOk = $false++ if (Test-Path $client) {++ $text = strings.exe $client 2>$null | Select-String -Pattern "ov_join|ov_menu|OpenVibe" -Quiet++ if ($text) { $clientOk = $true }++ }++ if ($clientOk -and (Test-Path $server)) {++ Copy-Item $client artifacts/windows-dlls/client.dll -Force++ Copy-Item $server artifacts/windows-dlls/server.dll -Force++ Write-Host "[ok] staged patched OpenVibe Windows DLLs"++ } else {++ Write-Host "[miss] not staging DLLs because patched OpenVibe client.dll was not produced"++ "No patched OpenVibe DLLs staged. Check build logs." | Out-File artifacts/windows-build-debug/no-patched-dlls.txt++ }++++ - name: Upload Windows DLL artifact++ if: always()++ uses: actions/upload-artifact@v4++ with:++ name: openvibe-windows-dlls++ path: artifacts/windows-dlls/**++ if-no-files-found: warn++++ - name: Upload Windows build diagnostics++ if: always()++ uses: actions/upload-artifact@v4++ with:++ name: openvibe-windows-build-debug++ path: artifacts/windows-build-debug/**++ if-no-files-found: warn++YAML++++cat > tools/windows-workflow-debug-and-install.sh <<'BASH2'++#!/usr/bin/env bash++set -euo pipefail++++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++cd "$ROOT"++REPO="${OPENVIBE_GITHUB_REPO:-OpenVibers/OpenVibe.Games}"++WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"++RUN_ID="${1:-}"++++if ! command -v gh >/dev/null 2>&1; then++ echo "[openvibe] missing gh. Install with: sudo apt install gh" >&2++ exit 1++fi++++if [[ -z "$RUN_ID" ]]; then++ RUN_ID="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$(git rev-parse --abbrev-ref HEAD)" --limit 1 --json databaseId --jq '.[0].databaseId')"++fi++++OUT="$ROOT/artifacts/windows-workflow-debug/run-$RUN_ID-artifacts"++rm -rf "$OUT"++mkdir -p "$OUT"++++echo "[openvibe] run=$RUN_ID"++echo "[openvibe] downloading logs/artifacts into $OUT"++++gh run view "$RUN_ID" --repo "$REPO" --log > "$OUT/full-run.log" || true++gh run download "$RUN_ID" --repo "$REPO" --dir "$OUT" || true++++find "$OUT" -maxdepth 3 -type f | sort > "$OUT/file-list.txt"++++echo++echo "[openvibe] likely errors:"++grep -RniE "error MSB|fatal error|undefined reference|unresolved external|LNK[0-9]+|C[0-9]{4}:|throw |Missing:|not found|could not|failed|No Visual Studio solution|No patched" "$OUT" | tail -n 120 || true++++echo++echo "[openvibe] artifact files:"++sed -n '1,160p' "$OUT/file-list.txt"++++DLLDIR="$OUT/openvibe-windows-dlls"++if [[ -f "$DLLDIR/client.dll" && -f "$DLLDIR/server.dll" ]]; then++ if strings "$DLLDIR/client.dll" | grep -Eq 'ov_join|ov_menu|OpenVibe'; then++ mkdir -p game/openvibe.games/bin++ cp -f "$DLLDIR/client.dll" game/openvibe.games/bin/client.dll++ cp -f "$DLLDIR/server.dll" game/openvibe.games/bin/server.dll++ echo "[openvibe] installed patched Windows DLLs"++ tools/verify-openvibe-dll-content.sh || true++ else++ echo "[openvibe] refused to install DLL artifact because client.dll lacks OpenVibe strings" >&2++ exit 2++ fi++else++ echo "[openvibe] no DLL artifact available yet" >&2++ exit 3++fi++BASH2++chmod +x tools/windows-workflow-debug-and-install.sh++++cat > docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md <<'MD'++# Windows DLL workflow bootstrap++++The Windows GitHub Actions runner does not have the local `engine/source-sdk-2013` checkout that exists on the Linux workstation.++++The workflow now bootstraps Valve's Source SDK 2013 multiplayer tree into:++++```text++engine/source-sdk-2013++```++++Then it applies the OpenVibe SDK patch, skips the Linux QuickJS static-library build, builds QuickJS with MSVC, generates Visual Studio projects, builds `client.dll/server.dll`, and only uploads DLLs when `client.dll` contains OpenVibe command strings such as `ov_join`, `ov_menu`, or `OpenVibe`.++++Use:++++```bash++tools/gh-windows-build-and-install.sh++```++++or debug the latest run with:++++```bash++tools/windows-workflow-debug-and-install.sh++```++MD++++# Keep gh helper stricter if present: do not install stale DLLs.++if [[ -f tools/gh-windows-build-and-install.sh ]]; then++python3 - <<'PY'++from pathlib import Path++p = Path('tools/gh-windows-build-and-install.sh')++s = p.read_text()++if 'strings "$ARTDIR/openvibe-windows-dlls/client.dll"' not in s and 'refused to install DLL artifact' not in s:++ marker = 'if [[ -f "$ARTDIR/openvibe-windows-dlls/client.dll" && -f "$ARTDIR/openvibe-windows-dlls/server.dll" ]]; then'++ if marker in s:++ repl = marker + '''++ if ! strings "$ARTDIR/openvibe-windows-dlls/client.dll" | grep -Eq 'ov_join|ov_menu|OpenVibe'; then++ echo "[openvibe] refused to install DLL artifact because client.dll lacks OpenVibe strings" >&2++ tools/windows-workflow-debug-and-install.sh "$RUN_ID" || true++ exit 2++ fi'''++ s = s.replace(marker, repl)++ p.write_text(s)++PY++fi++++# Commit/push and run workflow if gh is available.++echo++echo "[openvibe] git diff summary"++git diff --stat++++git add \++ .github/workflows/windows-source-sdk-dlls.yml \++ tools/bootstrap-source-sdk-2013-windows.ps1 \++ tools/build-sdk-windows.ps1 \++ tools/apply-openvibe-sdk.sh \++ tools/windows-workflow-debug-and-install.sh \++ tools/gh-windows-build-and-install.sh \++ docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md 2>/dev/null || true++++if ! git diff --cached --quiet; then++ git commit -m "Bootstrap Source SDK for Windows DLL workflow"++ git push origin "$BRANCH"++else++ echo "[openvibe] no changes to commit"++fi++++if command -v gh >/dev/null 2>&1; then++ echo "[openvibe] triggering workflow"++ gh workflow run "$WORKFLOW" --repo "$REPO" --ref "$BRANCH" -f diagnostics=1++ sleep 6++ RUN_ID="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId')"++ echo "[openvibe] watching run $RUN_ID"++ gh run watch "$RUN_ID" --repo "$REPO" || true++ tools/windows-workflow-debug-and-install.sh "$RUN_ID" || true++else++ echo "[openvibe] gh missing; run tools/gh-windows-build-and-install.sh after installing/authenticating gh"++fi++++echo++echo "[openvibe] next if DLLs installed:"++echo " OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015"++echo " # in game console: ov_join hub ; ov_menu ; ov_menu_servers"nnew file mode 100755@@@ -0,0 +1,391 @@++#!/usr/bin/env bash++set -euo pipefail++++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++REPO="${OPENVIBE_REPO:-OpenVibers/OpenVibe.Games}"++WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"++BRANCH="$(git -C "$ROOT" rev-parse --abbrev-ref HEAD)"++LOG_DIR="$ROOT/artifacts/windows-workflow-debug"++++cd "$ROOT"++++echo "[openvibe] fix Windows workflow diagnostics + rerun"++echo "[openvibe] root=$ROOT"++echo "[openvibe] repo=$REPO"++echo "[openvibe] workflow=$WORKFLOW"++echo "[openvibe] branch=$BRANCH"++++if ! command -v gh >/dev/null 2>&1; then++ echo "[openvibe error] gh is required. Install/auth first:" >&2++ echo " sudo apt update && sudo apt install gh" >&2++ echo " gh auth login" >&2++ exit 1++fi++++if ! gh auth status >/dev/null 2>&1; then++ echo "[openvibe error] gh is installed but not authenticated. Run:" >&2++ echo " gh auth login" >&2++ exit 1++fi++++mkdir -p "$LOG_DIR"++++latest_run="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId // empty')"++if [[ -n "$latest_run" ]]; then++ echo "[openvibe] latest workflow run=$latest_run"++ echo "[openvibe] saving failed/full logs into $LOG_DIR"++ gh run view "$latest_run" --repo "$REPO" --log-failed > "$LOG_DIR/run-${latest_run}-failed.log" 2>&1 || true++ gh run view "$latest_run" --repo "$REPO" --log > "$LOG_DIR/run-${latest_run}-full.log" 2>&1 || true++++ echo "[openvibe] likely error snippets:"++ grep -Eina "error|fatal|exception|not found|cannot find|MSB[0-9]+|LNK[0-9]+|C[0-9]{4}|No such|missing|failed" \++ "$LOG_DIR/run-${latest_run}-failed.log" "$LOG_DIR/run-${latest_run}-full.log" \++ | tail -n 80 || true++else++ echo "[openvibe warn] no existing workflow run found yet"++fi++++echo++++echo "[openvibe] rewriting Windows workflow to always upload logs/artifacts"++mkdir -p .github/workflows++cat > .github/workflows/windows-source-sdk-dlls.yml <<'YAML'++name: Build Windows Source DLLs++++on:++ workflow_dispatch:++ inputs:++ diagnostics:++ description: "Upload verbose build diagnostics"++ required: false++ default: "1"++ push:++ branches:++ - codex/openvibe-next-steps++ paths:++ - ".github/workflows/windows-source-sdk-dlls.yml"++ - "tools/build-sdk-windows.ps1"++ - "tools/build-quickjs-lib-windows.ps1"++ - "tools/apply-openvibe-sdk.sh"++ - "sdk/openvibe/**"++ - "game/openvibe.games/js/**"++++permissions:++ contents: read++ actions: read++++jobs:++ windows-dlls:++ name: Windows client.dll/server.dll++ runs-on: windows-2022++ defaults:++ run:++ shell: pwsh++++ steps:++ - name: Checkout OpenVibe++ uses: actions/checkout@v4++ with:++ fetch-depth: 1++++ - name: Configure git line endings++ run: |++ git config --global core.autocrlf false++ git config --global core.eol lf++ git status --short++++ - name: Setup MSBuild++ uses: microsoft/setup-msbuild@v2++++ - name: Show toolchain and tree++ run: |++ $ErrorActionPreference = 'Continue'++ Write-Host "pwd=$(Get-Location)"++ git rev-parse --short HEAD++ where.exe msbuild++ where.exe cl++ where.exe link++ where.exe bash++ Get-ChildItem -Force | Select-Object Mode,Length,Name++ if (Test-Path engine) { Get-ChildItem -Force engine | Select-Object Mode,Length,Name } else { Write-Host "[miss] engine directory" }++ if (Test-Path engine/source-sdk-2013/src) { Get-ChildItem -Force engine/source-sdk-2013/src | Select-Object Mode,Length,Name } else { Write-Host "[miss] engine/source-sdk-2013/src" }++++ - name: Build Windows Source SDK DLLs++ id: build++ run: |++ $ErrorActionPreference = 'Stop'++ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null++ powershell -NoProfile -ExecutionPolicy Bypass -File tools/build-sdk-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/build-sdk-windows.log++++ - name: Stage build outputs and diagnostics++ if: always()++ run: |++ $ErrorActionPreference = 'Continue'++ New-Item -ItemType Directory -Force -Path artifacts/windows-dlls | Out-Null++ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null++++ "=== repo ===" | Out-File artifacts/windows-build-debug/tree.txt++ Get-ChildItem -Force | Format-Table -AutoSize | Out-File artifacts/windows-build-debug/tree.txt -Append++ "=== dll search ===" | Out-File artifacts/windows-build-debug/dll-search.txt++ Get-ChildItem -Recurse -Force -Include client.dll,server.dll -ErrorAction SilentlyContinue |++ Select-Object FullName,Length,LastWriteTime |++ Format-List | Out-File artifacts/windows-build-debug/dll-search.txt -Append++ "=== vc/sln search ===" | Out-File artifacts/windows-build-debug/project-search.txt++ Get-ChildItem -Recurse -Force -Include *.sln,*.vcxproj,*.vcproj,*.log -ErrorAction SilentlyContinue |++ Select-Object FullName,Length,LastWriteTime |++ Format-List | Out-File artifacts/windows-build-debug/project-search.txt -Append++++ $clientCandidates = @(++ "game/openvibe.games/bin/client.dll",++ "engine/source-sdk-2013/game/mod_hl2mp/bin/client.dll",++ "engine/source-sdk-2013/game/mod_hl2mp/bin/win64/client.dll",++ "engine/source-sdk-2013/game/mod_hl2mp/bin/Release/client.dll",++ "engine/source-sdk-2013/src/game/client/Release_hl2mp/client.dll",++ "engine/source-sdk-2013/src/game/client/Release/client.dll"++ )++ $serverCandidates = @(++ "game/openvibe.games/bin/server.dll",++ "engine/source-sdk-2013/game/mod_hl2mp/bin/server.dll",++ "engine/source-sdk-2013/game/mod_hl2mp/bin/win64/server.dll",++ "engine/source-sdk-2013/game/mod_hl2mp/bin/Release/server.dll",++ "engine/source-sdk-2013/src/game/server/Release_hl2mp/server.dll",++ "engine/source-sdk-2013/src/game/server/Release/server.dll"++ )++++ $client = $clientCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1++ $server = $serverCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1++ if ($client) { Copy-Item $client artifacts/windows-dlls/client.dll -Force }++ if ($server) { Copy-Item $server artifacts/windows-dlls/server.dll -Force }++++ if (Test-Path artifacts/windows-dlls/client.dll) {++ $clientText = (Select-String -Path artifacts/windows-dlls/client.dll -Pattern "ov_join|ov_menu|OpenVibe" -Encoding Byte -SimpleMatch -Quiet)++ Write-Host "client.dll staged"++ } else {++ Write-Host "[miss] no client.dll staged"++ }++ if (Test-Path artifacts/windows-dlls/server.dll) { Write-Host "server.dll staged" } else { Write-Host "[miss] no server.dll staged" }++++ - name: Upload Windows DLL artifact++ if: always()++ uses: actions/upload-artifact@v4++ with:++ name: openvibe-windows-dlls++ path: artifacts/windows-dlls/**++ if-no-files-found: warn++++ - name: Upload Windows build diagnostics++ if: always()++ uses: actions/upload-artifact@v4++ with:++ name: openvibe-windows-build-debug++ path: artifacts/windows-build-debug/**++ if-no-files-found: warn++YAML++++cat > tools/build-sdk-windows.ps1 <<'PS1'++$ErrorActionPreference = "Stop"++++$Root = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path++$Sdk = Join-Path $Root "engine/source-sdk-2013"++$Src = Join-Path $Sdk "src"++$Mod = Join-Path $Root "game/openvibe.games"++$OutBin = Join-Path $Mod "bin"++$Qjs = Join-Path $Src "game/shared/openvibe/third_party/quickjs"++$LogDir = Join-Path $Root "artifacts/windows-build-debug"++New-Item -ItemType Directory -Force -Path $LogDir | Out-Null++++function Say($m) { Write-Host "[openvibe-win] $m" }++function Require($p, $msg) {++ if (!(Test-Path $p)) { throw "$msg`nMissing: $p" }++}++++Say "root=$Root"++Say "sdk=$Sdk"++Say "src=$Src"++Require $Src "Source SDK checkout is missing from this runner. The workflow must have engine/source-sdk-2013 available in the repository/submodule before Windows DLLs can build."++++# Apply OpenVibe source files using Git Bash when available. This reuses the Linux patcher on Windows runners.++$bash = (Get-Command bash -ErrorAction SilentlyContinue)++if ($bash) {++ Say "applying OpenVibe SDK patch through bash"++ & bash "$Root/tools/apply-openvibe-sdk.sh"++ if ($LASTEXITCODE -ne 0) { throw "apply-openvibe-sdk.sh failed with exit code $LASTEXITCODE" }++} else {++ throw "Git Bash is required on the Windows runner to apply the OpenVibe SDK patch."++}++++# Build QuickJS as MSVC objects/lib. The Linux .a cannot be linked into Windows DLLs.++if (Test-Path (Join-Path $Root "tools/build-quickjs-lib-windows.ps1")) {++ Say "building QuickJS Windows static library"++ & powershell -NoProfile -ExecutionPolicy Bypass -File (Join-Path $Root "tools/build-quickjs-lib-windows.ps1")++ if ($LASTEXITCODE -ne 0) { throw "build-quickjs-lib-windows.ps1 failed with exit code $LASTEXITCODE" }++} else {++ Say "no build-quickjs-lib-windows.ps1 found; continuing"++}++++Set-Location $Src++++# Generate Visual Studio project files if needed.++$solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)++if ($solutions.Count -eq 0) {++ Say "no .sln files found; trying Source SDK project generators"++ $generators = @(++ (Join-Path $Src "creategameprojects.bat"),++ (Join-Path $Src "createallprojects.bat"),++ (Join-Path $Src "createprojects.bat")++ )++ $ran = $false++ foreach ($gen in $generators) {++ if (Test-Path $gen) {++ Say "running $gen"++ & cmd /c "`"$gen`"" | Tee-Object -FilePath (Join-Path $LogDir "project-generation.log")++ $ran = $true++ break++ }++ }++++ if (-not $ran) {++ $vpc = Join-Path $Src "devtools/bin/vpc.exe"++ if (Test-Path $vpc) {++ Say "running vpc.exe fallback"++ & $vpc /hl2mp +game /mksln OpenVibe_HL2MP.sln | Tee-Object -FilePath (Join-Path $LogDir "vpc.log")++ $ran = $true++ }++ }++++ $solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)++ if ($solutions.Count -eq 0) {++ Get-ChildItem -Path $Src -Force | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir "src-root-after-generator.txt")++ throw "No Visual Studio solution was generated. Check openvibe-windows-build-debug artifact."++ }++}++++Say "solutions found:"++$solutions | ForEach-Object { Say " $($_.FullName)" }++++# Pick the most likely HL2MP/game solution.++$solution = $solutions |++ Where-Object { $_.Name -match "hl2mp|game|sdk|everything|OpenVibe" } |++ Select-Object -First 1++if (-not $solution) { $solution = $solutions | Select-Object -First 1 }++Say "selected solution=$($solution.FullName)"++++# Try common project targets/configurations. Source SDK projects vary by branch/version.++$configs = @("Release", "Release_HL2MP", "Release HL2MP")++$platforms = @("Win32", "x86")++$targets = @("client_hl2mp", "server_hl2mp", "client", "server", "Build")++++$builtAny = $false++foreach ($cfg in $configs) {++ foreach ($plat in $platforms) {++ foreach ($target in $targets) {++ Say "msbuild cfg=$cfg platform=$plat target=$target"++ & msbuild $solution.FullName /m /p:Configuration=$cfg /p:Platform=$plat /t:$target /v:minimal /nologo 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "msbuild-$($cfg -replace '[^A-Za-z0-9]','_')-$plat-$target.log")++ if ($LASTEXITCODE -eq 0) {++ $builtAny = $true++ break++ }++ }++ if ($builtAny) { break }++ }++ if ($builtAny) { break }++}++++if (-not $builtAny) {++ throw "MSBuild could not build any known Source SDK HL2MP target. Check uploaded msbuild logs."++}++++New-Item -ItemType Directory -Force -Path $OutBin | Out-Null++++$client = Get-ChildItem -Path $Sdk -Recurse -Filter client.dll -ErrorAction SilentlyContinue |++ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|client" } |++ Sort-Object LastWriteTime -Descending |++ Select-Object -First 1++$server = Get-ChildItem -Path $Sdk -Recurse -Filter server.dll -ErrorAction SilentlyContinue |++ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|server" } |++ Sort-Object LastWriteTime -Descending |++ Select-Object -First 1++++if (-not $client) { throw "client.dll was not produced" }++if (-not $server) { throw "server.dll was not produced" }++++Say "copy client=$($client.FullName)"++Say "copy server=$($server.FullName)"++Copy-Item $client.FullName (Join-Path $OutBin "client.dll") -Force++Copy-Item $server.FullName (Join-Path $OutBin "server.dll") -Force++++Say "done"++PS1++++# Add a local helper that downloads full logs/artifacts from the last run even when failed.++cat > tools/windows-workflow-debug-and-install.sh <<'SH'++#!/usr/bin/env bash++set -euo pipefail++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++REPO="${OPENVIBE_REPO:-OpenVibers/OpenVibe.Games}"++WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"++BRANCH="$(git -C "$ROOT" rev-parse --abbrev-ref HEAD)"++OUT="$ROOT/artifacts/windows-workflow-debug"++cd "$ROOT"++mkdir -p "$OUT"++run="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId')"++echo "[openvibe] latest run=$run"++gh run view "$run" --repo "$REPO" --log > "$OUT/run-${run}.log" 2>&1 || true++gh run view "$run" --repo "$REPO" --log-failed > "$OUT/run-${run}-failed.log" 2>&1 || true++gh run download "$run" --repo "$REPO" --dir "$OUT/run-${run}-artifacts" || true++printf '\n[openvibe] tail of failed log:\n'++tail -n 160 "$OUT/run-${run}-failed.log" || true++printf '\n[openvibe] artifacts saved under: %s\n' "$OUT/run-${run}-artifacts"++if [[ -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/client.dll" && -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/server.dll" ]]; then++ mkdir -p game/openvibe.games/bin++ cp -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/client.dll" game/openvibe.games/bin/client.dll++ cp -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/server.dll" game/openvibe.games/bin/server.dll++ echo "[openvibe] installed DLL artifacts"++ tools/verify-openvibe-dll-content.sh || true++else++ echo "[openvibe] no DLL artifact available yet; check debug artifact/logs"++fi++SH++chmod +x tools/windows-workflow-debug-and-install.sh++++git add .github/workflows/windows-source-sdk-dlls.yml tools/build-sdk-windows.ps1 tools/windows-workflow-debug-and-install.sh++++if ! git diff --cached --quiet; then++ echo "[openvibe] committing workflow/build diagnostic patch"++ git commit -m "Improve Windows DLL workflow diagnostics"++ echo "[openvibe] pushing $BRANCH"++ git push origin "$BRANCH"++else++ echo "[openvibe] no workflow/build changes to commit"++fi++++echo "[openvibe] triggering updated workflow"++gh workflow run "$WORKFLOW" --repo "$REPO" --ref "$BRANCH"++++echo "[openvibe] waiting for new workflow run to appear"++sleep 5++new_run="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId // empty')"++if [[ -z "$new_run" ]]; then++ echo "[openvibe error] could not find new workflow run" >&2++ exit 1++fi++++echo "[openvibe] watching run $new_run"++set +e++gh run watch "$new_run" --repo "$REPO" --exit-status++status=$?++set -e++++if [[ $status -eq 0 ]]; then++ echo "[openvibe] workflow passed; downloading artifacts"++else++ echo "[openvibe warn] workflow still failed; downloading diagnostics anyway"++fi++++tools/windows-workflow-debug-and-install.sh++++if [[ $status -ne 0 ]]; then++ echo++ echo "[openvibe] next: paste the tail printed above if you want me to patch the exact compile error."++ exit $status++finnew file mode 100755@@@ -0,0 +1,225 @@++#!/usr/bin/env bash++set -euo pipefail++++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++BRANCH="${OPENVIBE_BRANCH:-$(git -C "$ROOT" branch --show-current 2>/dev/null || true)}"++WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"++ARTIFACT_DIR="$ROOT/.tmp/windows-dll-artifacts"++MOD_BIN="$ROOT/game/openvibe.games/bin"++++cd "$ROOT"++++echo "[openvibe] next phase: finalize multiplatform support + trigger Windows DLL build"++echo "[openvibe] root=$ROOT"++echo "[openvibe] branch=${BRANCH:-unknown}"++++if [[ -z "${BRANCH:-}" ]]; then++ echo "Could not determine current git branch." >&2++ exit 1++fi++++echo++echo "[openvibe] current repo state:"++git status --short++++echo++echo "[openvibe] staging all intended platform/build helper changes"++++# Stage the files created/modified by the prior multiplatform/loading scripts.++# This intentionally avoids generated SDK engine outputs and binary DLL/SO artifacts.++paths=(++ ".github/workflows/windows-source-sdk-dlls.yml"++ "docs/BUILD_WINDOWS_DLLS_FROM_LINUX.md"++ "docs/MULTIPLATFORM_SOURCE_BUILDS.md"++ "launcher/main.js"++ "tools/add-multiplatform-sdk-support.sh"++ "tools/build-quickjs-lib-windows.ps1"++ "tools/build-sdk-all-local.sh"++ "tools/build-sdk-windows.ps1"++ "tools/build-windows-dlls-from-linux-workflow.sh"++ "tools/check-openvibe-platform-binaries.sh"++ "tools/fix-launch-loading-and-explain-clientdll.sh"++ "tools/fix-proton-loading-and-menu-fallback.sh"++ "tools/probe-local-windows-build-on-linux.sh"++ "tools/request-windows-dll-build.sh"++ "tools/run-client-auto.sh"++ "tools/run-client-linux.sh"++ "tools/run-client-proton.sh"++ "tools/run-client-windows.ps1"++ "tools/setup-openvibe-bin.sh"++ "tools/apply-openvibe-sdk.sh"++ "game/openvibe.games/cfg/openvibe_proton_client.cfg"++ "game/openvibe.games/resource/LoadingDialog.res"++ "game/openvibe.games/materialsrc/console/openvibe-loading.svg"++)++++for p in "${paths[@]}"; do++ if [[ -e "$p" ]]; then++ git add "$p"++ fi++done++++# Also stage removals among tracked files in those areas.++git add -u launcher tools docs .github game/openvibe.games/cfg game/openvibe.games/resource game/openvibe.games/materialsrc 2>/dev/null || true++++echo++echo "[openvibe] staged changes:"++git diff --cached --stat || true++++if git diff --cached --quiet; then++ echo "[openvibe] no staged changes to commit"++else++ msg="${OPENVIBE_COMMIT_MESSAGE:-Finalize multiplatform client runtime support}"++ echo "[openvibe] committing: $msg"++ git commit -m "$msg"++fi++++echo++echo "[openvibe] pushing branch $BRANCH"++git push origin "$BRANCH"++++echo++echo "[openvibe] local platform probe"++if [[ -x tools/probe-local-windows-build-on-linux.sh ]]; then++ tools/probe-local-windows-build-on-linux.sh || true++fi++++if [[ -x tools/check-openvibe-platform-binaries.sh ]]; then++ tools/check-openvibe-platform-binaries.sh || true++fi++++echo++echo "[openvibe] workflow trigger phase"++++if ! command -v gh >/dev/null 2>&1; then++ cat <<'MSG'++[openvibe] GitHub CLI 'gh' is not installed, so I cannot trigger/download the Windows build from here.++++Install/authenticate it, then run:++ sudo apt install gh++ gh auth login++ tools/request-windows-dll-build.sh++++Or open GitHub Actions manually and run:++ windows-source-sdk-dlls.yml++MSG++ exit 0++fi++++if ! gh auth status >/dev/null 2>&1; then++ cat <<'MSG'++[openvibe] gh exists but is not authenticated.++++Run:++ gh auth login++++Then rerun this script:++ tools/next-phase-platform-build-and-fetch.sh++MSG++ exit 0++fi++++if ! gh workflow view "$WORKFLOW" >/dev/null 2>&1; then++ cat <<MSG++[openvibe] workflow $WORKFLOW is not visible yet.++This can happen right after pushing a new workflow.++++Wait 30-60 seconds, then rerun:++ tools/next-phase-platform-build-and-fetch.sh++MSG++ exit 0++fi++++echo "[openvibe] triggering workflow $WORKFLOW on $BRANCH"++gh workflow run "$WORKFLOW" --ref "$BRANCH"++++echo "[openvibe] waiting for GitHub to create the workflow run"++sleep 10++++run_id=""++for _ in {1..18}; do++ run_id="$(gh run list \++ --workflow "$WORKFLOW" \++ --branch "$BRANCH" \++ --limit 1 \++ --json databaseId,status,conclusion,createdAt \++ --jq '.[0].databaseId // empty' 2>/dev/null || true)"++++ if [[ -n "$run_id" ]]; then++ break++ fi++++ sleep 5++done++++if [[ -z "$run_id" ]]; then++ echo "[openvibe] could not find workflow run id. Check manually:"++ echo " gh run list --workflow $WORKFLOW --branch $BRANCH"++ exit 1++fi++++echo "[openvibe] watching workflow run: $run_id"++if ! gh run watch "$run_id" --exit-status; then++ echo++ echo "[openvibe] Windows DLL workflow failed. Inspect with:"++ echo " gh run view $run_id --log-failed"++ exit 1++fi++++echo++echo "[openvibe] downloading artifacts from run $run_id"++rm -rf "$ARTIFACT_DIR"++mkdir -p "$ARTIFACT_DIR"++gh run download "$run_id" -D "$ARTIFACT_DIR"++++echo++echo "[openvibe] downloaded artifact tree:"++find "$ARTIFACT_DIR" -maxdepth 4 -type f | sort++++client_dll="$(find "$ARTIFACT_DIR" -type f -iname 'client.dll' | head -n 1 || true)"++server_dll="$(find "$ARTIFACT_DIR" -type f -iname 'server.dll' | head -n 1 || true)"++++if [[ -z "$client_dll" || -z "$server_dll" ]]; then++ echo++ echo "[openvibe] artifact did not contain both client.dll and server.dll."++ echo "Paste this output plus:"++ echo " gh run view $run_id --log"++ exit 1++fi++++mkdir -p "$MOD_BIN"++cp -f "$client_dll" "$MOD_BIN/client.dll"++cp -f "$server_dll" "$MOD_BIN/server.dll"++++echo++echo "[openvibe] installed Windows/Proton DLLs:"++ls -lh "$MOD_BIN/client.dll" "$MOD_BIN/server.dll"++++if command -v file >/dev/null 2>&1; then++ file "$MOD_BIN/client.dll" "$MOD_BIN/server.dll" || true++fi++++echo++if [[ -x tools/check-openvibe-platform-binaries.sh ]]; then++ tools/check-openvibe-platform-binaries.sh || true++fi++++cat <<'MSG'++++[openvibe] next runtime test:++++ OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015++++In the game console test:++++ ov_help++ ov_join hub++ ov_menu++ ov_menu_servers++++If those still say Unknown command, the DLL either failed to load or the artifact is not the patched OpenVibe client.dll.++Check Source console for client.dll load errors and run:++++ file game/openvibe.games/bin/client.dll++ strings game/openvibe.games/bin/client.dll | grep -E 'ov_join|ov_menu' | head++MSGnnew file mode 100755@@@ -0,0 +1,417 @@++#!/usr/bin/env bash++set -euo pipefail++++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++BRANCH="$(git -C "$ROOT" branch --show-current 2>/dev/null || true)"++: "${BRANCH:=codex/openvibe-next-steps}"++++say() { printf '\n\033[1;36m[openvibe]\033[0m %s\n' "$*"; }++warn() { printf '\n\033[1;33m[openvibe warn]\033[0m %s\n' "$*"; }++++cd "$ROOT"++++say "next phase: validate Proton DLL content + add build/fetch helper"++say "root=$ROOT"++say "branch=$BRANCH"++++mkdir -p tools docs game/openvibe.games/cfg++++cat > tools/verify-openvibe-dll-content.sh <<'VERIFY'++#!/usr/bin/env bash++set -euo pipefail++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++CLIENT="$ROOT/game/openvibe.games/bin/client.dll"++SERVER="$ROOT/game/openvibe.games/bin/server.dll"++++ok=0++fail=0++++line() { printf '%s\n' "--------------------------------------------------------------------------------"; }++check_file() {++ local label="$1" file="$2"; shift 2++ line++ echo "[$label] $file"++ if [[ ! -f "$file" ]]; then++ echo "[missing] $file"++ fail=$((fail+1))++ return++ fi++ file "$file" || true++ stat -c '[size] %s bytes' "$file" || true++ sha256sum "$file" | awk '{print "[sha256] "$1}' || true++++ local missing=0++ for needle in "$@"; do++ if strings -a "$file" | grep -Fq -- "$needle"; then++ echo "[ok] contains string: $needle"++ else++ echo "[miss] does not contain string: $needle"++ missing=1++ fi++ done++++ if [[ "$missing" -eq 0 ]]; then++ ok=$((ok+1))++ else++ fail=$((fail+1))++ fi++}++++check_file "Windows/Proton client.dll" "$CLIENT" \++ "ov_join" \++ "ov_auth_steam" \++ "ov_menu" \++ "OpenVibe"++++check_file "Windows/Proton server.dll" "$SERVER" \++ "ov_js_status" \++ "ov_js_cmd" \++ "OpenVibe"++++line++if [[ "$fail" -eq 0 ]]; then++ echo "[openvibe] DLL content check passed. Proton should load OpenVibe client/server commands if the mod path is correct."++ exit 0++fi++++cat <<'MSG'++[openvibe] DLL content check failed.++++Meaning:++ - client.dll/server.dll may exist, but they are probably old/stock/unpatched DLLs.++ - If the in-game console says Unknown command "ov_join" or "ov_menu", this is the first thing to fix.++++Fix:++ - Trigger the Windows GitHub Actions build, download its artifact, and install the resulting DLLs.++ - Run: tools/gh-windows-build-and-install.sh++MSG++exit 2++VERIFY++chmod +x tools/verify-openvibe-dll-content.sh++++cat > tools/collect-proton-openvibe-debug.sh <<'COLLECT'++#!/usr/bin/env bash++set -euo pipefail++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++MOD="$ROOT/game/openvibe.games"++STEAM_APP_ID="${SteamAppId:-243750}"++PATTERN='OpenVibe|ov_|client\.dll|server\.dll|GameDLL|ClientDLL|Unknown command|failed|Failed|unable|Unable|error|Error'++++printf '[openvibe] collecting Proton/Source debug hints\n'++printf 'root=%s\n' "$ROOT"++printf 'mod=%s\n\n' "$MOD"++++candidates=(++ "$MOD/console.log"++ "$MOD/openvibe_proton_console.log"++ "$ROOT/console.log"++ "$ROOT/openvibe_proton_console.log"++ "$HOME/steam-${STEAM_APP_ID}.log"++ "$HOME/steam-${STEAM_APP_ID}.log.last"++)++++found=0++for file in "${candidates[@]}"; do++ if [[ -f "$file" ]]; then++ found=1++ echo "--------------------------------------------------------------------------------"++ echo "[log] $file"++ echo "[tail] last matching lines"++ grep -Eia "$PATTERN" "$file" | tail -80 || true++ fi++done++++if [[ "$found" -eq 0 ]]; then++ cat <<MSG++No common logs found yet.++++Launch with Proton logging enabled:++ OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015++++Then run this again:++ tools/collect-proton-openvibe-debug.sh++MSG++fi++COLLECT++chmod +x tools/collect-proton-openvibe-debug.sh++++cat > tools/gh-windows-build-and-install.sh <<'GHDL'++#!/usr/bin/env bash++set -euo pipefail++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++cd "$ROOT"++++WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"++BRANCH="${OPENVIBE_BRANCH:-$(git branch --show-current)}"++ART_DIR="$ROOT/.tmp/windows-dll-artifact"++MOD_BIN="$ROOT/game/openvibe.games/bin"++++if ! command -v gh >/dev/null 2>&1; then++ cat <<MSG++[openvibe] gh is missing.++++Install/authenticate it:++ sudo apt update++ sudo apt install gh++ gh auth login++++Then rerun:++ tools/gh-windows-build-and-install.sh++++Manual fallback:++ Open GitHub Actions -> $WORKFLOW -> Run workflow -> branch $BRANCH++ Download the artifact, then copy client.dll/server.dll into:++ $MOD_BIN++MSG++ exit 127++fi++++if ! gh auth status >/dev/null 2>&1; then++ echo "[openvibe] gh is installed but not authenticated. Run: gh auth login" >&2++ exit 126++fi++++repo="$(gh repo view --json nameWithOwner -q .nameWithOwner)"++echo "[openvibe] repo=$repo"++echo "[openvibe] workflow=$WORKFLOW"++echo "[openvibe] branch=$BRANCH"++++git push origin "$BRANCH"++++echo "[openvibe] triggering Windows DLL workflow"++gh workflow run "$WORKFLOW" --ref "$BRANCH"++++echo "[openvibe] waiting for workflow run to appear"++run_id=""++for _ in {1..30}; do++ run_id="$(gh run list --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId,status -q '.[0].databaseId // empty' 2>/dev/null || true)"++ [[ -n "$run_id" ]] && break++ sleep 2++done++++if [[ -z "$run_id" ]]; then++ echo "[openvibe] could not find workflow run. Check GitHub Actions manually." >&2++ exit 1++fi++++echo "[openvibe] watching run $run_id"++gh run watch "$run_id" --exit-status++++rm -rf "$ART_DIR"++mkdir -p "$ART_DIR"++echo "[openvibe] downloading artifacts to $ART_DIR"++gh run download "$run_id" --dir "$ART_DIR"++++client="$(find "$ART_DIR" -iname 'client.dll' -type f | head -n 1 || true)"++server="$(find "$ART_DIR" -iname 'server.dll' -type f | head -n 1 || true)"++++if [[ -z "$client" || -z "$server" ]]; then++ echo "[openvibe] artifact did not contain client.dll and server.dll" >&2++ find "$ART_DIR" -maxdepth 5 -type f | sort >&2++ exit 1++fi++++mkdir -p "$MOD_BIN"++cp -f "$client" "$MOD_BIN/client.dll"++cp -f "$server" "$MOD_BIN/server.dll"++++echo "[openvibe] installed:"++ls -lh "$MOD_BIN/client.dll" "$MOD_BIN/server.dll"++++tools/verify-openvibe-dll-content.sh++++echo "[openvibe] done. Now test:"++echo " OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015"++echo "Then in the game console:"++echo " ov_join hub"++echo " ov_menu"++echo " ov_menu_servers"++GHDL++chmod +x tools/gh-windows-build-and-install.sh++++cat > game/openvibe.games/cfg/openvibe_proton_client.cfg <<'CFG'++echo "==== OpenVibe Proton fallback cfg loaded ===="++echo "This cfg only adds ovp_* fallback aliases. Real ov_join/ov_menu must come from client.dll."++echo "Try real commands first: ov_join hub ; ov_menu ; ov_menu_servers"++alias ovp_help "echo OpenVibe Proton fallback commands: ovp_join_hub ovp_join_prophunt ovp_join_deathrun ovp_join_fortwars ovp_join_traitortown"++alias ovp_join_hub "connect 127.0.0.1:27015"++alias ovp_join_prophunt "connect 127.0.0.1:27016"++alias ovp_join_deathrun "connect 127.0.0.1:27017"++alias ovp_join_fortwars "connect 127.0.0.1:27018"++alias ovp_join_traitortown "connect 127.0.0.1:27019"++CFG++++cat > docs/PROTON_CLIENT_DLL_DEBUG.md <<'DOC'++# Proton client DLL debug path++++Proton runs the Windows `hl2.exe`, so it loads:++++```text++game/openvibe.games/bin/client.dll++game/openvibe.games/bin/server.dll++```++++It cannot load the Linux modules:++++```text++game/openvibe.games/bin/linux64/client.so++game/openvibe.games/bin/linux64/server.so++```++++If the in-game console says `Unknown command "ov_join"` or `Unknown command "ov_menu"`, then one of these is true:++++1. `client.dll` is missing.++2. `client.dll` is stock/old and does not contain the OpenVibe commands.++3. The mod path is wrong and `hl2.exe` is not loading `game/openvibe.games`.++4. The DLL failed during load.++++Useful commands:++++```bash++tools/verify-openvibe-dll-content.sh++OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015++tools/collect-proton-openvibe-debug.sh++```++++Safe fallback aliases are prefixed with `ovp_` so they do not mask real client DLL commands:++++```text++ovp_help++ovp_join_hub++ovp_join_prophunt++ovp_join_deathrun++ovp_join_fortwars++ovp_join_traitortown++```++DOC++++# Rewrite run-client-proton.sh with better DLL-aware diagnostics and logging.++cat > tools/run-client-proton.sh <<'PROTON'++#!/bin/bash++# OpenVibe: Source - Game Client Launcher via GE-Proton10-34++set -euo pipefail++++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"++STEAM_PATH="${OPENVIBE_STEAM_PATH:-/mnt/6tb/ssd_offload/home/workstation/.steam/debian-installation}"++GE_PROTON="${OPENVIBE_GE_PROTON:-$STEAM_PATH/compatibilitytools.d/GE-Proton10-34}"++STEAM_COMPAT_DATA="${OPENVIBE_STEAM_COMPAT_DATA:-$STEAM_PATH/steamapps/compatdata/243750}"++HL2_EXE="${OPENVIBE_HL2_EXE:-/mnt/data-f/SteamLibrary/steamapps/common/Source SDK Base 2013 Multiplayer/hl2.exe}"++GAME_DIR="${OPENVIBE_GAME_DIR:-$ROOT/game/openvibe.games}"++CLIENT_DLL="$GAME_DIR/bin/client.dll"++SERVER_DLL="$GAME_DIR/bin/server.dll"++++if [ ! -f "$HL2_EXE" ]; then++ echo "ERROR: hl2.exe not found at $HL2_EXE" >&2++ exit 1++fi++++if [ ! -d "$GE_PROTON" ]; then++ echo "ERROR: GE-Proton not found at $GE_PROTON" >&2++ exit 1++fi++++CONNECT_ARGS=""++if [ "${1:-}" != "" ] && [ "${2:-}" != "" ]; then++ CONNECT_ARGS="+connect $1:$2"++fi++++echo "Launching OpenVibe: Source via Proton..."++echo " Game: $GAME_DIR"++echo " Proton: $GE_PROTON"++echo " HL2: $HL2_EXE"++[ -n "$CONNECT_ARGS" ] && echo " Connect: $CONNECT_ARGS"++++if [ -f "$CLIENT_DLL" ] && command -v strings >/dev/null 2>&1 && strings -a "$CLIENT_DLL" | grep -Fq "ov_join"; then++ echo " Client DLL: patched OpenVibe client.dll detected"++elif [ -f "$CLIENT_DLL" ]; then++ echo " WARNING: client.dll exists, but ov_join string was not found. It may be stock/old." >&2++else++ echo " WARNING: client.dll missing. Proton will not have OpenVibe client commands." >&2++fi++++if [ ! -f "$SERVER_DLL" ]; then++ echo " WARNING: server.dll missing for Windows listen/server use." >&2++fi++++mkdir -p "$STEAM_COMPAT_DATA"++++export DISPLAY="${DISPLAY:-:0}"++export STEAM_COMPAT_CLIENT_INSTALL_PATH="$STEAM_PATH"++export STEAM_COMPAT_DATA_PATH="$STEAM_COMPAT_DATA"++export SteamAppId="${SteamAppId:-243750}"++export PROTON_LOG="${OPENVIBE_PROTON_LOG:-${PROTON_LOG:-1}}"++export DXVK_ASYNC="${DXVK_ASYNC:-1}"++++exec "$GE_PROTON/proton" waitforexitandrun \++ "$HL2_EXE" \++ -game "$GAME_DIR" \++ -console -dev -condebug -novid -sw -w 1280 -h 720 \++ -port 27115 -clientport 27105 \++ +developer 1 \++ +con_logfile openvibe_proton_console.log \++ +exec openvibe_proton_client.cfg \++ $CONNECT_ARGS++PROTON++chmod +x tools/run-client-proton.sh++++# Improve platform checker if present by appending a DLL content reminder safely.++if [[ -f tools/check-openvibe-platform-binaries.sh ]] && ! grep -Fq "verify-openvibe-dll-content" tools/check-openvibe-platform-binaries.sh; then++ cat >> tools/check-openvibe-platform-binaries.sh <<'EXTRA'++++echo++echo "[openvibe] Deep DLL content check:"++if [[ -x "${OPENVIBE_ROOT:-$HOME/src/openvibe-source}/tools/verify-openvibe-dll-content.sh" ]]; then++ "${OPENVIBE_ROOT:-$HOME/src/openvibe-source}/tools/verify-openvibe-dll-content.sh" || true++else++ echo "tools/verify-openvibe-dll-content.sh missing"++fi++EXTRA++fi++++say "running DLL content validation now"++if tools/verify-openvibe-dll-content.sh; then++ say "existing DLLs look patched"++else++ warn "existing DLLs do not look patched; trigger/download fresh Windows DLLs next"++fi++++say "git status"++git status --short++++say "stage/commit/push helper changes"++git add tools/verify-openvibe-dll-content.sh \++ tools/collect-proton-openvibe-debug.sh \++ tools/gh-windows-build-and-install.sh \++ tools/run-client-proton.sh \++ tools/check-openvibe-platform-binaries.sh \++ game/openvibe.games/cfg/openvibe_proton_client.cfg \++ docs/PROTON_CLIENT_DLL_DEBUG.md++++if git diff --cached --quiet; then++ say "no helper changes to commit"++else++ git commit -m "Add Proton DLL validation and artifact install helpers"++ git push origin "$BRANCH"++fi++++say "next actions"++cat <<NEXT++1. Install/auth gh if missing:++ sudo apt update && sudo apt install gh++ gh auth login++++2. Trigger/download/install patched Windows DLLs:++ tools/gh-windows-build-and-install.sh++++3. Launch Proton with logs:++ OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015++++4. In game console, test real client DLL commands:++ ov_join hub++ ov_menu++ ov_menu_servers++++5. If commands are still unknown:++ tools/verify-openvibe-dll-content.sh++ tools/collect-proton-openvibe-debug.sh++NEXT
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+[openvibe-win] root=D:\a\OpenVibe.Games\OpenVibe.Games
+[openvibe-win] sdk=D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013
+[openvibe-win] src=D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013\src
+Source SDK checkout is missing from this runner. The workflow must have engine/source-sdk-2013 available in the
+repository/submodule before Windows DLLs can build.
+Missing: D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013\src
+At D:\a\OpenVibe.Games\OpenVibe.Games\tools\build-sdk-windows.ps1:14 char:26
++ if (!(Test-Path $p)) { throw "$msg`nMissing: $p" }
++ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ + CategoryInfo : OperationStopped: (Source SDK chec...ce-sdk-2013\src:String) [], RuntimeException
+ + FullyQualifiedErrorId : Source SDK checkout is missing from this runner. The workflow must have engine/source-sd
+ k-2013 available in the repository/submodule before Windows DLLs can build.
+Missing: D:\a\OpenVibe.Games\OpenVibe.Games\engine\source-sdk-2013\src
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+=== dll search ===
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\client.dll
+Length : 5591976
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\server.dll
+Length : 7183272
+LastWriteTime : 6/29/2026 4:39:51 AM
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,198 @@
@@ -0,0 +1,198 @@
+=== vc/sln search ===
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\build-sdk-windows.log
+Length : 1032
+LastWriteTime : 6/29/2026 4:40:01 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628000.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628001.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628002.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628003.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628004.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628005.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628006.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628007.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628008.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628009.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628010.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628011.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628012.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628013.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628014.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628015.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628016.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628017.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628018.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628019.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628020.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628021.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628022.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628023.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628024.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628025.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628026.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628027.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628028.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628029.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628030.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628031.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628032.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628033.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628034.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628035.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628036.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628037.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628038.log
+Length : 596
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628039.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628040.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628041.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628042.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628043.log
+Length : 538
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628044.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628045.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628046.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628047.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:39:51 AM
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
+=== repo ===
+
+ Directory: D:\a\OpenVibe.Games\OpenVibe.Games
+
+Mode LastWriteTime Length Name
+---- ------------- ------ ----
+d--h- 6/29/2026 4:39 AM .git
+d---- 6/29/2026 4:39 AM .github
+d---- 6/29/2026 4:39 AM .tmp
+d---- 6/29/2026 4:40 AM artifacts
+d---- 6/29/2026 4:39 AM backend
+d---- 6/29/2026 4:39 AM docs
+d---- 6/29/2026 4:39 AM engine
+d---- 6/29/2026 4:39 AM game
+d---- 6/29/2026 4:39 AM hammer
+d---- 6/29/2026 4:39 AM infra
+d---- 6/29/2026 4:39 AM launcher
+d---- 6/29/2026 4:39 AM sdk
+d---- 6/29/2026 4:39 AM servers
+d---- 6/29/2026 4:39 AM tools
+-a--- 6/29/2026 4:39 AM 983 .gitignore
+-a--- 6/29/2026 4:39 AM 3758 DEPLOYMENT_STATUS.md
+-a--- 6/29/2026 4:39 AM 1099 LICENSE
+-a--- 6/29/2026 4:39 AM 12759 LINUX_SETUP.md
+-a--- 6/29/2026 4:39 AM 4075 PROJECT_INDEX.md
+-a--- 6/29/2026 4:39 AM 3826 QUICK_REFERENCE.md
+-a--- 6/29/2026 4:39 AM 8794 README.md
+
new file mode 100644
new file mode 100644
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/client.dll differ
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/client.dll differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/server.dll differ
Binary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/server.dll differ
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/file-list.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/full-run.log
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/dll-search.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/engine-before-build.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/no-patched-dlls.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/project-search.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/repo-root-before-build.txt
+/home/workstation/src/openvibe-source/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/tree.txt
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+[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] cloning ValveSoftware/source-sdk-2013
+git : Cloning into 'D:\a\OpenVibe.Games\OpenVibe.Games\_deps\source-sdk-2013'...
+At D:\a\OpenVibe.Games\OpenVibe.Games\tools\bootstrap-source-sdk-2013-windows.ps1:26 char:3
++ git clone --depth 1 https://github.com/ValveSoftware/source-sdk-201 ...
++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ + CategoryInfo : NotSpecified: (Cloning into 'D...ce-sdk-2013'...:String) [], RemoteException
+ + FullyQualifiedErrorId : NativeCommandError
+
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+=== dll search ===
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\client.dll
+Length : 5591976
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\bin\server.dll
+Length : 7183272
+LastWriteTime : 6/29/2026 4:43:22 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,198 @@
@@ -0,0 +1,198 @@
+=== project/log search ===
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\artifacts\windows-build-debug\bootstrap-source-sdk-2013.log
+Length : 704
+LastWriteTime : 6/29/2026 4:43:59 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628000.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628001.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628002.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628003.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628004.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628005.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628006.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628007.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628008.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628009.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628010.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628011.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628012.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628013.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628014.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628015.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628016.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628017.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628018.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628019.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628020.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628021.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628022.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628023.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628024.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628025.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628026.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628027.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628028.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628029.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628030.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628031.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628032.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628033.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628034.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628035.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628036.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628037.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628038.log
+Length : 596
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628039.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628040.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628041.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628042.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628043.log
+Length : 538
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628044.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628045.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628046.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 AM
+
+FullName : D:\a\OpenVibe.Games\OpenVibe.Games\game\openvibe.games\logs\l0628047.log
+Length : 4175
+LastWriteTime : 6/29/2026 4:43:22 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:43 AM _deps
+d--h- 6/29/2026 4:43 AM .git
+d---- 6/29/2026 4:43 AM .github
+d---- 6/29/2026 4:43 AM .tmp
+d---- 6/29/2026 4:44 AM artifacts
+d---- 6/29/2026 4:43 AM backend
+d---- 6/29/2026 4:43 AM docs
+d---- 6/29/2026 4:43 AM engine
+d---- 6/29/2026 4:43 AM game
+d---- 6/29/2026 4:43 AM hammer
+d---- 6/29/2026 4:43 AM infra
+d---- 6/29/2026 4:43 AM launcher
+d---- 6/29/2026 4:43 AM sdk
+d---- 6/29/2026 4:43 AM servers
+d---- 6/29/2026 4:43 AM tools
+-a--- 6/29/2026 4:43 AM 983 .gitignore
+-a--- 6/29/2026 4:43 AM 3758 DEPLOYMENT_STATUS.md
+-a--- 6/29/2026 4:43 AM 1099 LICENSE
+-a--- 6/29/2026 4:43 AM 12759 LINUX_SETUP.md
+-a--- 6/29/2026 4:43 AM 4075 PROJECT_INDEX.md
+-a--- 6/29/2026 4:43 AM 3826 QUICK_REFERENCE.md
+-a--- 6/29/2026 4:43 AM 8794 README.md
+
new file mode 100755
new file mode 100755
@@ -0,0 +1,520 @@
@@ -0,0 +1,520 @@
+#!/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:-OpenVibers/OpenVibe.Games}"
+WORKFLOW="windows-source-sdk-dlls.yml"
+
+echo "[openvibe] fix Windows SDK bootstrap + real DLL artifact validation"
+echo "[openvibe] root=$ROOT"
+echo "[openvibe] branch=$BRANCH"
+echo "[openvibe] repo=$REPO"
+
+mkdir -p tools .github/workflows docs
+
+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'
+$ValveRepo = Join-Path $Deps 'source-sdk-2013'
+$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" }
+
+Say "root=$Root"
+Say "sdk=$Sdk"
+
+if ((Test-Path (Join-Path $Src 'game/client/hl2mp')) -and (Test-Path (Join-Path $Src 'game/server/hl2mp'))) {
+ Say "existing SDK tree looks usable"
+ exit 0
+}
+
+New-Item -ItemType Directory -Force -Path $Deps | Out-Null
+
+if (!(Test-Path (Join-Path $ValveRepo '.git'))) {
+ Say "cloning ValveSoftware/source-sdk-2013"
+ if (Test-Path $ValveRepo) { Remove-Item -Recurse -Force $ValveRepo }
+ git clone --depth 1 https://github.com/ValveSoftware/source-sdk-2013.git $ValveRepo 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-clone.log')
+} else {
+ Say "updating cached Valve source-sdk-2013"
+ Push-Location $ValveRepo
+ git fetch --depth 1 origin 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-fetch.log')
+ git reset --hard origin/master 2>&1 | Tee-Object -FilePath (Join-Path $LogDir 'bootstrap-git-reset.log')
+ Pop-Location
+}
+
+$Mp = Join-Path $ValveRepo 'mp'
+if (!(Test-Path (Join-Path $Mp 'src'))) {
+ Get-ChildItem -Force $ValveRepo | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir 'valve-repo-root.txt')
+ throw "Valve source-sdk-2013 clone does not contain mp/src at $Mp/src"
+}
+
+Say "copying mp branch 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 $Mp '*') -Destination $Sdk -Recurse -Force
+
+if (!(Test-Path (Join-Path $Src 'game/client/hl2mp')) -or !(Test-Path (Join-Path $Src 'game/server/hl2mp'))) {
+ 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"
+}
+
+Say "SDK bootstrapped successfully"
+PS1
+
+cat > tools/build-sdk-windows.ps1 <<'PS1'
+param(
+ [switch]$InDevShell
+)
+
+$ErrorActionPreference = "Stop"
+
+$Root = (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"
+$Mod = Join-Path $Root "game/openvibe.games"
+$OutBin = Join-Path $Mod "bin"
+$LogDir = Join-Path $Root "artifacts/windows-build-debug"
+New-Item -ItemType Directory -Force -Path $LogDir | Out-Null
+
+function Say($m) { Write-Host "[openvibe-win] $m" }
+function Require($p, $msg) { if (!(Test-Path $p)) { throw "$msg`nMissing: $p" } }
+
+function Enter-MsvcDevShellIfNeeded {
+ if (Get-Command cl.exe -ErrorAction SilentlyContinue) {
+ Say "cl.exe already available"
+ return
+ }
+ if ($InDevShell) { throw "cl.exe still not found after entering MSVC dev shell" }
+
+ $vswhere = Join-Path ${env:ProgramFiles(x86)} "Microsoft Visual Studio/Installer/vswhere.exe"
+ if (!(Test-Path $vswhere)) { throw "vswhere.exe not found; Visual Studio Build Tools are not installed" }
+
+ $install = & $vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
+ if (!$install) { throw "Could not find Visual Studio installation with VC x86/x64 tools" }
+
+ $vcvars = Join-Path $install "VC/Auxiliary/Build/vcvars32.bat"
+ if (!(Test-Path $vcvars)) { throw "vcvars32.bat not found at $vcvars" }
+
+ Say "relaunching through MSVC x86 dev shell: $vcvars"
+ $self = $PSCommandPath
+ $cmd = "call `"$vcvars`" && powershell -NoProfile -ExecutionPolicy Bypass -File `"$self`" -InDevShell"
+ & cmd.exe /d /s /c $cmd
+ exit $LASTEXITCODE
+}
+
+Say "root=$Root"
+Say "sdk=$Sdk"
+Say "src=$Src"
+
+$env:OPENVIBE_ROOT = $Root
+$env:OPENVIBE_SDK = $Sdk
+
+if (!(Test-Path $Src)) {
+ Say "SDK src missing; bootstrapping Source SDK 2013 MP"
+ & powershell -NoProfile -ExecutionPolicy Bypass -File (Join-Path $Root "tools/bootstrap-source-sdk-2013-windows.ps1")
+ if ($LASTEXITCODE -ne 0) { throw "bootstrap-source-sdk-2013-windows.ps1 failed with exit code $LASTEXITCODE" }
+}
+
+Require $Src "Source SDK checkout is missing from this runner."
+Require (Join-Path $Src "game/client/hl2mp") "Source SDK HL2MP client tree missing."
+Require (Join-Path $Src "game/server/hl2mp") "Source SDK HL2MP server tree missing."
+
+Enter-MsvcDevShellIfNeeded
+
+# Do not let old/stock repo DLLs get mistaken for a successful new build.
+New-Item -ItemType Directory -Force -Path $OutBin | Out-Null
+Remove-Item (Join-Path $OutBin "client.dll") -Force -ErrorAction SilentlyContinue
+Remove-Item (Join-Path $OutBin "server.dll") -Force -ErrorAction SilentlyContinue
+Remove-Item -Recurse -Force (Join-Path $Sdk "game/mod_hl2mp/bin") -ErrorAction SilentlyContinue
+
+# Apply OpenVibe source files using Git Bash. Skip the Linux QuickJS build inside apply-openvibe-sdk.sh.
+$bash = (Get-Command bash -ErrorAction SilentlyContinue)
+if ($bash) {
+ Say "applying OpenVibe SDK patch through bash"
+ $env:OPENVIBE_SKIP_QJS_BUILD = "1"
+ & bash "$Root/tools/apply-openvibe-sdk.sh" 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "apply-openvibe-sdk.log")
+ if ($LASTEXITCODE -ne 0) { throw "apply-openvibe-sdk.sh failed with exit code $LASTEXITCODE" }
+} else {
+ throw "Git Bash is required on the Windows runner to apply the OpenVibe SDK patch."
+}
+
+Say "building QuickJS Windows static library"
+& powershell -NoProfile -ExecutionPolicy Bypass -File (Join-Path $Root "tools/build-quickjs-lib-windows.ps1") 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "quickjs-windows.log")
+if ($LASTEXITCODE -ne 0) { throw "build-quickjs-lib-windows.ps1 failed with exit code $LASTEXITCODE" }
+
+Set-Location $Src
+
+# Generate Visual Studio project files if needed.
+$solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)
+if ($solutions.Count -eq 0) {
+ Say "no .sln files found; trying Source SDK project generators"
+ $generators = @(
+ (Join-Path $Src "creategameprojects.bat"),
+ (Join-Path $Src "createallprojects.bat"),
+ (Join-Path $Src "createprojects.bat")
+ )
+ $ran = $false
+ foreach ($gen in $generators) {
+ if (Test-Path $gen) {
+ Say "running $gen"
+ & cmd /d /s /c "`"$gen`"" 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "project-generation.log")
+ $ran = $true
+ break
+ }
+ }
+
+ if (-not $ran) {
+ $vpc = Join-Path $Src "devtools/bin/vpc.exe"
+ if (Test-Path $vpc) {
+ Say "running vpc.exe fallback"
+ & $vpc /hl2mp +game /mksln OpenVibe_HL2MP.sln 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "vpc.log")
+ $ran = $true
+ }
+ }
+
+ $solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)
+ if ($solutions.Count -eq 0) {
+ Get-ChildItem -Path $Src -Force | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir "src-root-after-generator.txt")
+ throw "No Visual Studio solution was generated. Check openvibe-windows-build-debug artifact."
+ }
+}
+
+Say "solutions found:"
+$solutions | ForEach-Object { Say " $($_.FullName)" }
+
+$solution = $solutions |
+ Where-Object { $_.Name -match "hl2mp|game|sdk|everything|OpenVibe" } |
+ Select-Object -First 1
+if (-not $solution) { $solution = $solutions | Select-Object -First 1 }
+Say "selected solution=$($solution.FullName)"
+
+$configs = @("Release", "Release_HL2MP", "Release HL2MP")
+$platforms = @("Win32", "x86")
+$targets = @("client_hl2mp", "server_hl2mp", "client", "server", "Build")
+
+$builtAny = $false
+foreach ($cfg in $configs) {
+ foreach ($plat in $platforms) {
+ foreach ($target in $targets) {
+ Say "msbuild cfg=$cfg platform=$plat target=$target"
+ $log = Join-Path $LogDir "msbuild-$($cfg -replace '[^A-Za-z0-9]','_')-$plat-$target.log"
+ & msbuild $solution.FullName /m /p:Configuration=$cfg /p:Platform=$plat /p:PlatformToolset=v143 /t:$target /v:minimal /nologo 2>&1 | Tee-Object -FilePath $log
+ if ($LASTEXITCODE -eq 0) { $builtAny = $true; break }
+ }
+ if ($builtAny) { break }
+ }
+ if ($builtAny) { break }
+}
+
+if (-not $builtAny) { throw "MSBuild could not build any known Source SDK HL2MP target. Check uploaded msbuild logs." }
+
+New-Item -ItemType Directory -Force -Path $OutBin | Out-Null
+
+$client = Get-ChildItem -Path $Sdk -Recurse -Filter client.dll -ErrorAction SilentlyContinue |
+ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|client" } |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+$server = Get-ChildItem -Path $Sdk -Recurse -Filter server.dll -ErrorAction SilentlyContinue |
+ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|server" } |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+
+if (-not $client) { throw "client.dll was not produced" }
+if (-not $server) { throw "server.dll was not produced" }
+
+Say "copy client=$($client.FullName)"
+Say "copy server=$($server.FullName)"
+Copy-Item $client.FullName (Join-Path $OutBin "client.dll") -Force
+Copy-Item $server.FullName (Join-Path $OutBin "server.dll") -Force
+
+$clientText = & strings.exe (Join-Path $OutBin "client.dll") 2>$null | Select-String -Pattern "ov_join|ov_menu|OpenVibe" -Quiet
+if (-not $clientText) { throw "Built client.dll does not contain OpenVibe strings; refusing to publish stale/stock DLL" }
+
+Say "done"
+PS1
+
+python3 - <<'PY'
+from pathlib import Path
+p = Path('tools/apply-openvibe-sdk.sh')
+s = p.read_text()
+old = '''copy_tree() {\n local src="$1"\n local dst="$2"\n mkdir -p "$dst"\n rsync -a --delete "$src/" "$dst/"\n echo "[openvibe-sdk] copied tree ${dst#$SDK/}"\n}\n'''
+new = '''copy_tree() {\n local src="$1"\n local dst="$2"\n mkdir -p "$dst"\n if command -v rsync >/dev/null 2>&1; then\n rsync -a --delete "$src/" "$dst/"\n else\n rm -rf "$dst"\n mkdir -p "$dst"\n cp -R "$src"/. "$dst"/\n fi\n echo "[openvibe-sdk] copied tree ${dst#$SDK/}"\n}\n'''
+if old not in s:
+ raise SystemExit('Could not patch copy_tree() in tools/apply-openvibe-sdk.sh')
+p.write_text(s.replace(old, new))
+PY
+
+cat > .github/workflows/windows-source-sdk-dlls.yml <<'YAML'
+name: Build Windows Source DLLs
+
+on:
+ workflow_dispatch:
+ inputs:
+ diagnostics:
+ description: "Upload verbose build diagnostics"
+ required: false
+ default: "1"
+ push:
+ branches:
+ - codex/openvibe-next-steps
+ paths:
+ - ".github/workflows/windows-source-sdk-dlls.yml"
+ - "tools/bootstrap-source-sdk-2013-windows.ps1"
+ - "tools/build-sdk-windows.ps1"
+ - "tools/build-quickjs-lib-windows.ps1"
+ - "tools/apply-openvibe-sdk.sh"
+ - "sdk/openvibe/**"
+ - "game/openvibe.games/js/**"
+
+permissions:
+ contents: read
+ actions: read
+
+jobs:
+ windows-dlls:
+ name: Windows client.dll/server.dll
+ runs-on: windows-2022
+ defaults:
+ run:
+ shell: pwsh
+
+ steps:
+ - name: Checkout OpenVibe
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 1
+
+ - name: Configure git line endings
+ run: |
+ git config --global core.autocrlf false
+ git config --global core.eol lf
+ git status --short
+
+ - name: Setup MSBuild
+ uses: microsoft/setup-msbuild@v2
+
+ - name: Show toolchain and tree
+ run: |
+ $ErrorActionPreference = 'Continue'
+ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null
+ Write-Host "pwd=$(Get-Location)"
+ git rev-parse --short HEAD
+ where.exe msbuild
+ where.exe cl
+ where.exe link
+ where.exe bash
+ where.exe git
+ Get-ChildItem -Force | Select-Object Mode,Length,Name | Tee-Object -FilePath artifacts/windows-build-debug/repo-root-before-build.txt
+ if (Test-Path engine) { Get-ChildItem -Force engine | Select-Object Mode,Length,Name | Tee-Object -FilePath artifacts/windows-build-debug/engine-before-build.txt } else { Write-Host "[miss] engine directory" }
+
+ - name: Bootstrap Source SDK 2013 MP
+ run: |
+ $ErrorActionPreference = 'Stop'
+ 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
+
+ - name: Build Windows Source SDK DLLs
+ id: build
+ run: |
+ $ErrorActionPreference = 'Stop'
+ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null
+ powershell -NoProfile -ExecutionPolicy Bypass -File tools/build-sdk-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/build-sdk-windows.log
+
+ - name: Stage build outputs and diagnostics
+ if: always()
+ run: |
+ $ErrorActionPreference = 'Continue'
+ New-Item -ItemType Directory -Force -Path artifacts/windows-dlls | Out-Null
+ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null
+
+ "=== repo ===" | Out-File artifacts/windows-build-debug/tree.txt
+ Get-ChildItem -Force | Format-Table -AutoSize | Out-File artifacts/windows-build-debug/tree.txt -Append
+ "=== dll search ===" | Out-File artifacts/windows-build-debug/dll-search.txt
+ Get-ChildItem -Recurse -Force -Include client.dll,server.dll -ErrorAction SilentlyContinue |
+ Select-Object FullName,Length,LastWriteTime |
+ Format-List | Out-File artifacts/windows-build-debug/dll-search.txt -Append
+ "=== project/log search ===" | Out-File artifacts/windows-build-debug/project-search.txt
+ Get-ChildItem -Recurse -Force -Include *.sln,*.vcxproj,*.vcproj,*.log -ErrorAction SilentlyContinue |
+ Select-Object FullName,Length,LastWriteTime |
+ Format-List | Out-File artifacts/windows-build-debug/project-search.txt -Append
+
+ $client = "game/openvibe.games/bin/client.dll"
+ $server = "game/openvibe.games/bin/server.dll"
+ $clientOk = $false
+ if (Test-Path $client) {
+ $text = strings.exe $client 2>$null | Select-String -Pattern "ov_join|ov_menu|OpenVibe" -Quiet
+ if ($text) { $clientOk = $true }
+ }
+ if ($clientOk -and (Test-Path $server)) {
+ Copy-Item $client artifacts/windows-dlls/client.dll -Force
+ Copy-Item $server artifacts/windows-dlls/server.dll -Force
+ Write-Host "[ok] staged patched OpenVibe Windows DLLs"
+ } else {
+ Write-Host "[miss] not staging DLLs because patched OpenVibe client.dll was not produced"
+ "No patched OpenVibe DLLs staged. Check build logs." | Out-File artifacts/windows-build-debug/no-patched-dlls.txt
+ }
+
+ - name: Upload Windows DLL artifact
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: openvibe-windows-dlls
+ path: artifacts/windows-dlls/**
+ if-no-files-found: warn
+
+ - name: Upload Windows build diagnostics
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: openvibe-windows-build-debug
+ path: artifacts/windows-build-debug/**
+ if-no-files-found: warn
+YAML
+
+cat > tools/windows-workflow-debug-and-install.sh <<'BASH2'
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+cd "$ROOT"
+REPO="${OPENVIBE_GITHUB_REPO:-OpenVibers/OpenVibe.Games}"
+WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"
+RUN_ID="${1:-}"
+
+if ! command -v gh >/dev/null 2>&1; then
+ echo "[openvibe] missing gh. Install with: sudo apt install gh" >&2
+ exit 1
+fi
+
+if [[ -z "$RUN_ID" ]]; then
+ RUN_ID="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$(git rev-parse --abbrev-ref HEAD)" --limit 1 --json databaseId --jq '.[0].databaseId')"
+fi
+
+OUT="$ROOT/artifacts/windows-workflow-debug/run-$RUN_ID-artifacts"
+rm -rf "$OUT"
+mkdir -p "$OUT"
+
+echo "[openvibe] run=$RUN_ID"
+echo "[openvibe] downloading logs/artifacts into $OUT"
+
+gh run view "$RUN_ID" --repo "$REPO" --log > "$OUT/full-run.log" || true
+gh run download "$RUN_ID" --repo "$REPO" --dir "$OUT" || true
+
+find "$OUT" -maxdepth 3 -type f | sort > "$OUT/file-list.txt"
+
+echo
+echo "[openvibe] likely errors:"
+grep -RniE "error MSB|fatal error|undefined reference|unresolved external|LNK[0-9]+|C[0-9]{4}:|throw |Missing:|not found|could not|failed|No Visual Studio solution|No patched" "$OUT" | tail -n 120 || true
+
+echo
+echo "[openvibe] artifact files:"
+sed -n '1,160p' "$OUT/file-list.txt"
+
+DLLDIR="$OUT/openvibe-windows-dlls"
+if [[ -f "$DLLDIR/client.dll" && -f "$DLLDIR/server.dll" ]]; then
+ if strings "$DLLDIR/client.dll" | grep -Eq 'ov_join|ov_menu|OpenVibe'; then
+ mkdir -p game/openvibe.games/bin
+ cp -f "$DLLDIR/client.dll" game/openvibe.games/bin/client.dll
+ cp -f "$DLLDIR/server.dll" game/openvibe.games/bin/server.dll
+ echo "[openvibe] installed patched Windows DLLs"
+ tools/verify-openvibe-dll-content.sh || true
+ else
+ echo "[openvibe] refused to install DLL artifact because client.dll lacks OpenVibe strings" >&2
+ exit 2
+ fi
+else
+ echo "[openvibe] no DLL artifact available yet" >&2
+ exit 3
+fi
+BASH2
+chmod +x tools/windows-workflow-debug-and-install.sh
+
+cat > docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md <<'MD'
+# Windows DLL workflow bootstrap
+
+The Windows GitHub Actions runner does not have the local `engine/source-sdk-2013` checkout that exists on the Linux workstation.
+
+The workflow now bootstraps Valve's Source SDK 2013 multiplayer tree into:
+
+```text
+engine/source-sdk-2013
+```
+
+Then it applies the OpenVibe SDK patch, skips the Linux QuickJS static-library build, builds QuickJS with MSVC, generates Visual Studio projects, builds `client.dll/server.dll`, and only uploads DLLs when `client.dll` contains OpenVibe command strings such as `ov_join`, `ov_menu`, or `OpenVibe`.
+
+Use:
+
+```bash
+tools/gh-windows-build-and-install.sh
+```
+
+or debug the latest run with:
+
+```bash
+tools/windows-workflow-debug-and-install.sh
+```
+MD
+
+# Keep gh helper stricter if present: do not install stale DLLs.
+if [[ -f tools/gh-windows-build-and-install.sh ]]; then
+python3 - <<'PY'
+from pathlib import Path
+p = Path('tools/gh-windows-build-and-install.sh')
+s = p.read_text()
+if 'strings "$ARTDIR/openvibe-windows-dlls/client.dll"' not in s and 'refused to install DLL artifact' not in s:
+ marker = 'if [[ -f "$ARTDIR/openvibe-windows-dlls/client.dll" && -f "$ARTDIR/openvibe-windows-dlls/server.dll" ]]; then'
+ if marker in s:
+ repl = marker + '''
+ if ! strings "$ARTDIR/openvibe-windows-dlls/client.dll" | grep -Eq 'ov_join|ov_menu|OpenVibe'; then
+ echo "[openvibe] refused to install DLL artifact because client.dll lacks OpenVibe strings" >&2
+ tools/windows-workflow-debug-and-install.sh "$RUN_ID" || true
+ exit 2
+ fi'''
+ s = s.replace(marker, repl)
+ p.write_text(s)
+PY
+fi
+
+# Commit/push and run workflow if gh is available.
+echo
+echo "[openvibe] git diff summary"
+git diff --stat
+
+git add \
+ .github/workflows/windows-source-sdk-dlls.yml \
+ tools/bootstrap-source-sdk-2013-windows.ps1 \
+ tools/build-sdk-windows.ps1 \
+ tools/apply-openvibe-sdk.sh \
+ tools/windows-workflow-debug-and-install.sh \
+ tools/gh-windows-build-and-install.sh \
+ docs/WINDOWS_WORKFLOW_SDK_BOOTSTRAP.md 2>/dev/null || true
+
+if ! git diff --cached --quiet; then
+ git commit -m "Bootstrap Source SDK for Windows DLL workflow"
+ git push origin "$BRANCH"
+else
+ echo "[openvibe] no changes to commit"
+fi
+
+if command -v gh >/dev/null 2>&1; then
+ echo "[openvibe] triggering workflow"
+ gh workflow run "$WORKFLOW" --repo "$REPO" --ref "$BRANCH" -f diagnostics=1
+ sleep 6
+ RUN_ID="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId')"
+ echo "[openvibe] watching run $RUN_ID"
+ gh run watch "$RUN_ID" --repo "$REPO" || true
+ tools/windows-workflow-debug-and-install.sh "$RUN_ID" || true
+else
+ echo "[openvibe] gh missing; run tools/gh-windows-build-and-install.sh after installing/authenticating gh"
+fi
+
+echo
+echo "[openvibe] next if DLLs installed:"
+echo " OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015"
+echo " # in game console: ov_join hub ; ov_menu ; ov_menu_servers"
new file mode 100755
new file mode 100755
@@ -0,0 +1,391 @@
@@ -0,0 +1,391 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+REPO="${OPENVIBE_REPO:-OpenVibers/OpenVibe.Games}"
+WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"
+BRANCH="$(git -C "$ROOT" rev-parse --abbrev-ref HEAD)"
+LOG_DIR="$ROOT/artifacts/windows-workflow-debug"
+
+cd "$ROOT"
+
+echo "[openvibe] fix Windows workflow diagnostics + rerun"
+echo "[openvibe] root=$ROOT"
+echo "[openvibe] repo=$REPO"
+echo "[openvibe] workflow=$WORKFLOW"
+echo "[openvibe] branch=$BRANCH"
+
+if ! command -v gh >/dev/null 2>&1; then
+ echo "[openvibe error] gh is required. Install/auth first:" >&2
+ echo " sudo apt update && sudo apt install gh" >&2
+ echo " gh auth login" >&2
+ exit 1
+fi
+
+if ! gh auth status >/dev/null 2>&1; then
+ echo "[openvibe error] gh is installed but not authenticated. Run:" >&2
+ echo " gh auth login" >&2
+ exit 1
+fi
+
+mkdir -p "$LOG_DIR"
+
+latest_run="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId // empty')"
+if [[ -n "$latest_run" ]]; then
+ echo "[openvibe] latest workflow run=$latest_run"
+ echo "[openvibe] saving failed/full logs into $LOG_DIR"
+ gh run view "$latest_run" --repo "$REPO" --log-failed > "$LOG_DIR/run-${latest_run}-failed.log" 2>&1 || true
+ gh run view "$latest_run" --repo "$REPO" --log > "$LOG_DIR/run-${latest_run}-full.log" 2>&1 || true
+
+ echo "[openvibe] likely error snippets:"
+ grep -Eina "error|fatal|exception|not found|cannot find|MSB[0-9]+|LNK[0-9]+|C[0-9]{4}|No such|missing|failed" \
+ "$LOG_DIR/run-${latest_run}-failed.log" "$LOG_DIR/run-${latest_run}-full.log" \
+ | tail -n 80 || true
+else
+ echo "[openvibe warn] no existing workflow run found yet"
+fi
+
+echo
+
+echo "[openvibe] rewriting Windows workflow to always upload logs/artifacts"
+mkdir -p .github/workflows
+cat > .github/workflows/windows-source-sdk-dlls.yml <<'YAML'
+name: Build Windows Source DLLs
+
+on:
+ workflow_dispatch:
+ inputs:
+ diagnostics:
+ description: "Upload verbose build diagnostics"
+ required: false
+ default: "1"
+ push:
+ branches:
+ - codex/openvibe-next-steps
+ paths:
+ - ".github/workflows/windows-source-sdk-dlls.yml"
+ - "tools/build-sdk-windows.ps1"
+ - "tools/build-quickjs-lib-windows.ps1"
+ - "tools/apply-openvibe-sdk.sh"
+ - "sdk/openvibe/**"
+ - "game/openvibe.games/js/**"
+
+permissions:
+ contents: read
+ actions: read
+
+jobs:
+ windows-dlls:
+ name: Windows client.dll/server.dll
+ runs-on: windows-2022
+ defaults:
+ run:
+ shell: pwsh
+
+ steps:
+ - name: Checkout OpenVibe
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 1
+
+ - name: Configure git line endings
+ run: |
+ git config --global core.autocrlf false
+ git config --global core.eol lf
+ git status --short
+
+ - name: Setup MSBuild
+ uses: microsoft/setup-msbuild@v2
+
+ - name: Show toolchain and tree
+ run: |
+ $ErrorActionPreference = 'Continue'
+ Write-Host "pwd=$(Get-Location)"
+ git rev-parse --short HEAD
+ where.exe msbuild
+ where.exe cl
+ where.exe link
+ where.exe bash
+ Get-ChildItem -Force | Select-Object Mode,Length,Name
+ if (Test-Path engine) { Get-ChildItem -Force engine | Select-Object Mode,Length,Name } else { Write-Host "[miss] engine directory" }
+ if (Test-Path engine/source-sdk-2013/src) { Get-ChildItem -Force engine/source-sdk-2013/src | Select-Object Mode,Length,Name } else { Write-Host "[miss] engine/source-sdk-2013/src" }
+
+ - name: Build Windows Source SDK DLLs
+ id: build
+ run: |
+ $ErrorActionPreference = 'Stop'
+ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null
+ powershell -NoProfile -ExecutionPolicy Bypass -File tools/build-sdk-windows.ps1 *>&1 | Tee-Object -FilePath artifacts/windows-build-debug/build-sdk-windows.log
+
+ - name: Stage build outputs and diagnostics
+ if: always()
+ run: |
+ $ErrorActionPreference = 'Continue'
+ New-Item -ItemType Directory -Force -Path artifacts/windows-dlls | Out-Null
+ New-Item -ItemType Directory -Force -Path artifacts/windows-build-debug | Out-Null
+
+ "=== repo ===" | Out-File artifacts/windows-build-debug/tree.txt
+ Get-ChildItem -Force | Format-Table -AutoSize | Out-File artifacts/windows-build-debug/tree.txt -Append
+ "=== dll search ===" | Out-File artifacts/windows-build-debug/dll-search.txt
+ Get-ChildItem -Recurse -Force -Include client.dll,server.dll -ErrorAction SilentlyContinue |
+ Select-Object FullName,Length,LastWriteTime |
+ Format-List | Out-File artifacts/windows-build-debug/dll-search.txt -Append
+ "=== vc/sln search ===" | Out-File artifacts/windows-build-debug/project-search.txt
+ Get-ChildItem -Recurse -Force -Include *.sln,*.vcxproj,*.vcproj,*.log -ErrorAction SilentlyContinue |
+ Select-Object FullName,Length,LastWriteTime |
+ Format-List | Out-File artifacts/windows-build-debug/project-search.txt -Append
+
+ $clientCandidates = @(
+ "game/openvibe.games/bin/client.dll",
+ "engine/source-sdk-2013/game/mod_hl2mp/bin/client.dll",
+ "engine/source-sdk-2013/game/mod_hl2mp/bin/win64/client.dll",
+ "engine/source-sdk-2013/game/mod_hl2mp/bin/Release/client.dll",
+ "engine/source-sdk-2013/src/game/client/Release_hl2mp/client.dll",
+ "engine/source-sdk-2013/src/game/client/Release/client.dll"
+ )
+ $serverCandidates = @(
+ "game/openvibe.games/bin/server.dll",
+ "engine/source-sdk-2013/game/mod_hl2mp/bin/server.dll",
+ "engine/source-sdk-2013/game/mod_hl2mp/bin/win64/server.dll",
+ "engine/source-sdk-2013/game/mod_hl2mp/bin/Release/server.dll",
+ "engine/source-sdk-2013/src/game/server/Release_hl2mp/server.dll",
+ "engine/source-sdk-2013/src/game/server/Release/server.dll"
+ )
+
+ $client = $clientCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
+ $server = $serverCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
+ if ($client) { Copy-Item $client artifacts/windows-dlls/client.dll -Force }
+ if ($server) { Copy-Item $server artifacts/windows-dlls/server.dll -Force }
+
+ if (Test-Path artifacts/windows-dlls/client.dll) {
+ $clientText = (Select-String -Path artifacts/windows-dlls/client.dll -Pattern "ov_join|ov_menu|OpenVibe" -Encoding Byte -SimpleMatch -Quiet)
+ Write-Host "client.dll staged"
+ } else {
+ Write-Host "[miss] no client.dll staged"
+ }
+ if (Test-Path artifacts/windows-dlls/server.dll) { Write-Host "server.dll staged" } else { Write-Host "[miss] no server.dll staged" }
+
+ - name: Upload Windows DLL artifact
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: openvibe-windows-dlls
+ path: artifacts/windows-dlls/**
+ if-no-files-found: warn
+
+ - name: Upload Windows build diagnostics
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: openvibe-windows-build-debug
+ path: artifacts/windows-build-debug/**
+ if-no-files-found: warn
+YAML
+
+cat > tools/build-sdk-windows.ps1 <<'PS1'
+$ErrorActionPreference = "Stop"
+
+$Root = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path
+$Sdk = Join-Path $Root "engine/source-sdk-2013"
+$Src = Join-Path $Sdk "src"
+$Mod = Join-Path $Root "game/openvibe.games"
+$OutBin = Join-Path $Mod "bin"
+$Qjs = Join-Path $Src "game/shared/openvibe/third_party/quickjs"
+$LogDir = Join-Path $Root "artifacts/windows-build-debug"
+New-Item -ItemType Directory -Force -Path $LogDir | Out-Null
+
+function Say($m) { Write-Host "[openvibe-win] $m" }
+function Require($p, $msg) {
+ if (!(Test-Path $p)) { throw "$msg`nMissing: $p" }
+}
+
+Say "root=$Root"
+Say "sdk=$Sdk"
+Say "src=$Src"
+Require $Src "Source SDK checkout is missing from this runner. The workflow must have engine/source-sdk-2013 available in the repository/submodule before Windows DLLs can build."
+
+# Apply OpenVibe source files using Git Bash when available. This reuses the Linux patcher on Windows runners.
+$bash = (Get-Command bash -ErrorAction SilentlyContinue)
+if ($bash) {
+ Say "applying OpenVibe SDK patch through bash"
+ & bash "$Root/tools/apply-openvibe-sdk.sh"
+ if ($LASTEXITCODE -ne 0) { throw "apply-openvibe-sdk.sh failed with exit code $LASTEXITCODE" }
+} else {
+ throw "Git Bash is required on the Windows runner to apply the OpenVibe SDK patch."
+}
+
+# Build QuickJS as MSVC objects/lib. The Linux .a cannot be linked into Windows DLLs.
+if (Test-Path (Join-Path $Root "tools/build-quickjs-lib-windows.ps1")) {
+ Say "building QuickJS Windows static library"
+ & powershell -NoProfile -ExecutionPolicy Bypass -File (Join-Path $Root "tools/build-quickjs-lib-windows.ps1")
+ if ($LASTEXITCODE -ne 0) { throw "build-quickjs-lib-windows.ps1 failed with exit code $LASTEXITCODE" }
+} else {
+ Say "no build-quickjs-lib-windows.ps1 found; continuing"
+}
+
+Set-Location $Src
+
+# Generate Visual Studio project files if needed.
+$solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)
+if ($solutions.Count -eq 0) {
+ Say "no .sln files found; trying Source SDK project generators"
+ $generators = @(
+ (Join-Path $Src "creategameprojects.bat"),
+ (Join-Path $Src "createallprojects.bat"),
+ (Join-Path $Src "createprojects.bat")
+ )
+ $ran = $false
+ foreach ($gen in $generators) {
+ if (Test-Path $gen) {
+ Say "running $gen"
+ & cmd /c "`"$gen`"" | Tee-Object -FilePath (Join-Path $LogDir "project-generation.log")
+ $ran = $true
+ break
+ }
+ }
+
+ if (-not $ran) {
+ $vpc = Join-Path $Src "devtools/bin/vpc.exe"
+ if (Test-Path $vpc) {
+ Say "running vpc.exe fallback"
+ & $vpc /hl2mp +game /mksln OpenVibe_HL2MP.sln | Tee-Object -FilePath (Join-Path $LogDir "vpc.log")
+ $ran = $true
+ }
+ }
+
+ $solutions = @(Get-ChildItem -Path $Src -Recurse -Filter "*.sln" -ErrorAction SilentlyContinue)
+ if ($solutions.Count -eq 0) {
+ Get-ChildItem -Path $Src -Force | Select-Object Mode,Length,Name | Format-Table -AutoSize | Out-File (Join-Path $LogDir "src-root-after-generator.txt")
+ throw "No Visual Studio solution was generated. Check openvibe-windows-build-debug artifact."
+ }
+}
+
+Say "solutions found:"
+$solutions | ForEach-Object { Say " $($_.FullName)" }
+
+# Pick the most likely HL2MP/game solution.
+$solution = $solutions |
+ Where-Object { $_.Name -match "hl2mp|game|sdk|everything|OpenVibe" } |
+ Select-Object -First 1
+if (-not $solution) { $solution = $solutions | Select-Object -First 1 }
+Say "selected solution=$($solution.FullName)"
+
+# Try common project targets/configurations. Source SDK projects vary by branch/version.
+$configs = @("Release", "Release_HL2MP", "Release HL2MP")
+$platforms = @("Win32", "x86")
+$targets = @("client_hl2mp", "server_hl2mp", "client", "server", "Build")
+
+$builtAny = $false
+foreach ($cfg in $configs) {
+ foreach ($plat in $platforms) {
+ foreach ($target in $targets) {
+ Say "msbuild cfg=$cfg platform=$plat target=$target"
+ & msbuild $solution.FullName /m /p:Configuration=$cfg /p:Platform=$plat /t:$target /v:minimal /nologo 2>&1 | Tee-Object -FilePath (Join-Path $LogDir "msbuild-$($cfg -replace '[^A-Za-z0-9]','_')-$plat-$target.log")
+ if ($LASTEXITCODE -eq 0) {
+ $builtAny = $true
+ break
+ }
+ }
+ if ($builtAny) { break }
+ }
+ if ($builtAny) { break }
+}
+
+if (-not $builtAny) {
+ throw "MSBuild could not build any known Source SDK HL2MP target. Check uploaded msbuild logs."
+}
+
+New-Item -ItemType Directory -Force -Path $OutBin | Out-Null
+
+$client = Get-ChildItem -Path $Sdk -Recurse -Filter client.dll -ErrorAction SilentlyContinue |
+ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|client" } |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+$server = Get-ChildItem -Path $Sdk -Recurse -Filter server.dll -ErrorAction SilentlyContinue |
+ Where-Object { $_.FullName -match "hl2mp|mod_hl2mp|server" } |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+
+if (-not $client) { throw "client.dll was not produced" }
+if (-not $server) { throw "server.dll was not produced" }
+
+Say "copy client=$($client.FullName)"
+Say "copy server=$($server.FullName)"
+Copy-Item $client.FullName (Join-Path $OutBin "client.dll") -Force
+Copy-Item $server.FullName (Join-Path $OutBin "server.dll") -Force
+
+Say "done"
+PS1
+
+# Add a local helper that downloads full logs/artifacts from the last run even when failed.
+cat > tools/windows-workflow-debug-and-install.sh <<'SH'
+#!/usr/bin/env bash
+set -euo pipefail
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+REPO="${OPENVIBE_REPO:-OpenVibers/OpenVibe.Games}"
+WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"
+BRANCH="$(git -C "$ROOT" rev-parse --abbrev-ref HEAD)"
+OUT="$ROOT/artifacts/windows-workflow-debug"
+cd "$ROOT"
+mkdir -p "$OUT"
+run="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId')"
+echo "[openvibe] latest run=$run"
+gh run view "$run" --repo "$REPO" --log > "$OUT/run-${run}.log" 2>&1 || true
+gh run view "$run" --repo "$REPO" --log-failed > "$OUT/run-${run}-failed.log" 2>&1 || true
+gh run download "$run" --repo "$REPO" --dir "$OUT/run-${run}-artifacts" || true
+printf '\n[openvibe] tail of failed log:\n'
+tail -n 160 "$OUT/run-${run}-failed.log" || true
+printf '\n[openvibe] artifacts saved under: %s\n' "$OUT/run-${run}-artifacts"
+if [[ -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/client.dll" && -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/server.dll" ]]; then
+ mkdir -p game/openvibe.games/bin
+ cp -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/client.dll" game/openvibe.games/bin/client.dll
+ cp -f "$OUT/run-${run}-artifacts/openvibe-windows-dlls/server.dll" game/openvibe.games/bin/server.dll
+ echo "[openvibe] installed DLL artifacts"
+ tools/verify-openvibe-dll-content.sh || true
+else
+ echo "[openvibe] no DLL artifact available yet; check debug artifact/logs"
+fi
+SH
+chmod +x tools/windows-workflow-debug-and-install.sh
+
+git add .github/workflows/windows-source-sdk-dlls.yml tools/build-sdk-windows.ps1 tools/windows-workflow-debug-and-install.sh
+
+if ! git diff --cached --quiet; then
+ echo "[openvibe] committing workflow/build diagnostic patch"
+ git commit -m "Improve Windows DLL workflow diagnostics"
+ echo "[openvibe] pushing $BRANCH"
+ git push origin "$BRANCH"
+else
+ echo "[openvibe] no workflow/build changes to commit"
+fi
+
+echo "[openvibe] triggering updated workflow"
+gh workflow run "$WORKFLOW" --repo "$REPO" --ref "$BRANCH"
+
+echo "[openvibe] waiting for new workflow run to appear"
+sleep 5
+new_run="$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId --jq '.[0].databaseId // empty')"
+if [[ -z "$new_run" ]]; then
+ echo "[openvibe error] could not find new workflow run" >&2
+ exit 1
+fi
+
+echo "[openvibe] watching run $new_run"
+set +e
+gh run watch "$new_run" --repo "$REPO" --exit-status
+status=$?
+set -e
+
+if [[ $status -eq 0 ]]; then
+ echo "[openvibe] workflow passed; downloading artifacts"
+else
+ echo "[openvibe warn] workflow still failed; downloading diagnostics anyway"
+fi
+
+tools/windows-workflow-debug-and-install.sh
+
+if [[ $status -ne 0 ]]; then
+ echo
+ echo "[openvibe] next: paste the tail printed above if you want me to patch the exact compile error."
+ exit $status
+fi
new file mode 100755
new file mode 100755
@@ -0,0 +1,225 @@
@@ -0,0 +1,225 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+BRANCH="${OPENVIBE_BRANCH:-$(git -C "$ROOT" branch --show-current 2>/dev/null || true)}"
+WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"
+ARTIFACT_DIR="$ROOT/.tmp/windows-dll-artifacts"
+MOD_BIN="$ROOT/game/openvibe.games/bin"
+
+cd "$ROOT"
+
+echo "[openvibe] next phase: finalize multiplatform support + trigger Windows DLL build"
+echo "[openvibe] root=$ROOT"
+echo "[openvibe] branch=${BRANCH:-unknown}"
+
+if [[ -z "${BRANCH:-}" ]]; then
+ echo "Could not determine current git branch." >&2
+ exit 1
+fi
+
+echo
+echo "[openvibe] current repo state:"
+git status --short
+
+echo
+echo "[openvibe] staging all intended platform/build helper changes"
+
+# Stage the files created/modified by the prior multiplatform/loading scripts.
+# This intentionally avoids generated SDK engine outputs and binary DLL/SO artifacts.
+paths=(
+ ".github/workflows/windows-source-sdk-dlls.yml"
+ "docs/BUILD_WINDOWS_DLLS_FROM_LINUX.md"
+ "docs/MULTIPLATFORM_SOURCE_BUILDS.md"
+ "launcher/main.js"
+ "tools/add-multiplatform-sdk-support.sh"
+ "tools/build-quickjs-lib-windows.ps1"
+ "tools/build-sdk-all-local.sh"
+ "tools/build-sdk-windows.ps1"
+ "tools/build-windows-dlls-from-linux-workflow.sh"
+ "tools/check-openvibe-platform-binaries.sh"
+ "tools/fix-launch-loading-and-explain-clientdll.sh"
+ "tools/fix-proton-loading-and-menu-fallback.sh"
+ "tools/probe-local-windows-build-on-linux.sh"
+ "tools/request-windows-dll-build.sh"
+ "tools/run-client-auto.sh"
+ "tools/run-client-linux.sh"
+ "tools/run-client-proton.sh"
+ "tools/run-client-windows.ps1"
+ "tools/setup-openvibe-bin.sh"
+ "tools/apply-openvibe-sdk.sh"
+ "game/openvibe.games/cfg/openvibe_proton_client.cfg"
+ "game/openvibe.games/resource/LoadingDialog.res"
+ "game/openvibe.games/materialsrc/console/openvibe-loading.svg"
+)
+
+for p in "${paths[@]}"; do
+ if [[ -e "$p" ]]; then
+ git add "$p"
+ fi
+done
+
+# Also stage removals among tracked files in those areas.
+git add -u launcher tools docs .github game/openvibe.games/cfg game/openvibe.games/resource game/openvibe.games/materialsrc 2>/dev/null || true
+
+echo
+echo "[openvibe] staged changes:"
+git diff --cached --stat || true
+
+if git diff --cached --quiet; then
+ echo "[openvibe] no staged changes to commit"
+else
+ msg="${OPENVIBE_COMMIT_MESSAGE:-Finalize multiplatform client runtime support}"
+ echo "[openvibe] committing: $msg"
+ git commit -m "$msg"
+fi
+
+echo
+echo "[openvibe] pushing branch $BRANCH"
+git push origin "$BRANCH"
+
+echo
+echo "[openvibe] local platform probe"
+if [[ -x tools/probe-local-windows-build-on-linux.sh ]]; then
+ tools/probe-local-windows-build-on-linux.sh || true
+fi
+
+if [[ -x tools/check-openvibe-platform-binaries.sh ]]; then
+ tools/check-openvibe-platform-binaries.sh || true
+fi
+
+echo
+echo "[openvibe] workflow trigger phase"
+
+if ! command -v gh >/dev/null 2>&1; then
+ cat <<'MSG'
+[openvibe] GitHub CLI 'gh' is not installed, so I cannot trigger/download the Windows build from here.
+
+Install/authenticate it, then run:
+ sudo apt install gh
+ gh auth login
+ tools/request-windows-dll-build.sh
+
+Or open GitHub Actions manually and run:
+ windows-source-sdk-dlls.yml
+MSG
+ exit 0
+fi
+
+if ! gh auth status >/dev/null 2>&1; then
+ cat <<'MSG'
+[openvibe] gh exists but is not authenticated.
+
+Run:
+ gh auth login
+
+Then rerun this script:
+ tools/next-phase-platform-build-and-fetch.sh
+MSG
+ exit 0
+fi
+
+if ! gh workflow view "$WORKFLOW" >/dev/null 2>&1; then
+ cat <<MSG
+[openvibe] workflow $WORKFLOW is not visible yet.
+This can happen right after pushing a new workflow.
+
+Wait 30-60 seconds, then rerun:
+ tools/next-phase-platform-build-and-fetch.sh
+MSG
+ exit 0
+fi
+
+echo "[openvibe] triggering workflow $WORKFLOW on $BRANCH"
+gh workflow run "$WORKFLOW" --ref "$BRANCH"
+
+echo "[openvibe] waiting for GitHub to create the workflow run"
+sleep 10
+
+run_id=""
+for _ in {1..18}; do
+ run_id="$(gh run list \
+ --workflow "$WORKFLOW" \
+ --branch "$BRANCH" \
+ --limit 1 \
+ --json databaseId,status,conclusion,createdAt \
+ --jq '.[0].databaseId // empty' 2>/dev/null || true)"
+
+ if [[ -n "$run_id" ]]; then
+ break
+ fi
+
+ sleep 5
+done
+
+if [[ -z "$run_id" ]]; then
+ echo "[openvibe] could not find workflow run id. Check manually:"
+ echo " gh run list --workflow $WORKFLOW --branch $BRANCH"
+ exit 1
+fi
+
+echo "[openvibe] watching workflow run: $run_id"
+if ! gh run watch "$run_id" --exit-status; then
+ echo
+ echo "[openvibe] Windows DLL workflow failed. Inspect with:"
+ echo " gh run view $run_id --log-failed"
+ exit 1
+fi
+
+echo
+echo "[openvibe] downloading artifacts from run $run_id"
+rm -rf "$ARTIFACT_DIR"
+mkdir -p "$ARTIFACT_DIR"
+gh run download "$run_id" -D "$ARTIFACT_DIR"
+
+echo
+echo "[openvibe] downloaded artifact tree:"
+find "$ARTIFACT_DIR" -maxdepth 4 -type f | sort
+
+client_dll="$(find "$ARTIFACT_DIR" -type f -iname 'client.dll' | head -n 1 || true)"
+server_dll="$(find "$ARTIFACT_DIR" -type f -iname 'server.dll' | head -n 1 || true)"
+
+if [[ -z "$client_dll" || -z "$server_dll" ]]; then
+ echo
+ echo "[openvibe] artifact did not contain both client.dll and server.dll."
+ echo "Paste this output plus:"
+ echo " gh run view $run_id --log"
+ exit 1
+fi
+
+mkdir -p "$MOD_BIN"
+cp -f "$client_dll" "$MOD_BIN/client.dll"
+cp -f "$server_dll" "$MOD_BIN/server.dll"
+
+echo
+echo "[openvibe] installed Windows/Proton DLLs:"
+ls -lh "$MOD_BIN/client.dll" "$MOD_BIN/server.dll"
+
+if command -v file >/dev/null 2>&1; then
+ file "$MOD_BIN/client.dll" "$MOD_BIN/server.dll" || true
+fi
+
+echo
+if [[ -x tools/check-openvibe-platform-binaries.sh ]]; then
+ tools/check-openvibe-platform-binaries.sh || true
+fi
+
+cat <<'MSG'
+
+[openvibe] next runtime test:
+
+ OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015
+
+In the game console test:
+
+ ov_help
+ ov_join hub
+ ov_menu
+ ov_menu_servers
+
+If those still say Unknown command, the DLL either failed to load or the artifact is not the patched OpenVibe client.dll.
+Check Source console for client.dll load errors and run:
+
+ file game/openvibe.games/bin/client.dll
+ strings game/openvibe.games/bin/client.dll | grep -E 'ov_join|ov_menu' | head
+MSG
new file mode 100755
new file mode 100755
@@ -0,0 +1,417 @@
@@ -0,0 +1,417 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+BRANCH="$(git -C "$ROOT" branch --show-current 2>/dev/null || true)"
+: "${BRANCH:=codex/openvibe-next-steps}"
+
+say() { printf '\n\033[1;36m[openvibe]\033[0m %s\n' "$*"; }
+warn() { printf '\n\033[1;33m[openvibe warn]\033[0m %s\n' "$*"; }
+
+cd "$ROOT"
+
+say "next phase: validate Proton DLL content + add build/fetch helper"
+say "root=$ROOT"
+say "branch=$BRANCH"
+
+mkdir -p tools docs game/openvibe.games/cfg
+
+cat > tools/verify-openvibe-dll-content.sh <<'VERIFY'
+#!/usr/bin/env bash
+set -euo pipefail
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+CLIENT="$ROOT/game/openvibe.games/bin/client.dll"
+SERVER="$ROOT/game/openvibe.games/bin/server.dll"
+
+ok=0
+fail=0
+
+line() { printf '%s\n' "--------------------------------------------------------------------------------"; }
+check_file() {
+ local label="$1" file="$2"; shift 2
+ line
+ echo "[$label] $file"
+ if [[ ! -f "$file" ]]; then
+ echo "[missing] $file"
+ fail=$((fail+1))
+ return
+ fi
+ file "$file" || true
+ stat -c '[size] %s bytes' "$file" || true
+ sha256sum "$file" | awk '{print "[sha256] "$1}' || true
+
+ local missing=0
+ for needle in "$@"; do
+ if strings -a "$file" | grep -Fq -- "$needle"; then
+ echo "[ok] contains string: $needle"
+ else
+ echo "[miss] does not contain string: $needle"
+ missing=1
+ fi
+ done
+
+ if [[ "$missing" -eq 0 ]]; then
+ ok=$((ok+1))
+ else
+ fail=$((fail+1))
+ fi
+}
+
+check_file "Windows/Proton client.dll" "$CLIENT" \
+ "ov_join" \
+ "ov_auth_steam" \
+ "ov_menu" \
+ "OpenVibe"
+
+check_file "Windows/Proton server.dll" "$SERVER" \
+ "ov_js_status" \
+ "ov_js_cmd" \
+ "OpenVibe"
+
+line
+if [[ "$fail" -eq 0 ]]; then
+ echo "[openvibe] DLL content check passed. Proton should load OpenVibe client/server commands if the mod path is correct."
+ exit 0
+fi
+
+cat <<'MSG'
+[openvibe] DLL content check failed.
+
+Meaning:
+ - client.dll/server.dll may exist, but they are probably old/stock/unpatched DLLs.
+ - If the in-game console says Unknown command "ov_join" or "ov_menu", this is the first thing to fix.
+
+Fix:
+ - Trigger the Windows GitHub Actions build, download its artifact, and install the resulting DLLs.
+ - Run: tools/gh-windows-build-and-install.sh
+MSG
+exit 2
+VERIFY
+chmod +x tools/verify-openvibe-dll-content.sh
+
+cat > tools/collect-proton-openvibe-debug.sh <<'COLLECT'
+#!/usr/bin/env bash
+set -euo pipefail
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+MOD="$ROOT/game/openvibe.games"
+STEAM_APP_ID="${SteamAppId:-243750}"
+PATTERN='OpenVibe|ov_|client\.dll|server\.dll|GameDLL|ClientDLL|Unknown command|failed|Failed|unable|Unable|error|Error'
+
+printf '[openvibe] collecting Proton/Source debug hints\n'
+printf 'root=%s\n' "$ROOT"
+printf 'mod=%s\n\n' "$MOD"
+
+candidates=(
+ "$MOD/console.log"
+ "$MOD/openvibe_proton_console.log"
+ "$ROOT/console.log"
+ "$ROOT/openvibe_proton_console.log"
+ "$HOME/steam-${STEAM_APP_ID}.log"
+ "$HOME/steam-${STEAM_APP_ID}.log.last"
+)
+
+found=0
+for file in "${candidates[@]}"; do
+ if [[ -f "$file" ]]; then
+ found=1
+ echo "--------------------------------------------------------------------------------"
+ echo "[log] $file"
+ echo "[tail] last matching lines"
+ grep -Eia "$PATTERN" "$file" | tail -80 || true
+ fi
+done
+
+if [[ "$found" -eq 0 ]]; then
+ cat <<MSG
+No common logs found yet.
+
+Launch with Proton logging enabled:
+ OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015
+
+Then run this again:
+ tools/collect-proton-openvibe-debug.sh
+MSG
+fi
+COLLECT
+chmod +x tools/collect-proton-openvibe-debug.sh
+
+cat > tools/gh-windows-build-and-install.sh <<'GHDL'
+#!/usr/bin/env bash
+set -euo pipefail
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+cd "$ROOT"
+
+WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"
+BRANCH="${OPENVIBE_BRANCH:-$(git branch --show-current)}"
+ART_DIR="$ROOT/.tmp/windows-dll-artifact"
+MOD_BIN="$ROOT/game/openvibe.games/bin"
+
+if ! command -v gh >/dev/null 2>&1; then
+ cat <<MSG
+[openvibe] gh is missing.
+
+Install/authenticate it:
+ sudo apt update
+ sudo apt install gh
+ gh auth login
+
+Then rerun:
+ tools/gh-windows-build-and-install.sh
+
+Manual fallback:
+ Open GitHub Actions -> $WORKFLOW -> Run workflow -> branch $BRANCH
+ Download the artifact, then copy client.dll/server.dll into:
+ $MOD_BIN
+MSG
+ exit 127
+fi
+
+if ! gh auth status >/dev/null 2>&1; then
+ echo "[openvibe] gh is installed but not authenticated. Run: gh auth login" >&2
+ exit 126
+fi
+
+repo="$(gh repo view --json nameWithOwner -q .nameWithOwner)"
+echo "[openvibe] repo=$repo"
+echo "[openvibe] workflow=$WORKFLOW"
+echo "[openvibe] branch=$BRANCH"
+
+git push origin "$BRANCH"
+
+echo "[openvibe] triggering Windows DLL workflow"
+gh workflow run "$WORKFLOW" --ref "$BRANCH"
+
+echo "[openvibe] waiting for workflow run to appear"
+run_id=""
+for _ in {1..30}; do
+ run_id="$(gh run list --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId,status -q '.[0].databaseId // empty' 2>/dev/null || true)"
+ [[ -n "$run_id" ]] && break
+ sleep 2
+done
+
+if [[ -z "$run_id" ]]; then
+ echo "[openvibe] could not find workflow run. Check GitHub Actions manually." >&2
+ exit 1
+fi
+
+echo "[openvibe] watching run $run_id"
+gh run watch "$run_id" --exit-status
+
+rm -rf "$ART_DIR"
+mkdir -p "$ART_DIR"
+echo "[openvibe] downloading artifacts to $ART_DIR"
+gh run download "$run_id" --dir "$ART_DIR"
+
+client="$(find "$ART_DIR" -iname 'client.dll' -type f | head -n 1 || true)"
+server="$(find "$ART_DIR" -iname 'server.dll' -type f | head -n 1 || true)"
+
+if [[ -z "$client" || -z "$server" ]]; then
+ echo "[openvibe] artifact did not contain client.dll and server.dll" >&2
+ find "$ART_DIR" -maxdepth 5 -type f | sort >&2
+ exit 1
+fi
+
+mkdir -p "$MOD_BIN"
+cp -f "$client" "$MOD_BIN/client.dll"
+cp -f "$server" "$MOD_BIN/server.dll"
+
+echo "[openvibe] installed:"
+ls -lh "$MOD_BIN/client.dll" "$MOD_BIN/server.dll"
+
+tools/verify-openvibe-dll-content.sh
+
+echo "[openvibe] done. Now test:"
+echo " OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015"
+echo "Then in the game console:"
+echo " ov_join hub"
+echo " ov_menu"
+echo " ov_menu_servers"
+GHDL
+chmod +x tools/gh-windows-build-and-install.sh
+
+cat > game/openvibe.games/cfg/openvibe_proton_client.cfg <<'CFG'
+echo "==== OpenVibe Proton fallback cfg loaded ===="
+echo "This cfg only adds ovp_* fallback aliases. Real ov_join/ov_menu must come from client.dll."
+echo "Try real commands first: ov_join hub ; ov_menu ; ov_menu_servers"
+alias ovp_help "echo OpenVibe Proton fallback commands: ovp_join_hub ovp_join_prophunt ovp_join_deathrun ovp_join_fortwars ovp_join_traitortown"
+alias ovp_join_hub "connect 127.0.0.1:27015"
+alias ovp_join_prophunt "connect 127.0.0.1:27016"
+alias ovp_join_deathrun "connect 127.0.0.1:27017"
+alias ovp_join_fortwars "connect 127.0.0.1:27018"
+alias ovp_join_traitortown "connect 127.0.0.1:27019"
+CFG
+
+cat > docs/PROTON_CLIENT_DLL_DEBUG.md <<'DOC'
+# Proton client DLL debug path
+
+Proton runs the Windows `hl2.exe`, so it loads:
+
+```text
+game/openvibe.games/bin/client.dll
+game/openvibe.games/bin/server.dll
+```
+
+It cannot load the Linux modules:
+
+```text
+game/openvibe.games/bin/linux64/client.so
+game/openvibe.games/bin/linux64/server.so
+```
+
+If the in-game console says `Unknown command "ov_join"` or `Unknown command "ov_menu"`, then one of these is true:
+
+1. `client.dll` is missing.
+2. `client.dll` is stock/old and does not contain the OpenVibe commands.
+3. The mod path is wrong and `hl2.exe` is not loading `game/openvibe.games`.
+4. The DLL failed during load.
+
+Useful commands:
+
+```bash
+tools/verify-openvibe-dll-content.sh
+OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015
+tools/collect-proton-openvibe-debug.sh
+```
+
+Safe fallback aliases are prefixed with `ovp_` so they do not mask real client DLL commands:
+
+```text
+ovp_help
+ovp_join_hub
+ovp_join_prophunt
+ovp_join_deathrun
+ovp_join_fortwars
+ovp_join_traitortown
+```
+DOC
+
+# Rewrite run-client-proton.sh with better DLL-aware diagnostics and logging.
+cat > tools/run-client-proton.sh <<'PROTON'
+#!/bin/bash
+# OpenVibe: Source - Game Client Launcher via GE-Proton10-34
+set -euo pipefail
+
+ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
+STEAM_PATH="${OPENVIBE_STEAM_PATH:-/mnt/6tb/ssd_offload/home/workstation/.steam/debian-installation}"
+GE_PROTON="${OPENVIBE_GE_PROTON:-$STEAM_PATH/compatibilitytools.d/GE-Proton10-34}"
+STEAM_COMPAT_DATA="${OPENVIBE_STEAM_COMPAT_DATA:-$STEAM_PATH/steamapps/compatdata/243750}"
+HL2_EXE="${OPENVIBE_HL2_EXE:-/mnt/data-f/SteamLibrary/steamapps/common/Source SDK Base 2013 Multiplayer/hl2.exe}"
+GAME_DIR="${OPENVIBE_GAME_DIR:-$ROOT/game/openvibe.games}"
+CLIENT_DLL="$GAME_DIR/bin/client.dll"
+SERVER_DLL="$GAME_DIR/bin/server.dll"
+
+if [ ! -f "$HL2_EXE" ]; then
+ echo "ERROR: hl2.exe not found at $HL2_EXE" >&2
+ exit 1
+fi
+
+if [ ! -d "$GE_PROTON" ]; then
+ echo "ERROR: GE-Proton not found at $GE_PROTON" >&2
+ exit 1
+fi
+
+CONNECT_ARGS=""
+if [ "${1:-}" != "" ] && [ "${2:-}" != "" ]; then
+ CONNECT_ARGS="+connect $1:$2"
+fi
+
+echo "Launching OpenVibe: Source via Proton..."
+echo " Game: $GAME_DIR"
+echo " Proton: $GE_PROTON"
+echo " HL2: $HL2_EXE"
+[ -n "$CONNECT_ARGS" ] && echo " Connect: $CONNECT_ARGS"
+
+if [ -f "$CLIENT_DLL" ] && command -v strings >/dev/null 2>&1 && strings -a "$CLIENT_DLL" | grep -Fq "ov_join"; then
+ echo " Client DLL: patched OpenVibe client.dll detected"
+elif [ -f "$CLIENT_DLL" ]; then
+ echo " WARNING: client.dll exists, but ov_join string was not found. It may be stock/old." >&2
+else
+ echo " WARNING: client.dll missing. Proton will not have OpenVibe client commands." >&2
+fi
+
+if [ ! -f "$SERVER_DLL" ]; then
+ echo " WARNING: server.dll missing for Windows listen/server use." >&2
+fi
+
+mkdir -p "$STEAM_COMPAT_DATA"
+
+export DISPLAY="${DISPLAY:-:0}"
+export STEAM_COMPAT_CLIENT_INSTALL_PATH="$STEAM_PATH"
+export STEAM_COMPAT_DATA_PATH="$STEAM_COMPAT_DATA"
+export SteamAppId="${SteamAppId:-243750}"
+export PROTON_LOG="${OPENVIBE_PROTON_LOG:-${PROTON_LOG:-1}}"
+export DXVK_ASYNC="${DXVK_ASYNC:-1}"
+
+exec "$GE_PROTON/proton" waitforexitandrun \
+ "$HL2_EXE" \
+ -game "$GAME_DIR" \
+ -console -dev -condebug -novid -sw -w 1280 -h 720 \
+ -port 27115 -clientport 27105 \
+ +developer 1 \
+ +con_logfile openvibe_proton_console.log \
+ +exec openvibe_proton_client.cfg \
+ $CONNECT_ARGS
+PROTON
+chmod +x tools/run-client-proton.sh
+
+# Improve platform checker if present by appending a DLL content reminder safely.
+if [[ -f tools/check-openvibe-platform-binaries.sh ]] && ! grep -Fq "verify-openvibe-dll-content" tools/check-openvibe-platform-binaries.sh; then
+ cat >> tools/check-openvibe-platform-binaries.sh <<'EXTRA'
+
+echo
+echo "[openvibe] Deep DLL content check:"
+if [[ -x "${OPENVIBE_ROOT:-$HOME/src/openvibe-source}/tools/verify-openvibe-dll-content.sh" ]]; then
+ "${OPENVIBE_ROOT:-$HOME/src/openvibe-source}/tools/verify-openvibe-dll-content.sh" || true
+else
+ echo "tools/verify-openvibe-dll-content.sh missing"
+fi
+EXTRA
+fi
+
+say "running DLL content validation now"
+if tools/verify-openvibe-dll-content.sh; then
+ say "existing DLLs look patched"
+else
+ warn "existing DLLs do not look patched; trigger/download fresh Windows DLLs next"
+fi
+
+say "git status"
+git status --short
+
+say "stage/commit/push helper changes"
+git add tools/verify-openvibe-dll-content.sh \
+ tools/collect-proton-openvibe-debug.sh \
+ tools/gh-windows-build-and-install.sh \
+ tools/run-client-proton.sh \
+ tools/check-openvibe-platform-binaries.sh \
+ game/openvibe.games/cfg/openvibe_proton_client.cfg \
+ docs/PROTON_CLIENT_DLL_DEBUG.md
+
+if git diff --cached --quiet; then
+ say "no helper changes to commit"
+else
+ git commit -m "Add Proton DLL validation and artifact install helpers"
+ git push origin "$BRANCH"
+fi
+
+say "next actions"
+cat <<NEXT
+1. Install/auth gh if missing:
+ sudo apt update && sudo apt install gh
+ gh auth login
+
+2. Trigger/download/install patched Windows DLLs:
+ tools/gh-windows-build-and-install.sh
+
+3. Launch Proton with logs:
+ OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015
+
+4. In game console, test real client DLL commands:
+ ov_join hub
+ ov_menu
+ ov_menu_servers
+
+5. If commands are still unknown:
+ tools/verify-openvibe-dll-content.sh
+ tools/collect-proton-openvibe-debug.sh
+NEXT