openvibers/source.openvibe.games Commits

Next push

CO Copilot committed 29 Jun 2026 · c6827af006 · 23 files, +2090 −0


Changes

ddiff --git a/artifacts/windows-workflow-debug/run-28348889576-failed.log b/artifacts/windows-workflow-debug/run-28348889576-failed.log
nnew file mode 100644
iindex 0000000..e69de29
ddiff --git a/artifacts/windows-workflow-debug/run-28348889576-full.log b/artifacts/windows-workflow-debug/run-28348889576-full.log
nnew file mode 100644
iindex 0000000..e69de29
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/build-sdk-windows.log b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/build-sdk-windows.log
nnew file mode 100644
iindex 0000000..8dbd9f4
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/build-sdk-windows.log
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/dll-search.txt b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/dll-search.txt
nnew file mode 100644
iindex 0000000..811d45d
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/dll-search.txt
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/project-search.txt b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/project-search.txt
nnew file mode 100644
iindex 0000000..d33a3a2
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/project-search.txt
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/tree.txt b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/tree.txt
nnew file mode 100644
iindex 0000000..989e09c
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-build-debug/tree.txt
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/client.dll b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/client.dll
nnew file mode 100644
iindex 0000000..04d3fed
BBinary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/client.dll differ
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/server.dll b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/server.dll
nnew file mode 100644
iindex 0000000..02f1c20
BBinary files /dev/null and b/artifacts/windows-workflow-debug/run-28349028341-artifacts/openvibe-windows-dlls/server.dll differ
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341-failed.log b/artifacts/windows-workflow-debug/run-28349028341-failed.log
nnew file mode 100644
iindex 0000000..e69de29
ddiff --git a/artifacts/windows-workflow-debug/run-28349028341.log b/artifacts/windows-workflow-debug/run-28349028341.log
nnew file mode 100644
iindex 0000000..e69de29
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/file-list.txt b/artifacts/windows-workflow-debug/run-28349142948-artifacts/file-list.txt
nnew file mode 100644
iindex 0000000..fcc8363
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/file-list.txt
@@@ -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
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/full-run.log b/artifacts/windows-workflow-debug/run-28349142948-artifacts/full-run.log
nnew file mode 100644
iindex 0000000..e69de29
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log
nnew file mode 100644
iindex 0000000..ef3eef9
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/bootstrap-source-sdk-2013.log
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/dll-search.txt b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/dll-search.txt
nnew file mode 100644
iindex 0000000..1b1abcb
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/dll-search.txt
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/engine-before-build.txt b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/engine-before-build.txt
nnew file mode 100644
iindex 0000000..d842b1a
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/engine-before-build.txt
@@@ -0,0 +1,5 @@
++
++Mode Length Name
++---- ------ ----
++d---- openvibe-js-runtime
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/no-patched-dlls.txt b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/no-patched-dlls.txt
nnew file mode 100644
iindex 0000000..9aa4d60
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/no-patched-dlls.txt
@@@ -0,0 +1 @@
++No patched OpenVibe DLLs staged. Check build logs.
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/project-search.txt b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/project-search.txt
nnew file mode 100644
iindex 0000000..c0bfbe3
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/project-search.txt
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/repo-root-before-build.txt b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/repo-root-before-build.txt
nnew file mode 100644
iindex 0000000..ead7580
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/repo-root-before-build.txt
@@@ -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
++
ddiff --git a/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/tree.txt b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/tree.txt
nnew file mode 100644
iindex 0000000..10ede95
---- /dev/null
++++ b/artifacts/windows-workflow-debug/run-28349142948-artifacts/openvibe-windows-build-debug/tree.txt
@@@ -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
++
ddiff --git a/tools/fix-windows-sdk-bootstrap-and-real-dlls.sh b/tools/fix-windows-sdk-bootstrap-and-real-dlls.sh
nnew file mode 100755
iindex 0000000..c7fb42c
---- /dev/null
++++ b/tools/fix-windows-sdk-bootstrap-and-real-dlls.sh
@@@ -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"
ddiff --git a/tools/fix-windows-workflow-diagnostics-and-rerun.sh b/tools/fix-windows-workflow-diagnostics-and-rerun.sh
nnew file mode 100755
iindex 0000000..b0da917
---- /dev/null
++++ b/tools/fix-windows-workflow-diagnostics-and-rerun.sh
@@@ -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
ddiff --git a/tools/next-phase-platform-build-and-fetch.sh b/tools/next-phase-platform-build-and-fetch.sh
nnew file mode 100755
iindex 0000000..bb13b47
---- /dev/null
++++ b/tools/next-phase-platform-build-and-fetch.sh
@@@ -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
ddiff --git a/tools/next-phase-validate-proton-dll-and-trigger-build.sh b/tools/next-phase-validate-proton-dll-and-trigger-build.sh
nnew file mode 100755
iindex 0000000..8c6c4cb
---- /dev/null
++++ b/tools/next-phase-validate-proton-dll-and-trigger-build.sh
@@@ -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