feat(windows): add HyperHQ launcher and bridge plugin#806
Conversation
Adds a HyperHQ launcher to the Windows platform. Zaparoo Core hosts a named pipe at \\.\pipe\zaparoo-hyperhq-ipc and exchanges JSON-line messages with a bridge plugin (separate Go module under scripts/windows/hyperhq-plugin/) that HyperHQ launches as a Socket.IO plugin per the API at https://docs.hyperai.io/docs/plugins/. Two wire formats: pipe (Core <-> bridge) is internal PascalCase JSON; HyperHQ Socket.IO (bridge <-> HyperHQ) is camelCase per the API. The bridge handles challenge-response auth, plugin:register, subscribeEvents, requestData/dataResponse routing by requestId, and the hyperHqEvent envelope (gameLaunched / gameClosed). Bridge module is exempt from forbidigo and depguard so it can use stdlib sync and log without pulling Zaparoo Core internals into its dep tree. Linted via task cross-lint:windows since winio is Windows-only.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (6)
✅ Files skipped from review due to trivial changes (2)
📝 WalkthroughWalkthroughAdds Windows HyperHQ support: a named-pipe server in core, a Windows bridge plugin (Socket.IO client) with build artifacts, hyperhq URI scheme, a HyperHQ launcher, tests, and lint/build task updates. ChangesHyperHQ Windows Integration
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
scripts/windows/hyperhq-plugin/main.go (1)
224-857: 🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy liftPlease add tests for the new bridge module.
I don't see companion coverage in this diff for the auth handshake, pipe request routing, or reconnect/error paths, and this file carries most of the new protocol risk.
As per coding guidelines, "Write tests for all new code — follow TESTING.md and pkg/testing/README.md patterns".
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/windows/hyperhq-plugin/main.go` around lines 224 - 857, Add unit/integration tests for the new bridge behavior: create tests exercising the authentication handshake and reconnect path (exercise connectSocket by driving "connect" and "authenticated" events and assert sessionToken set and authDone behavior), request/response routing (test requestData/requestDataCtx together with handleDataResponse to ensure pendingData mapping, cleanup, and error paths), lifecycle request handling (call handleLifecycleRequest with various hqLifecycleRequest payloads including missing ID and hqMethodShutdown to verify plugin:response emit and cancel), pipe interaction (exercise writePipeEvent, servePipeOnce/runPipeLoop by faking a pipe connection or using an in-memory net.Pipe to verify pushed Systems/Games and command routing via handlePipeCommand), and edge cases (decodeFirst, unmarshalIfPresent, newRequestID uniqueness/fallback). Follow TESTING.md and pkg/testing/README.md patterns: add a _test.go beside main.go, use test doubles/mocked socketio server and a fake pipe connection, control contexts/timeouts to exercise reconnects and error returns, and assert logs/returned errors where appropriate.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@scripts/windows/hyperhq-plugin/go.mod`:
- Line 3: The linter version in .golangci.yml is pinned to go: "1.25" which
conflicts with the root module's go 1.26.3 and the plugin's go 1.26.2; update
the go setting in .golangci.yml from "1.25" to "1.26.3" so the linter target
matches the root go.mod, and optionally also bump the plugin's go directive in
scripts/windows/hyperhq-plugin/go.mod from 1.26.2 to 1.26.3 to keep all go
versions consistent across the repo.
In `@scripts/windows/hyperhq-plugin/main.go`:
- Around line 584-586: The goroutines started by b.pushSystems and pushGames are
using the shared b.pipeWriter and can outlive servePipeOnce, causing late writes
to hit a new session; fix by making the work session-scoped: in servePipeOnce
create a per-connection context or generation ID and a session-scoped writer
(e.g. capture the current b.pipeWriter into a local variable or pass a
sessionWriter interface into pushSystems/pushGames), pass that session writer
and context/generation into the goroutines, have the goroutines check the
context/generation (or return early if writer is nil/closed) before writing, and
cancel or bump the generation on reconnect so late completions are dropped
instead of writing to the new pipe.
- Around line 384-386: The disconnect handler registered via onSocket should
clear the bridge's authentication state so requestDataCtx doesn't think the
bridge is still authenticated; inside the "disconnect" callback clear
b.sessionToken (and optionally b.authenticated or any flag used to indicate an
authenticated state) so subsequent transient reconnects don't use a stale token
until a new "authenticated" event repopulates it.
---
Outside diff comments:
In `@scripts/windows/hyperhq-plugin/main.go`:
- Around line 224-857: Add unit/integration tests for the new bridge behavior:
create tests exercising the authentication handshake and reconnect path
(exercise connectSocket by driving "connect" and "authenticated" events and
assert sessionToken set and authDone behavior), request/response routing (test
requestData/requestDataCtx together with handleDataResponse to ensure
pendingData mapping, cleanup, and error paths), lifecycle request handling (call
handleLifecycleRequest with various hqLifecycleRequest payloads including
missing ID and hqMethodShutdown to verify plugin:response emit and cancel), pipe
interaction (exercise writePipeEvent, servePipeOnce/runPipeLoop by faking a pipe
connection or using an in-memory net.Pipe to verify pushed Systems/Games and
command routing via handlePipeCommand), and edge cases (decodeFirst,
unmarshalIfPresent, newRequestID uniqueness/fallback). Follow TESTING.md and
pkg/testing/README.md patterns: add a _test.go beside main.go, use test
doubles/mocked socketio server and a fake pipe connection, control
contexts/timeouts to exercise reconnects and error returns, and assert
logs/returned errors where appropriate.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 207c0fcd-bec9-4c97-98a6-7d6d7c3f1593
⛔ Files ignored due to path filters (1)
scripts/windows/hyperhq-plugin/go.sumis excluded by!**/*.sum
📒 Files selected for processing (13)
.golangci.ymlTaskfile.dist.ymlpkg/platforms/shared/schemes.gopkg/platforms/windows/hyperhq.gopkg/platforms/windows/hyperhq_test.gopkg/platforms/windows/launchbox.gopkg/platforms/windows/platform.goscripts/tasks/cross-lint.ymlscripts/tasks/windows.ymlscripts/windows/hyperhq-plugin/Dockerfilescripts/windows/hyperhq-plugin/go.modscripts/windows/hyperhq-plugin/main.goscripts/windows/hyperhq-plugin/plugin.json
\\.\pipe\zaparoo-hyperhq-ipcand exchanges JSON-line messages with a separate bridge plugin underscripts/windows/hyperhq-plugin/that HyperHQ runs as a Socket.IO plugin per the HyperAI plugin API.plugin:register,subscribeEvents,requestData/dataResponserouting byrequestId, and thehyperHqEventenvelope (gameLaunched/gameClosed).syncandlogwithout pulling Zaparoo Core internals into its dep tree. Linted viatask cross-lint:windowssince winio is Windows-only.Summary by CodeRabbit
New Features
Bug Fixes
Chores
Tests