Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
dde7349
feat: import production plugins from nevr-runtime-plugins
thesprockee Mar 28, 2026
1a3b77c
feat: add standalone Quest/Android build stubs
thesprockee Mar 28, 2026
1215326
docs: update CLAUDE.md and README.md for plugins and standalone
thesprockee Mar 28, 2026
085ab87
docs: add methodology/guardrails to CLAUDE.md, remove local paths
thesprockee Mar 28, 2026
3ffefe7
chore: move non-dev docs to extras/, update .gitignore
thesprockee Mar 28, 2026
38f8166
tests/plugins: add Go module and plugin deploy/cleanup helpers
thesprockee Mar 28, 2026
8f2d803
tests/plugins: add ground truth cross-reference tests
thesprockee Mar 28, 2026
d03f810
tests/plugins: add super-hyper-turbo integration tests
thesprockee Mar 28, 2026
00423b0
justfile: add plugin test targets
thesprockee Mar 28, 2026
6395523
plugins/crash-handler: extract crash recovery into plugin
thesprockee Mar 29, 2026
115c648
gamepatches: split monolithic patches.cpp into modules
thesprockee Mar 29, 2026
9ec3e2e
legacy: freeze gamepatches-v2 snapshot (pre-modular)
thesprockee Mar 29, 2026
e2f5f05
plugins/social-bridge: add social messaging plugin
thesprockee Mar 29, 2026
fa7f0f7
plugins/token-auth: add token authentication plugin
thesprockee Mar 29, 2026
9a179d5
dist: include plugin DLLs in distribution packages
thesprockee Mar 29, 2026
606257a
extras/run-client: update fleet connection password
thesprockee Mar 29, 2026
4e9e33f
docs: add plugin test suite plan
thesprockee Mar 29, 2026
0e288b3
chore: gitignore extras/.env and session logs
thesprockee Mar 29, 2026
2c3f667
refactor: migrate jsoncpp to nlohmann-json
thesprockee Apr 1, 2026
90b6b86
docs: add ReVault and Continuity sections to CLAUDE.md
thesprockee Apr 1, 2026
2a03bf8
fix: log fatal exceptions before passing to default handler
thesprockee Apr 1, 2026
dd63932
fix: search parent directories for _local/config.json
thesprockee Apr 1, 2026
ecff7e9
feat: add verified addresses for combat, filesystem, and social plugins
thesprockee Apr 1, 2026
aa35567
feat(broadcaster-bridge): add receive hook, chassis swap, and inspect…
thesprockee Apr 1, 2026
9925a7f
feat: add resource override hooks and combat mode initialization
thesprockee Apr 1, 2026
c721124
feat: add skip-splash, filesystem-loader, combat-patch, pnsrad-enable…
thesprockee Apr 1, 2026
aab1f52
feat: add pnsrad.dll reconstruction (object-only, incomplete)
thesprockee Apr 1, 2026
f4ef22b
build: add pnsrad and new plugins to build system and dist targets
thesprockee Apr 1, 2026
1583755
chore: remove obsolete cdn-cosmetics-loading plan
thesprockee Apr 1, 2026
8ea6342
refactor: replace all hand-rolled JSON parsing with nlohmann-json
thesprockee Apr 1, 2026
8a28ec5
feat: shared auth token with refresh, wire JWT into all WebSocket con…
thesprockee Apr 1, 2026
5d25d88
test: add automated auth token tests, rename to .credentials.json
thesprockee Apr 1, 2026
27e9373
refactor: rename protobufnevr → nevr_api
thesprockee Apr 1, 2026
0df2bca
fix: address code review findings in token-auth
thesprockee Apr 1, 2026
abf52c1
fix: second review pass — 6 bugs fixed
thesprockee Apr 1, 2026
ab74c67
Merge branch 'feat/token-auth' into feat/launcher-architecture
thesprockee Apr 1, 2026
f9fff58
refactor: defer function pointer init, add NEVR_SetGameModule export
thesprockee Apr 1, 2026
d00ca70
feat: add launcher (echovr.exe replacement) with PE EXE-to-DLL conver…
thesprockee Apr 1, 2026
b53701a
feat: static-link log-filter, server-timing, token-auth into gamepatches
thesprockee Apr 1, 2026
0b6510a
refactor: deprecate CLI flags, add build-time keys, add -region
thesprockee Apr 1, 2026
d59541c
build: update dist targets for launcher architecture
thesprockee Apr 1, 2026
15c424a
fix: address code review — 6 bugs in launcher architecture
thesprockee Apr 1, 2026
1fa490e
fix: address PR review comments
thesprockee Apr 1, 2026
386a66e
Merge pull request #10 from EchoTools/feat/launcher-architecture
thesprockee Apr 1, 2026
33dc9e7
fix: update CNSRADUsers::OnShutdown to match base class signature
thesprockee Apr 1, 2026
f1a740c
feat: resource override registry with embedded EchoVRCE splash texture
thesprockee Apr 1, 2026
371c921
fix: keep token-auth as external plugin — curl UCRT deps crash Wine
thesprockee Apr 1, 2026
df65acb
fix: re-add builtin token-auth, detect Wine DLL relocation
thesprockee Apr 1, 2026
3cec481
chore: move optional plugins to nevr-runtime-plugins, remove force-push
thesprockee Apr 3, 2026
620a6d1
refactor: replace dbgcore.dll hijack with BugSplat64.dll static import
thesprockee Apr 3, 2026
ce3c426
fix: single-phase DllMain init, Oculus SDK block on clients, Log() nu…
thesprockee Apr 3, 2026
5983a6e
fix: redirect readyatdawn.com service URLs based on scheme
thesprockee Apr 3, 2026
56bc733
feat: in-process WebSocket TLS proxy for Wine compatibility
thesprockee Apr 3, 2026
fadf0db
fix: route all WebSocket connections through the proxy unconditionally
thesprockee Apr 3, 2026
faeefc7
feat: move token auth into gamepatches, attach Bearer to WS connections
thesprockee Apr 3, 2026
658d539
fix: deadlock in WS proxy when config connection closes
thesprockee Apr 3, 2026
379cc5d
fix: resolve credentials file path relative to executable, not CWD
thesprockee Apr 3, 2026
d1524f7
feat: inject LoginRequest on login WebSocket connection
thesprockee Apr 5, 2026
6803db4
feat: bypass pnsrad login guards for non-OVR platform authentication
thesprockee Apr 6, 2026
f64096e
feat: set CNSUser login state before LoginRequest injection, improve …
thesprockee Apr 6, 2026
5c042d6
docs: update CLAUDE.md with ReVault and continuity guidelines
thesprockee Apr 6, 2026
f10892c
Merge feat/ws-tls-proxy: WS TLS proxy with pnsrad login support
thesprockee Apr 6, 2026
3060b5c
fix: address code review findings
thesprockee Apr 6, 2026
0007757
fix: parse discord ID from JWT instead of hardcoding
thesprockee Apr 6, 2026
60f07ff
fix: wrong module name in GetModuleHandleA, race in pair insertion
thesprockee Apr 6, 2026
9b94c55
fix: detect -server flag before TokenAuth::Init to skip device auth o…
thesprockee Apr 7, 2026
0fdfb01
feat: server-key auth for dedicated servers connecting to ServerDB
thesprockee Apr 7, 2026
0bdfe21
feat: periodic token refresh and thread-safe token accessor
thesprockee Apr 7, 2026
b126f84
refactor: use TokenAuth accessor instead of disk cache in WS bridge
thesprockee Apr 7, 2026
547b28b
fix: address code review findings
thesprockee Apr 7, 2026
ba4e4d8
fix: extract discord_id from JWT vrs map, not top-level claims
thesprockee Apr 7, 2026
2b6c178
feat: query param auth workaround for nginx Bearer stripping
thesprockee Apr 7, 2026
960710b
fix: server_timing crash on clients, add module list to crash handler
thesprockee Apr 7, 2026
ddc1ad0
fix: log_filter plugin missing MH_Initialize call
thesprockee Apr 7, 2026
120608d
feat: fix token refresh endpoint, auto-subscribe friends on login
thesprockee Apr 7, 2026
852bf7b
feat: SNS friend message diagnostics, auto-subscribe friends
thesprockee Apr 7, 2026
aa5a05f
chore: extend .gitignore for Claude Code, Wine, MCP, and Node artifacts
thesprockee Apr 10, 2026
bbf8ff6
feat: combat-mod infrastructure — resource override exports, address …
thesprockee Apr 10, 2026
7756e01
feat: add safe_memory.h — VEH-based crash-safe memory access for MinGW
thesprockee Apr 10, 2026
fc44238
feat: add echomod Python toolkit and C header generator
thesprockee Apr 10, 2026
c30f834
feat: port combat-mod plugin — all modules ported from echovr_combat_mod
thesprockee Apr 10, 2026
8f923a4
feat: add combat-2d plugin — PC/2D mode fixes
thesprockee Apr 10, 2026
3ea256f
feat: file-based resource override pipeline for combat mod
thesprockee Apr 10, 2026
35f4270
feat: resource alias hook + Go tests for combat mod pipeline
thesprockee Apr 10, 2026
2740d8d
feat: inject FriendListSubscribe via WS bridge, fix dist plugins
thesprockee Apr 10, 2026
91c7646
feat: add plugin API versioning with NvrPluginGetApiVersion export
thesprockee Apr 10, 2026
0a5dff2
feat: add shared plugin utilities — logger, hook manager, safe memory…
thesprockee Apr 10, 2026
1fe38d9
refactor: migrate combat-mod to shared plugin utilities
thesprockee Apr 10, 2026
5827dc3
fix: eliminate MH_ALL_HOOKS from all plugins, migrate to HookManager
thesprockee Apr 10, 2026
b0c4c09
refactor: split legacy DLLs into separate dist-legacy package
thesprockee Apr 10, 2026
2885700
feat: replace PSN- provider prefix with DSC- for Discord XPIDs
thesprockee Apr 11, 2026
7603196
fix: Nakama RPC unwrap and LoadLibraryA fallbacks for hook install
thesprockee Apr 11, 2026
57d0ab8
fix: only reset CNSUser login state on conn=1, not all connections
thesprockee Apr 11, 2026
3804f1e
feat: share login WS session for matchmaker connections
thesprockee Apr 11, 2026
ae99e8b
debug: hex dump PlayerSessionRequest payload for join analysis
thesprockee Apr 11, 2026
cc9ea87
fix: give matchmaker its own WS without format=evr, revert sharing
thesprockee Apr 11, 2026
e273b73
fix: shared login session for matchmaker, no extra LoginRequest
thesprockee Apr 11, 2026
581325d
fix: skip Bearer when URL has credentials on /spr endpoint
thesprockee Apr 11, 2026
f49e430
fix: set CNSUser XPID identity to DSC provider with discord account ID
thesprockee Apr 11, 2026
2db480a
fix: let PatchEnableHeadless handle server rendering — enables consol…
thesprockee Apr 11, 2026
7092e3e
fix: add explicit server-mode guard to server_timing plugin
thesprockee Apr 12, 2026
eac86bb
feat: event-driven server networking via WSAPoll
thesprockee Apr 12, 2026
627b6ac
refactor: move pnsrad-enabler to gamepatches builtin, clean up dist
thesprockee Apr 12, 2026
a31c426
feat: add code signing CA hierarchy and AI semantic release workflow
thesprockee Apr 12, 2026
a3809eb
feat: Wave 0 instrumentation hooks, binary bug audit, fix plan
thesprockee Apr 13, 2026
dc7ffe9
fix: enable globstar in just sign to recurse into plugins/ subdirectory
thesprockee Apr 13, 2026
37e0360
feat: anim-debugger plugin, auto-relay matching service, fix dist pac…
thesprockee Apr 13, 2026
4d24d79
fix: wire wave0 instrumentation into gamepatches init/shutdown
thesprockee Apr 13, 2026
aa14263
fix: upgrade wave0 from observation to bug fixes for 9 binary bugs
thesprockee Apr 13, 2026
801770d
docs: update binary bug audit — 61 total, 9 fixed
thesprockee Apr 13, 2026
2326f47
Merge branch 'feat/loader-modules'
thesprockee Apr 14, 2026
258a051
fix: implement shutdown for core components to prevent resource leaks
thesprockee Apr 15, 2026
b74c974
feat: add launch-client.sh for local testing in wine
thesprockee Apr 15, 2026
ad4c404
chore: ignore local .clangd and dump.rdb
thesprockee Apr 15, 2026
0ce685b
Change log naming convention
brysonak Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
name: AI Semantic Release

on:
workflow_dispatch:
inputs:
dry_run:
description: "Dry run (don't create release)"
type: boolean
default: false

permissions:
contents: write
models: read

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true

- name: Get commits since last tag
id: commits
run: |
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
echo "No previous tag found, using full history"
COMMITS=$(git log --oneline --no-decorate)
else
echo "last_tag=$LAST_TAG" >> "$GITHUB_OUTPUT"
COMMITS=$(git log "${LAST_TAG}..HEAD" --oneline --no-decorate)
fi
if [ -z "$COMMITS" ]; then
echo "No new commits since $LAST_TAG"
exit 1
fi
# Store commits in a file — all AI prompt assembly uses jq for
# JSON encoding, so commit messages never hit shell interpolation.
echo "$COMMITS" > /tmp/commits.txt
echo "count=$(echo "$COMMITS" | wc -l)" >> "$GITHUB_OUTPUT"
cat /tmp/commits.txt

- name: Determine version bump with AI
id: ai
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
LAST_TAG="${{ steps.commits.outputs.last_tag }}"
COMMITS=$(cat /tmp/commits.txt)

# Build the prompt as a shell variable — commit log is injected
# via jq --arg (JSON-escaped), never shell-interpolated.
read -r -d '' SYSTEM_PROMPT << 'EOF' || true
You are a semantic versioning assistant for a Windows DLL project (nEVR Runtime — game patches for Echo VR).

Rules:
- MAJOR (breaking): changes to DLL interfaces, removed features, protocol changes that break existing clients/servers, renamed deploy-as DLLs
- MINOR (feature): new features, new plugins, new CLI flags, new hooks, significant enhancements
- PATCH (fix): bug fixes, refactors that don't change behavior, build improvements, documentation

Respond with EXACTLY this format (no markdown fences, no extra text):
BUMP: major|minor|patch
TITLE: <one-line release title, imperative mood, no version number>
NOTES:
<bulleted release notes grouped by: Breaking Changes, Features, Fixes, Other. Omit empty groups. Use markdown.>
EOF

USER_MSG=$(printf 'Current version: %s\n\nCommits since last release:\n%s' "$LAST_TAG" "$COMMITS")

PAYLOAD=$(jq -n \
--arg system "$SYSTEM_PROMPT" \
--arg user "$USER_MSG" \
'{
model: "openai/gpt-4o-mini",
messages: [
{role: "system", content: $system},
{role: "user", content: $user}
],
temperature: 0
}')

RESPONSE=$(curl -sf \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Content-Type: application/json" \
-d "$PAYLOAD" \
"https://models.github.ai/inference/chat/completions")

CONTENT=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // empty')
if [ -z "$CONTENT" ]; then
echo "::error::AI response failed"
echo "$RESPONSE" | jq .
exit 1
fi

echo "$CONTENT"

BUMP=$(echo "$CONTENT" | grep '^BUMP:' | sed 's/BUMP: *//')
TITLE=$(echo "$CONTENT" | grep '^TITLE:' | sed 's/TITLE: *//')
NOTES=$(echo "$CONTENT" | sed -n '/^NOTES:/,$ { /^NOTES:/d; p }')

if [[ ! "$BUMP" =~ ^(major|minor|patch)$ ]]; then
echo "::error::Invalid bump type: '$BUMP'"
exit 1
fi

echo "bump=$BUMP" >> "$GITHUB_OUTPUT"
# Title goes to env file to avoid injection via step output
echo "title<<TITLE_EOF" >> "$GITHUB_OUTPUT"
echo "$TITLE" >> "$GITHUB_OUTPUT"
echo "TITLE_EOF" >> "$GITHUB_OUTPUT"

echo "$NOTES" > /tmp/release_notes.md

- name: Calculate new version
id: version
run: |
LAST_TAG="${{ steps.commits.outputs.last_tag }}"
BUMP="${{ steps.ai.outputs.bump }}"

VERSION="${LAST_TAG#v}"
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"

case "$BUMP" in
major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;;
minor) MINOR=$((MINOR + 1)); PATCH=0 ;;
patch) PATCH=$((PATCH + 1)) ;;
esac

NEW_TAG="v${MAJOR}.${MINOR}.${PATCH}"
echo "new_tag=$NEW_TAG" >> "$GITHUB_OUTPUT"
echo "Version: $LAST_TAG → $NEW_TAG ($BUMP)"

- name: Create release
if: inputs.dry_run == false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TITLE: ${{ steps.ai.outputs.title }}
NEW_TAG: ${{ steps.version.outputs.new_tag }}
TARGET_SHA: ${{ github.sha }}
run: |
gh release create "$NEW_TAG" \
--title "$NEW_TAG — $RELEASE_TITLE" \
--notes-file /tmp/release_notes.md \
--target "$TARGET_SHA"

echo "Created release: $NEW_TAG"

- name: Dry run summary
if: inputs.dry_run
env:
BUMP: ${{ steps.ai.outputs.bump }}
NEW_TAG: ${{ steps.version.outputs.new_tag }}
RELEASE_TITLE: ${{ steps.ai.outputs.title }}
run: |
{
echo "## Dry Run Results"
echo "**Bump:** $BUMP"
echo "**New tag:** $NEW_TAG"
echo "**Title:** $RELEASE_TITLE"
echo "### Release Notes"
cat /tmp/release_notes.md
} >> "$GITHUB_STEP_SUMMARY"
42 changes: 42 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,47 @@ cmake/codesign/selfsigned.crt
cmake/codesign/*.pfx
cmake/codesign/*.p12

# CA hierarchy private keys and generated certs
certs/*.key
certs/*.crt
certs/*.pem
certs/*.srl

# Git worktrees
.worktrees/

# Local game directory symlink
echovr

# Serena language server cache
.serena/

# Temporary working files
_temp/

# Environment files
extras/.env

# Claude Code session files
2026-*.txt
.claude-line/
*.lock

# MCP config
.mcp.json

# Wine
.wineprefix/
vkd3d-proton.cache*

# Cloudflare
.wrangler/

# Node
node_modules/

# Generated combat mod resources (rebuilt from echomod)
plugins/combat-mod/generated/
echovr/bin/win10/_overrides/
.clangd
dump.rdb
Loading