This is a nightly release of Vibeshine and contains several bug fixes and may contain new features. Check the commit log for more information.
Windows installer · Linux (Arch x86_64)
Nightly Windows installers are unsigned and include self-signed gamepad components. They may cause false-positive antivirus alerts.
Source: 1e4674a00adc
Since the preceding successfully published nightly Commit log
2.0.2-daily.d20261020.4: compare exact sources.
fix(web): Forward touch gestures from browser stream views
Map primary content touches to taps or drags and cancel stale gestures
when capture ends. Focus admitted classic touches before forwarding keys,
and keep classic input messages ordered with zero retransmissions.
Related: Nonary/Vibepollo#188
Co-authored-by: Codex <noreply@openai.com>
feat(network): Configure timeouts for new control peers
Publish a bounded, default-off timeout after configuration parsing, then
snapshot it once per matched peer. Keep the prior completed value during
reloads without changing established peers, ping expiry or explicit stop.
Adapted-from: https://github.com/Nonary/Vibepollo/pull/523
Original-commit: ebcce9f5d5145adf8e294e3a788394fa68aa4026
Related: Nonary/Vibepollo#522
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Codex <noreply@openai.com>
feat(display): Remove ended-session VDDs after verified restore
Add an opt-in policy that removes only owned virtual displays after a
matching final restore acknowledgment. Fence cleanup against new launches
and monitor owners; retain paused displays and uncertain recovery.
Related: Nonary/Vibepollo#517
Co-authored-by: Codex <noreply@openai.com>
feat(linux): Add a desktop companion for host control
Provide native tray status and controller actions without blocking the
desktop. Fence stale replies and coalesce polling while actions are pending.
Related: Nonary/Vibepollo#578
Adapted-from: https://github.com/Nonary/Vibepollo/pull/601
Co-authored-by: funkyotc <88894342+funkyotc@users.noreply.github.com>
Co-authored-by: Codex <noreply@openai.com>
fix(web): Preserve Monitor settings when editing applications
Hide ineffective routing controls while preserving their saved values.
Keep virtual display overrides available regardless of the stored route.
Related: Nonary/Vibepollo#501
Co-authored-by: Codex <noreply@openai.com>
feat(metrics): Expose opt-in samples to paired stream owners
Offer cached samples to authenticated owners of running video sessions.
Keep collection disabled by default and recheck current policy after waits.
Related: Nonary/Vibepollo#627
Co-authored-by: Codex <noreply@openai.com>
feat(input): Map a keyboard key to the client's Guide button
Keep the binding in each session and consume it before host injection.
Release synthetic holds on cleanup and respect downstream input permissions.
Related: Nonary/Vibepollo#444
Co-authored-by: Codex <noreply@openai.com>
fix(display): Recover the helper before virtual startup
Share one bounded reconnect attempt across preflight and display admission
so a recent restore cannot kill the helper before startup recovery runs.
Keep existing input-only display gates and restore ownership intact.
Related: Nonary/Vibepollo#582
Adapted-from: https://github.com/Nonary/Vibepollo/pull/572
Original-commit: 5ad0ae88b358df07f89c906a3ea9e7c423921ed3
Co-authored-by: Codex <noreply@openai.com>
feat(packaging): Add a checked portable Windows package
Build a separate ZIP with its runtime closure and a local-state launcher.
Reject incompatible or truncated selected PE files before creating an archive.
Related: Nonary/Vibepollo#409
Co-authored-by: Codex <noreply@openai.com>
fix(linux): Refresh KMS HDR metadata through owned encoder generations
KMS capture could reuse metadata selected at initialization after the current
connector payload changed. Keep immutable metadata bytes with each capture
generation, stop frame delivery on a readable change, and commit replacement
only after the previous encoder references have drained.
Keep the existing selection when a later observation is unavailable, and
retain the capture device only for an owned metadata handoff. Add worker,
event-loop and metadata regression coverage.
Refs: Nonary/Vibepollo#649
Co-authored-by: Codex <noreply@openai.com>
feat(linux): Add an opt-in verified SDR capture path for Hyprland
Allow the machine-session controller and broker to bind an explicitly enabled
Hyprland desktop while keeping KDE behavior and the existing HDR launch gate.
Require complete current connector properties and structurally valid SDR
metadata before capture admission and frame delivery.
Seed the validated factory observation before initial encoder getters can
reuse an older HDR blob. Preserve the owned metadata generation handoff,
refuse unknown or non-SDR strict observations, and cover lifecycle, startup,
property failure and combined capture ordering.
Refs: Nonary/Vibepollo#631
Co-authored-by: Codex <noreply@openai.com>
fix(tests): Match display recovery's final-restore contract
The portable recovery fixture still modeled the older revert API, so its
generated translation unit failed before any assertions could execute.
Model the final-restore policy and captured cleanup/control generations;
preserve existing checks and cover all ownership/display-policy pairs.
Co-authored-by: Codex <noreply@openai.com>
ci(windows): Validate portable ZIPs in qualifying package jobs
Existing Windows package jobs did not exercise the portable archive, so its
runtime payload could drift while MSI and Setup packaging stayed green.
Build a fresh portable ZIP in qualifying non-PR jobs, validate its pristine
profile and extracted runtime with the production hook, and upload it as a
separate CI artifact. Reject stale or repair-dependent archives; retain the
existing release gates and public asset selection.
Co-authored-by: Codex <noreply@openai.com>
feat(power): Add separately granted idle-only sleep requests
Let a paired client request host sleep without starting a streaming session.
Require a separate default-off device grant, an expiring one-shot token and
an idle host, then flush a framed acceptance before the Windows sleep call.
Recheck the live paired identity and grant at invocation; preserve wake
sources and never terminate active sessions or retry a failed response.
Expose capability fields and a modern device permission control for the
companion client protocol, with explicit native qualification limits.
Co-authored-by: Codex <noreply@openai.com>
feat(display): Verify private requested-resolution catalogs before capture
Require the opened producer to report support before enabling a per-client
requested-resolution catalog. Reconcile changes only at an idle private
session boundary with exact capability-backed ownership, and reject
unverified shared or peer capture instead of falling back.
Resolve retained device UUIDs to active GDI names for readiness while keeping
lease authorization bound to the UUID. Preserve legacy full-catalog behavior,
surface explicit errors, and leave driver payload pins unchanged.
Co-authored-by: Codex <noreply@openai.com>
fix(nvenc): End streams when output picture identity is lost
Reject nonempty native NVENC output whose index differs from the submitted
picture before packet timestamps can be assigned to the wrong pixels.
Latch the failure for the session and signal async shutdown before teardown,
so capture cannot recreate an encoder for the same client decoder after
continuity is lost. Keep synchronous failures on the existing shutdown path.
Co-authored-by: Codex <noreply@openai.com>
test(stream): Track requested-resolution flags in display fixtures
Model requested_resolution_only in both generated client and session
structures so production launch-session extraction compiles. Assert the
default-off and enabled values through the actual assembly path while
preserving override, resume and WebRTC precedence coverage.
Co-authored-by: Codex <noreply@openai.com>
feat(windows): Add an authenticated shortcut to end host streams
Add a disabled-by-default local helper that validates the active console
identity and its private pipe before ending streams. Close startup admission
and drain owned application, RTSP and peer callbacks before terminal cleanup
and physical display recovery. Carry the original web request ticket through
CSRF, authentication and queued execution so stale requests cannot restart
across the shortcut. Keep ordinary management routes and paired sleep fencing.
Co-authored-by: Codex <noreply@openai.com>
fix(windows): Support MinGW power capability headers
Read the named Modern Standby member when available and its documented ABI
byte in MinGW's reserved array otherwise. Keep capability-query failures and
unrelated power flags from admitting sleep, and exercise both header layouts.
Refs: Nonary/Vibepollo#652.
Co-authored-by: Codex <noreply@openai.com>
fix(installer): Recover the verified legacy MSI source safely
Missing source blocks maintenance of the audited legacy MSI. Verify its native
identity and pinned original source before retry or replacement, retaining a
verified rollback payload. Handle damaged MSI markers within populated
registration-root matching; native MSI and rollback behavior remain unqualified.
Refs: Nonary/Vibepollo#650.
Co-authored-by: Codex <noreply@openai.com>
feat(profiles): Retain explicit Monitor profile identity and settings
Keep each marked Monitor profile distinct and retain its selected settings
through the paired-client session. Validate app publications and protect
profiles during provider maintenance; preserve invalid rows for explicit repair.
Shared/physical target leases and native runtime qualification remain pending.
Partially addresses Nonary/Vibepollo#501.
Co-authored-by: Codex <noreply@openai.com>
feat(windows): Inventory legacy driver trust without changing stores
Add an operator-invoked read-only inventory and advisory planner for the two
legacy display-driver certificate pins. Preserve trust on incomplete, unsafe
or changing catalog evidence; report review leads without applying removals.
Native inventory completeness and cleanup remain unqualified. Dot-sourced
helper inputs are caller-supplied advice, not authenticated inventory.
Partially addresses Nonary/Vibepollo#647.
Co-authored-by: Codex <noreply@openai.com>
fix(tests): Pass bootstrap recovery state to reflection dispatch
The legacy dispatch harness omitted the new recovery-payload out argument,
so reflection failed before its assertions ran. Supply the argument slot
and reject unexpected MSI recovery state in the existing legacy cases.
Retain the outcome, elevation and quiet-upgrade directory checks.
Related: Nonary/Vibepollo#650
Co-authored-by: Codex <noreply@openai.com>
fix(tests): Include modular Boost.Asio in power fixture
The generated host power test includes Asio through Simple-Web-Server,
but its compile command only inherited property-tree dependencies. Pass
the combined modular include closure so the test builds without system
Boost headers. Preserve the production code and existing test cases.
Co-authored-by: Codex <noreply@openai.com>
fix(tests): Match Playnite fixture to the current pipe API
The identification fixture missed headers and still mocked the old
one-argument pipe factory. Extract the production wait helper and match
its cancellation/deadline signature so the existing security-flag and
connector lifecycle assertions can run again. Production code is unchanged.
Co-authored-by: Codex <noreply@openai.com>
feat(display): Add opt-in leases for existing monitor targets
Keep an exact physical or shared-virtual target and mode bound through
pending launches, capture, and teardown without creating or reconfiguring
the display. Fence host mutations while borrowed and persist brokered
Linux uncertainty before admission so reconnects cannot clear it.
Keep the prototype opt-in. Portable lifetime proofs and both Linux source
builds pass; native Windows and installed display/service behavior remain
unqualified. Update the affected fixture adapters without weakening their
existing assertions.
Co-authored-by: Codex <noreply@openai.com>
feat(pyrowave): Stage optional D3D12 conversion
Add a Windows conversion backend that retains source images, mutex pins,
and queue completion ownership through retirement. Fail abandoned capture
acquisitions, quarantine uncertain experimental work, and retain cache
texture identities when pooled images receive replacement resources.
Keep D3D12 conversion disabled by default. Controlled CPU fixtures and
affected Windows object compilation pass; native ownership, GPU behavior,
full encoder compilation, recovery, and performance remain unqualified.
Co-authored-by: Codex <noreply@openai.com>
fix(display): Confirm only requested recovery state
Treat unknown HDR, an omitted primary display, and legacy missing origins
as unrequested fields when confirming a saved recovery snapshot. Continue
to compare every saved mode, canonical topology, and specified field.
Recheck a stable requested state after the quiet period so a quiet but
incorrect display mode cannot be accepted as restored.
Reject a snapshot with no remaining saved modes before applying topology
or settings. Preserve its unconfirmed state and the existing fallback
policy. Add recovery-engine regression cases for partial snapshots,
missing required fields, quiet-window drift, and filtered empty modes.
Co-authored-by: Codex <noreply@openai.com>
test: repair cancel admission regression fixture
Compile the extracted cancel handler with its real host-stream admission
header and threading support. Exercise closed admission with the real
terminal barrier while preserving authentication, ownership and repeated
cancel checks.
Co-authored-by: Codex <noreply@openai.com>
test(diagnostics): add DMA-BUF layout to RGB import errors
Nonstandard-resolution reports point to a source RGB import failure, but the existing error omits the layout passed to EGL. Include the source surface dimensions, format, modifier, and plane metadata in that failure log, with tests for valid and sparse descriptors. This adds diagnostic context only; it does not change import behavior or establish incident causality.
Co-authored-by: Codex <noreply@openai.com>
fix(stream): flush graceful disconnect before peer teardown
Preserve graceful termination on the paired-client disconnect route.
The control owner sends and flushes the reason before disconnect_now clears queued packets. Keep administrative callers abrupt by default and cover ordering, failure, and race cases with the portable lifecycle fixture.
Vibepollo already contains the equivalent route and ordering, so no duplicate downstream patch is needed.
Co-authored-by: Codex <noreply@openai.com>
test(api): cover existing log export behavior
The bounded log-export correction already landed, but its root fallback and
response assembly had no focused executable regression coverage. Extract those
policies behind injected helpers and test ordering, fallback, duplicate paths,
filename construction, and archive failure while preserving the Windows route.
Co-authored-by: Codex <noreply@openai.com>
fix(display): keep Exclusive settlement checks through RESET
A disconnected Exclusive apply can lose its bounded verification while rollback, RESET, or a transient repair still owns the worker.
Drain deferred controls before resuming checks and preserve the exact Exclusive target and rollback snapshot across those barriers.
This is a scoped settlement correction; portable regressions pass, while native Windows and runtime behavior remain unverified.
Co-authored-by: Codex <noreply@openai.com>
fix(diagnostics): label occupied DMA-BUF fd slots
Describe the diagnostic count and index list as occupied FD slots. The formatter counts fd >= 0 entries and does not validate a format plane count; import behavior remains unchanged.
Co-authored-by: Codex <noreply@openai.com>
feat(input): trace ViGEm rumble callback and send results
Game and controller test tools can exercise different portions of the rumble path, so add bounded host observations to separate a matched ViGEm callback from a later local send result.
The log records the first zero and nonzero ENet send result per session and client-relative controller index. A zero means ENet accepted the packet into its outgoing queue; it does not prove delivery or gameplay output.
Refs #480.
Co-authored-by: Codex <noreply@openai.com>
test(linux): cover Arch installer fence failure
The incoming Arch AbortOnFail guard needs a regression seam for an unsafe private fence path before package replacement.
Exercise the published 2.0.0 selector and incoming hook with temporary paths and command shims; keep the production installer unchanged.
Refs #540.
Co-authored-by: Codex <noreply@openai.com>
feat(linux): label Arch fence failure phases
The private host-upgrade fence preserved fail-closed behavior but exposed only a generic failure step. Fixed phase labels now identify the check that rejected the transaction. The fixture verifies an unsafe symlink still blocks replacement before service freeze or stop and remains unchanged. This is diagnostic only; native ALPM and reporter-host behavior remain unverified.
Refs #540
Co-authored-by: Codex <noreply@openai.com>
fix(display): preserve unknown physical enumeration status
Failed or partially mapped display enumeration can look like a
successful empty device list, which can incorrectly become absence or
reappearance evidence during saved-baseline recovery.
Keep unavailable observations distinct in the physical-baseline paths.
The legacy recovery executor stays list-shaped; successful-empty Windows
enumeration completeness and the reported incident cause remain unproven.
Related-to: Nonary/Vibepollo#653
Co-authored-by: Codex <noreply@openai.com>
fix(linux): Preserve display recovery through stream teardown
Per-session Vulkan instance cleanup can stall video joins, and greeter
handoffs can lose pending physical-display restore intent.
Retain the instance until supervised shutdown and transfer only verified,
generation-matched greeter baselines without overriding live layouts.
Co-authored-by: Codex <noreply@openai.com>
test(input): keep the Guide handoff fixture current
New exact-display target fields broke compilation of the extracted RTSP path fixture at the current source head.
Stub those external display boundaries so the regression still exercises the real Guide snapshot, stream allocation, and input path.
This is test-only; the Guide behavior is already present in source commit 0619cd51.
Related: Nonary/Vibepollo#444
Co-authored-by: Codex <noreply@openai.com>
feat(display): pin requested mode catalogs
Vibeshine master already contains the capability-gated caller, but its
producer pin still points at the older protocol. Advance only the driver
pin so new builds can use the opt-in protocol 3.8 catalog while clients
without the flag keep the full mode list. Reapply the one-line pin from
6c881157c080f9304a5bba7c3d90b5a595dee7af onto current master.
Co-authored-by: Codex <noreply@openai.com>
fix(capture): reset present latency on process changes
Swap-chain pointer values are only unique within a process, so a foreground PID switch can reuse the old numeric value and retain unrelated latency samples. Track the PID with the selected chain and reset refinement state when either part of that source identity changes.
This corrects the conditional timestamp-state defect; available issue logs do not prove it explains the reported choppiness.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 97ed562e39cef571b816c592985abea0d9b1eaca)
fix(pyrowave): fall back for linear capture imports
Some explicitly linear captures remain CPU-readable when Vulkan rejects their DMA-BUF. Upload bounded 32-bit RGB surfaces after producer readiness, validating allocation size and row layout while retrying required sync calls. Keep external ownership barriers only for imported images; tiled, implicit, and unsupported formats stay on the diagnostic path.
Refs: #293
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 68284d546af46e12c26e3c0026a08f277c5acd47)
fix(creds): return after displaying CLI help
Missing operands or a help operand currently print usage and then continue into credential saving, risking invalid inputs or persisting the help token.
Return the help status before saving those inputs while preserving valid operand forwarding and saver errors. Focused callback tests avoid real credential-store writes.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 6a9a7ee60c7f86446df842b702572e2ebe5b240b)
fix(display): reject snapshots missing monitor origins
Windows captures active topology and monitor positions through separate queries. A transient mismatch can leave a retained output without an origin, which the save filter previously persisted and restore later skipped.
Reject incomplete post-filter captures before storage so retries preserve the existing baseline. The guard applies to new captures; older sparse snapshots and explicit exclusions remain compatible.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit a463a58698cb9cff48eb1f691585e92612872884)
fix(installer): bound display-driver inventory waits
Move blocking Driver Store and PnP inventory reads out of the installer host and run them through each driver installer’s existing timed PowerShell process helper. Fail closed when a bounded query fails so install decisions do not proceed on unknown inventory. Add behavioral fixtures for successful, failed, timed-out child processes and result decoding.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit b80a2adfada8686733a584e552e6e9da3e283967)
test(stream): guard delayed bitrate requests after teardown
Port the issue #326 delayed paired-bitrate regression and count broadcast
construction in the fixture. The counter catches a transient restart that
a final idle-state assertion would miss.
Refs: Nonary/Vibepollo#326
Test-Basis: 6ae755e7de714b9f03fef6f44c833275ad1efd07
Co-authored-by: Codex <noreply@openai.com>
fix(input): refresh WGC geometry without capture restart
Publish verified desktop geometry only while the selected WGC target remains identical. Install the complete per-session touch-port transform from its versioned event before applying the authoritative geometry snapshot, so absolute input has stream dimensions and scale data. Preserve the old map while invalid, cancel and quarantine contacts across map or capture version changes, and reject touch/pen contacts until a complete port is usable. Keep target/capture failures on the existing reinitialization paths and recheck target identity while color events are subscribed.
This corrects input mapping and state transport only; it does not establish that geometry-only capture continuation resolves the reported WGC freeze.
Terminal geometry is fanned out on capture return, while the reinit signal is raised only for an effective capture_e::reinit status. Ordinary capture exits therefore retain Vibeshine's existing encoder teardown policy.
Ref: Nonary/Vibeshine#301
Source-base: Nonary/Vibeshine@84678f6f3f31f8bc45d1cef030144dad7aedb551
Reworks-private-candidate: d0c3deb7418e1d48878bc108cc4cb64ca77d73ff
Co-authored-by: Codex <noreply@openai.com>
fix(vhf): bound feedback poll diagnostics
Aggregate decoded feedback observations and driver poll errors into a per-slot debug summary emitted immediately, then at most every five seconds. Keep ordinary rumble queue dispatch unchanged; the counters describe local poll outcomes and do not prove client delivery or physical actuation.
Issue: #303
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 004eadaf795b575c3d1ee1532adf378747d08165)
fix(shutdown): report stalled cleanup phase
The shutdown watchdog can fire while a main-thread cleanup operation is still blocked, leaving the timeout diagnostic without a useful checkpoint.
Record selected waits and cleanup steps in a lock-free phase tracker and append the latest phase to the existing watchdog log. This remains best-effort and does not identify a blocked thread or establish the incident root cause.
Reapplied from private candidate 763d0d5c0c8abb0a51e1abafa2d96f50af2028b9.
Co-authored-by: Codex <noreply@openai.com>
chore(windows): log stream scheduling outcomes
Issue #385 needs fresh logs that distinguish successful scheduling cleanup from failures. Add info records for timer and process-priority lifecycle outcomes, and assert the extracted production callbacks emit representative records.
This improves diagnosis only; it does not change scheduling behavior or establish a physical mouse report rate.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 29d283fc996ee3d7709edd54e322494aed1771e0)
fix(tests): repair standalone test configuration
The standalone entry point lacked nlohmann discovery, omitted Boost.Process for component tests, and registered a peercred helper provided only by full-project packaging. Fast-only mode also set properties on a component it had skipped.
Reuse the project dependency fallback, request Boost.Process only for component mode, and keep optional peercred registration explicit while failing nested Linux component configuration when the required helper is missing.
Source-base: Nonary/Vibeshine@c037e0cb8741d8ab32a4ab365bc086b106220ac3
Reapplies-reviewed: Nonary/Vibeshine@e9e525f0f8cacb9df0763afed2da2b06f9ef00d0
Co-authored-by: Codex <noreply@openai.com>
Add Linux private display mode diagnostics
(cherry picked from commit 757d63860a7a92c5bcd354c97d18879e240e8a40)
(cherry picked from commit 36a8491d14a22a0b93b92a0eb3b3f011e05fdd14)
fix(display): report effective rate and guard readback parsing
The first Linux display trace could report the requested encoding rate even when the encoder later used its fallback, and malformed KScreen mode data could throw during diagnostic extraction.
Report the effective rate with the same normalization used by the encoder, and treat invalid optional mode facts as unobserved. Add behavioral coverage for framerate normalization and malformed readback fields.
These diagnostics remain observational; existing mode selection and capture fallback decisions are unchanged.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 2bf1520b3390f33e801ac85c5f6a2ad4ee892c36)
(cherry picked from commit 35b8fb6a75ac2acdba8c5daf946bdbf09df6c2cb)
fix(stream): bound ordinary video send batches by demand
Ordinary video batches were sized independently of bitrate and frame demand.
Bound each send call using FEC-expanded frame demand and the session bitrate while preserving PyroWave pacing behavior.
This is a per-call mitigation, not a diagnosis or aggregate pacing guarantee for issue #543.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit e01f7f027c76180207b9b41ae76b1e8eab7b414e)
(cherry picked from commit 0c17cf943b4e6548150a0f9c7e940e65aa427e1a)
feat(stream): make demand pacing opt-in
Issue #543 does not yet establish whether smaller sender calls change the reported black screen, wire bursts, or host overhead. Keep this demand-based pacing experiment disabled by default to preserve the published ordinary sender path. When enabled, ordinary Vibeshine streams may use a FEC-aware pacing quantum for group pacing and batch sizing; PyroWave keeps its existing policy.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 98873de1637ae647ffd18565930cae3575b119aa)
(cherry picked from commit f0e01be65a41eae43d01b1d1bd632332b7e5dc82)
Require proof before fixed issue follow-up
Treat the fixed label as a candidate awaiting reporter confirmation, and request testing only after trusted metadata matches the tagged source and dependency locks. Remove both publication-time issue closure paths.
Co-authored-by: Codex <noreply@openai.com>
Add redacted launch and resume traces
Add bounded route-stage and timing diagnostics for launch and resume, and carry request-detail redaction through direct and deferred display request construction.
Reconciles diagnostic intent from unpublished seed 6292eeab30ad90e2b17a08129893cdee1a3f1d53, originally onto published Vibeshine master 5a77c3ed895b9f5c5fc7f1e0c9055d2c2065ae57, then refreshes the same patch onto current published master d499f4b3ba50afca3c39d9de8f8e4a14cf9a0f4b. This is not an exact cherry-pick of the seed.
Co-authored-by: Codex <noreply@openai.com>
test(input): preserve controller host identity in mask regression
The regression needs to run on live public master, which now routes packet
wakeups through geometry policy. Verify the host ID passed to the platform,
its release from the allocator mask, and reuse while the other slot remains.
Reapplied from: 9a3658c0789ecea84709ddabd23e9968fd63f94f
Source-commit: 18bb3a33cd2ad8e9e6757aa2b115c0958d9b7a2c
Co-authored-by: Codex <noreply@openai.com>
fix(display): Reactivate owned inactive virtual targets in place
Fullscreen transitions can leave a driver-owned target inactive while generic recovery waits through its longer grace and rebuilds display state.
Use a bounded, lease- and adapter-verified helper operation to restore the exact target while preserving peer modes. Require a fresh frame for the output before further display mutation, and route missing or unavailable targets through generic recovery.
The reported OS request and fullscreen transition have not been reproduced.
Upstream issue: https://github.com/Nonary/Vibepollo/issues/617
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 5b4080dce96eaaaad1585f48941ae13c0d471db7)
Guard virtual display fullscreen reactivation
Keep the target reactivation lane from asking Windows to rewrite supplied peer timings, and require stable device identity before trusting a refreshed display-name capture alias.
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 41c7b0a480e91bf23e07664e3e1d344efb7c50ee)
fix(display): bind recovery capture aliases to lease
A unique friendly-name fallback can seed an identifier that later appears to be a strong match. That lets a frame from another output acknowledge recovery of the owned virtual display.
Resolve presence and verified capture aliases from the exact driver lease, and observe display-name or monitor-path aliases only after that identity check.
Add executable positive and negative controls for weak-name promotion and exact-lease capture confirmation.
Issue #617
Co-authored-by: Codex <noreply@openai.com>
fix(display): bind recovery frames to current lease identity
Friendly-name matches could classify unrelated virtual targets as present, and GDI aliases could be reassigned before a new frame arrived. Require exact driver lease identity for owned-target presence, and resolve each fresh capture output to its current device ID before confirmation. Retry failed lookups on the same capture instance with a bounded delay.
Co-authored-by: Codex <noreply@openai.com>
fix(display): keep owned recovery bound to its exact output
Do not accept a friendly-name candidate when reusing a securely reclaimed driver lease; resolve the target by stable display ID. Revalidate the captured lease identity before reactivation and retry mismatched frame identity lookups on the same capture instance after a short delay.
Add executable controls for conflicting names, identity refresh and same-instance topology remap.
Upstream issue: https://github.com/Nonary/Vibepollo/issues/617
Co-authored-by: Codex <noreply@openai.com>
fix(display): reject stale capture confirmation after lease identity changes
Record the device ID captured by the reactivation watcher and require the live lease to retain that identity before polling confirmation. A same lease/display pair can otherwise refresh its tracked device ID while a stale watcher remains pending.
Add executable controls for matching and changed identities before and after watcher installation.
Upstream issue: https://github.com/Nonary/Vibepollo/issues/617
Co-authored-by: Codex <noreply@openai.com>
Fix reclaimed display name resolution by exact ID
A securely reclaimed target can be enumerated without a usable GDI name while a peer has the same friendly name. Falling back to that peer can store its monitor path alongside the reclaimed lease.
Resolve reclaimed names only from the owned device ID and fail closed when it has no GDI mapping. Keep the existing client-name and no-client fallback behavior for ordinary reuse, with executable positive and negative controls.
Co-authored-by: Codex <noreply@openai.com>
Keep monitor path resolution bound to device ID
A known device ID can lose its enumerated path while Windows reassigns the same GDI name to another monitor. Falling back to that mutable name can bind scaling or profile work to a peer.
Resolve monitor paths by exact device ID whenever one is supplied; use DisplayConfig name matching only when no device ID is available. Keep exact-path lookup generic for physical and virtual devices, and add executable peer-alias and fallback controls.
Co-authored-by: Codex <noreply@openai.com>
Require stable identity during display readiness
When DisplayConfig has not published a target identity, selecting a device by client friendly name can promote a same-name peer into the exact device-ID check. A peer can then satisfy readiness before the created display appears.
Wait for the requested stable display ID or a target-specific DisplayConfig identity instead of seeding readiness from friendly-name or arbitrary-device fallbacks. Count the stable ID as a strong hint so weak-name and resolution candidates cannot satisfy it, with executable policy controls.
Co-authored-by: Codex <noreply@openai.com>
Bind display readiness to stable identity
Require the requested EDID identity for exact readiness when creating a display, so reassigned GDI names and monitor paths cannot make a same-name peer look like the new target. Derive the published name and monitor path from the selected exact device ID, and do not seed its ID from the mutable GDI alias.
Add executable policy controls for the mutable-alias case and readiness fallback behavior.
Co-authored-by: Codex <noreply@openai.com>
Require identity for virtual display persistence
A readiness candidate may match the requested EDID while device enumeration leaves its device ID empty. Persistence confirmation must then fail closed instead of treating any remaining virtual display as the created target. When an ID is known, it must also remain authoritative over a mutable display-name alias.
Extend the live-recovery harness to compile and execute the production presence check with empty-identity, wrong-ID/same-name, exact-ID, and name-only controls.
Co-authored-by: Codex <noreply@openai.com>
fix(display): rebind reuse aliases to the selected target
A reused client-name match can seed a GDI alias from a peer whose device ID is empty, even when readiness later selects the requested EDID target. Rebind the published name to the selected stable device ID after readiness and suppress client-name fallback whenever a stable display identity is known. Keep the alias unset when Windows cannot provide the selected ID, so persistence cannot confirm a peer by name alone. Add executable controls for exact rebinding, unresolved identity, and legacy behavior.
Fixes #617
Co-authored-by: Codex <noreply@openai.com>
fix(display): drop peer ID hints for stable target reuse
Ordinary reuse can begin with a client-name device ID that belongs to a peer. When readiness is bound to the requested stable display identity, do not carry that unverified ID through an EDID match that exposes no device ID. Preserve the exact ID for a securely reclaimed lease and keep the legacy name candidate only when no stable target identity is available. Use the numeric display ID as the stable-identity gate and extend the executable policy controls.
Fixes #617
Co-authored-by: Codex <noreply@openai.com>
fix(display): reject ambiguous stable EDID matches
Count every virtual display with the requested EDID projection before readiness can adopt one. If the projection matches more than one enumerated candidate, fail closed instead of taking the first peer.
Fixes #617
Co-authored-by: Codex <noreply@openai.com>
fix(display): verify stable targets with ContainerID
The EDID product and serial fields are a lossy projection of the 64-bit display ID. Require the monitor devnode ContainerID before a stable identity can select a readiness target, and reject duplicate complete matches.
Add executable controls for a lone colliding peer and duplicate full identities. Native Windows SetupAPI behavior remains a qualification gap.
Fixes #617
Co-authored-by: Codex <noreply@openai.com>
test(pyrowave): repair D3D12 retention harness
test(pairing-recovery): cover divergent backup isolation
Duplicate pairing certificates fail closed, so recovery needs an explicit offline survivor choice. Exercise a valid divergent backup to ensure candidate preparation uses only primary state and preserves both snapshots. This adds regression coverage; it does not repair an affected host state.
Refs #308
Co-authored-by: Codex <noreply@openai.com>
(cherry picked from commit 4207315c34f38f6bfe591eac268ed193c0bd2e1a)
feat(display): add opt-in IddCx frame-push capture
Add a D3D11 four-slot consumer and owner-authenticated target lookup to the Windows capture selector. Require explicit build opt-in and a validated first frame before activation, while retaining WGC fallback for unsupported or unavailable targets.
Refs: #626
Co-authored-by: Codex <noreply@openai.com>
build(display): pair frame-push host with driver protocol
The default driver pin lacks the protocol header and producer used by the opt-in capture path. Point the host at the reviewed current-master driver candidate so their interfaces match when explicitly enabled.
Keep this host pin behind the driver commit; do not publish it before that revision is publicly reachable.
Refs: #626
Co-authored-by: Codex <noreply@openai.com>
build(display): keep frame producer paired with host opt-in
build(display): pin DXGI importer include fix
fix: preserve frame-push capture across input geometry updates
fix: repair Arch builds and diagnose Windows probe
The Shine policy test omitted its header-only JSON target, and Pollo's
shared header used a geometry include path absent from its test target.
Scope the JSON dependency to that test and use the repository-root path.
Keep the Windows rollback probe's assertion unchanged while reporting
captured length and UTF-16 output on failure; native rerun is required
to identify the process-capture mismatch.
Co-authored-by: Codex <noreply@openai.com>
fix(nightly): isolate query output and link Boost.UUID
Both native validation paths stopped before qualification: PowerShell first-use progress polluted Sunshine's merged query output, and the portable display-recovery test lacked Boost.UUID's include usage requirement.
Set the child progress preference only for the bounded Sunshine query and link Boost::uuid to the test that includes its headers. Keep the exact-output, nonzero-exit, timeout, and termination checks intact.
Co-authored-by: Codex <noreply@openai.com>
fix(build): qualify Linux display recovery and MinGW dispatcher
Add Boost.UUID to the non-Windows BUILD_TESTS FetchContent component closure required by the display-recovery target. Include Winsock 2 before the dispatcher header chain on Windows so MinGW does not encounter windows.h first under -Werror=cpp.
Keep the recovery assertions and platform guards intact.
Co-authored-by: Codex <noreply@openai.com>
fix(display): remove dynamic TLS gate initializer
MinGW reports duplicate TLS initializer definitions when the dispatcher and its platform backends include the gate's thread-local depth map.
Use a constant-initialized, non-reusable per-thread token and mutex-protected gate-owned depth accounting while preserving recursive admission and moved-scope release. Add a real multi-translation-unit regression test and declare the VHF test's Boost.Process usage requirement.
Co-authored-by: Codex <noreply@openai.com>
fix(logging): inline the shared archive filename helper
confighttp.cpp includes this shared header without calling the archive filename helper, so the per-translation-unit static definition fails warnings-as-errors builds. Give the header-defined helper inline external linkage while keeping its body and generated filename unchanged.
Co-authored-by: Codex <noreply@openai.com>
fix(linux): fix Arch warning-as-error header builds
Arch builds compile shared helpers in translation units that do not use every function, and GCC treats those unused definitions as errors. Mark the C helpers static inline to retain internal linkage while avoiding unused-function diagnostics.
Clarify the lease liveness conditional so the unconditional return does not trigger misleading-indentation warnings; runtime behavior is unchanged.
Co-authored-by: Codex <noreply@openai.com>
fix(windows): qualify display borrow protocol types
The integration translation unit declares platf::display_helper before including the display settings client header, which shadows the global display_helper protocol namespace.
Qualify the three API types globally so every translation unit resolves the same protocol types regardless of include order; this changes lookup only, not behavior or signatures.
Co-authored-by: Codex <noreply@openai.com>
fix(nightly): stabilize native regression build and recovery
Recent nightly validation exposed stale extracted test bodies, incomplete component declarations, and recovery paths that could verify against a retired display identity. Align the fixtures with current production APIs while preserving their behavioral checks, serialize Linux display-power lease admission, and keep Exclusive rollback verification on the restored topology through the final probe. Correct the confirmed Windows duplicate definition, missing declaration include, and BOM parse failure without weakening compiler or safety checks.
Co-authored-by: Codex <noreply@openai.com>
fix(display): preserve exclusive settlement through final probe
After bounded disconnect repairs, resetting settlement before the final Exclusive check caused its callback to be discarded, preventing recovery when the exact topology still failed.
Keep the captured topology and settlement ownership through that final probe. Record direct verification as zero-delay in the fake dispatcher so delayed timings cannot leak into later assertions.
Co-authored-by: Codex <noreply@openai.com>
fix(linux): Use commit-specific DRM presentation timestamps
Keep capture source timing tied to the completed flip rather than worker scheduling. Update the DRM driver and cover delayed publication, timeout and independent CRTC behavior.
Co-authored-by: Codex <noreply@openai.com>
fix(linux): Hold screen state while private topology is retained
Prevent idle screen-off transactions while only a retained private output remains lit after streaming. Use a separate screen-only inhibitor that allows suspend and releases after physical topology restoration.
Co-authored-by: Codex <noreply@openai.com>
feat(linux): Preserve GPU fault evidence through late shutdown
Keep incident recording alive through ordinary service shutdown and send late kernel and systemd messages to an independent netconsole receiver. Repair the broker socket ordering cycle while preserving shutdown cleanup.
Co-authored-by: Codex <noreply@openai.com>
fix(installer): Identify local builds and accept native companions
Distinguish local builds from clean release tags with a commit-based version suffix while retaining existing artifact versions when skipping builds. Include the native tray and package preflight artifacts in installation validation.
Co-authored-by: Codex <noreply@openai.com>
fix(hdr): Preserve PQ transfer in eight-bit Linux capture
Framebuffer precision does not identify whether captured pixels already contain HDR. Carry the capture color state into PyroWave conversion so native PQ is not expanded as SDR a second time.
Co-authored-by: Codex <noreply@openai.com>
fix(web): Apply display actions to virtual application layouts
Expose display actions for virtual outputs in both interfaces and select an activating action when choosing a layout. Explain inherited settings that prevent layout application and cover the application display flow.
Co-authored-by: Codex <noreply@openai.com>
feat(tools): Add native Linux TrueHDR reference harness
Provide pinned runtime extraction, raw-frame conversion and resident GPU benchmarks for investigating NVIDIA TrueHDR on Linux. Include a Windows reference capture and explicit pixel comparison without claiming unverified Windows parity.
Co-authored-by: Codex <noreply@openai.com>
fix(tests): Link frame transport validation into catalog tests
The updated virtual-display control client depends on frame transport validation. Include its implementation in the standalone catalog test target so the complete native build links successfully.
Co-authored-by: Codex <noreply@openai.com>
test(gpu): Retire the shared instance before loader teardown
The encode/decode fixture left its shared Vulkan instance for static destruction after the codec released the loader. Match the host shutdown order on both normal return and exceptions so successful GPU cases also exit cleanly.
Co-authored-by: Codex <noreply@openai.com>
fix(windows): Pin driver import library correction for nightly links
The hosted UCRT build links the frame importer into the final executable. Advance the driver pin to the toolchain-specific OneCore linkage fix so the Windows nightly can link while MSVC retains Kernelbase.
Co-authored-by: Codex <noreply@openai.com>
fix(release): Name nightly builds with their source revision
Use the base version, UTC date, and built commit SHA as the immutable nightly tag, displayed title, and application version. Keep legacy daily releases recognizable while preserving installer safety, update notifications, provenance, and reporter follow-up across the new identity.
Limit normal publication to one successful new-style nightly per day because SHA order cannot safely drive upgrades. Failed reserved builds may retry only at their exact source commit.
Co-authored-by: Codex <noreply@openai.com>
fix(pairing): Collapse 1.x duplicate client records instead of refusing startup
Vibeshine 1.x appended a new named record whenever an already-paired client
paired again, and re-imported legacy root.devices certificates on every start.
It looked clients up by certificate and stopped at the first match, so later
copies were never used for authorization, identity or settings. 2.x treated
those copies as ambiguous, stopped the HTTP interface and raised shutdown, and
the service restarted the host in a loop. Every 1.x upgrader with a re-paired
client hit it.
Collapse each duplicate group into its first record, the one 1.x used. Keep it
disabled if any copy was disabled, so no access is granted that 1.x denied.
Repeated legacy certificates carry no settings and collapse the same way. Log
each removed UUID and save the original state once as
sunshine_state.json.before-dedupe.bak.
If pairing state still cannot be loaded, keep the host and Web UI running
without exposing a new identity, and retry with backoff instead of exiting
into a service restart loop.
Addresses Nonary/vibeshine#308 and Nonary/vibeshine#298
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(windows): Define the device container property key for MinGW
The hosted nightly reached sunshine.exe linking and found an unresolved DEVPKEY_Device_ContainerId. Include initguid.h before devpkey.h in the one translation unit that uses this property so DEFINE_DEVPROPKEY emits its definition. Keep the existing SetupDiGetDevicePropertyW lookup and driver selection behavior.
Co-authored-by: Codex <codex@openai.com>
fix(windows): Define the device container property key for MinGW
The hosted nightly reached sunshine.exe linking and found an unresolved DEVPKEY_Device_ContainerId. Include initguid.h before devpkey.h in the one translation unit that uses this property so DEFINE_DEVPROPKEY emits its definition. Keep the existing SetupDiGetDevicePropertyW lookup and driver selection behavior.
Co-authored-by: Codex <codex@openai.com>
(cherry picked from commit 2a49414c00171c3fa276101ed053e57e88dbc709)
fix(vaapi): fall back to CPU upload for safe linear DMA-BUF imports
Keep direct GPU import first and preserve exporter dimensions, pitch and offsets.
Use the existing CPU upload only when its layout policy allows it, as other
Linux capture paths already do. Exercise success/failure and layout guards in
behavioral component tests. AMD GPU runtime and odd-height encoding remain
unverified; this does not replace the existing driver row-alignment fix.
feat(recovery): Prepare explicit zero-filled auxiliary state reset candidates
Refs Nonary/Vibepollo#643. Preserve originals, bind both snapshots,
require explicit token/metadata-loss acceptance, and emit private candidates
without modifying live state or claiming lost contents were recovered.
fix(video): release idle probe resources and scope GPU scheduling boosts
docs: explain HTTPS-only Web UI access on LAN
fix(input): recreate owned VHF controllers after device removal
fix(nightly): Retain exact-build Windows symbols in Actions
Nightly stripped binaries lacked a matching debug archive. Enable the reusable Windows symbols pack, keep it separate from the installer provenance and public release assets, and retain the exact-build archive for 90 days in the publish run. The strict installer asset and checksum gates remain in place.
Co-authored-by: Codex <codex@openai.com>
test(windows): Compare refresh rational fields in isolated target
The standalone display helper state-machine test links the display-device headers but not the implementation of Rational equality. Check the exact numerator and denominator so the test keeps its assertions without adding an unrelated library dependency.
Co-authored-by: Codex <codex@openai.com>
style(video): conform GPU lifetime tests to lint policy
fix(input): replay latest held state during VHF recovery
fix(display): preserve physical origins and skip idle shutdown reapply
Adapt donny110's contribution from Nonary/Vibepollo#616 at
2d9cb289cdafa8366cb9debd2f0737ba87fa85b5 to the implementation source.
Retain physical inventory origins and avoid idle topology mutations.
Recheck managed ownership atomically when committing an inventory refresh.
Co-authored-by: donny110 <63401186+donny110@users.noreply.github.com>
fix(recovery): Preserve Windows Unicode command-line paths
Address PR330-R1-001: read recovery arguments through the wide Windows
command line, strictly convert to UTF-8, and leave unrelated CLI argv
semantics unchanged. Add Unicode path and Windows boundary tests.
fix(steam): Honor working directories for direct game launches
Direct desktop-session launches inherited the home directory, leaving
Metaphor stuck during startup when it could not find relative assets.
Enter the discovered game directory before evaluating Steam launch options
and abort if it is unavailable. Cover relative assets and quoted paths.
Co-authored-by: Codex <noreply@openai.com>
fix(steam): Honor working directories for direct game launches
Direct desktop-session launches inherited the home directory, leaving
Metaphor stuck during startup when it could not find relative assets.
Enter the discovered game directory before evaluating Steam launch options
and abort if it is unavailable. Cover relative assets and quoted paths.
Co-authored-by: Codex <noreply@openai.com>
fix(input): retain battery state across VHF reconstruction
fix(display): retain failed physical restore after terminal removal
Address R2-C1: track restore intent independently of display ownership,
protect its baseline from idle inventory refresh, and retry on shutdown
without reconnecting removed monitors. Preserve clean idle no-op.
Add chained failure/removal/repeated retry regression; format added lines
with clang-format 23.1.3.
fix(portable): Permit host NVIDIA driver import
The portable PE closure ran on a GPU-less Windows host and rejected nvcuda.dll, which the installed NVIDIA driver supplies. Exempt only that unresolved driver name after the existing PE and path checks; retain failure for all other missing imports and add real CPack fixture coverage.
Co-authored-by: Codex <codex@openai.com>
fix(portable): confine NVIDIA driver import to optional NGX
The pinned TrueHDR runtime eagerly imports nvcuda.dll, but the host loads that runtime only for RTX HDR. Permit the driver DLL only from the root NGX image, reject an eager import from any other staged PE, and smoke the extracted host on a GPU-less Windows runner before accepting the ZIP.
Co-authored-by: Codex <noreply@openai.com>
fix(portable): inspect NVIDIA imports on every Windows runner
An NVIDIA-equipped builder can resolve nvcuda.dll, so conditioning the optional runtime guard on an unresolved import misses eager host dependencies. Scan staged PE imports on every package build and cover both resolved and unresolved driver cases.
Co-authored-by: Codex <noreply@openai.com>
feat(linux): Add native RTX HDR to NVENC and PyroWave
Convert opted-in SDR applications with NVIDIA TrueHDR while keeping capture
SDR and publishing HDR10 metadata. Preserve live tuning and neutral desktop
fallback, and observe foreground ownership through the desktop user service
so the broker sandbox cannot silently disable enhancement.
Co-authored-by: Codex <noreply@openai.com>
Merge remote master before publishing Linux RTX HDR
Retain the remote pairing-recovery and portable packaging fixes alongside
the locally validated Linux RTX HDR integration without rewriting history.
Co-authored-by: Codex <noreply@openai.com>
fix(input): preserve partial battery semantics across VHF recovery
Merge portable import validation before publishing RTX HDR
Preserve the concurrent Windows packaging correction while publishing the
Linux TrueHDR and PyroWave integration without replacing remote history.
Co-authored-by: Codex <noreply@openai.com>
Merge pull request #334 from Nonary/dot/pr-616-idle-display-origins
fix(display): preserve physical origins on Devices refresh and idle restart
Merge pull request #330 from Nonary/dot/issue-643-aux-state-recovery
feat(recovery): Prepare explicit reset candidates for zero-filled auxiliary state
Merge pull request #331 from Nonary/dot/issue-326-gpu-idle
fix(video): release idle probe resources and restore GPU priority
feat(windows): Enable RTX HDR for PyroWave streams
Run the existing NGX TrueHDR converter before PyroWave colour conversion,
with live tuning, peak compensation and neutral fallback during initialization.
Copy capture into a private texture before releasing its keyed mutex so NGX
cannot hold up capture. Cover shader variants and native GPU conversion paths.
Co-authored-by: Codex <noreply@openai.com>
Merge concurrent recovery and GPU lifetime fixes
Preserve the independently published recovery, display and probe-lifetime
corrections alongside PyroWave RTX HDR without rewriting remote history.
Co-authored-by: Codex <noreply@openai.com>
fix(linux): allow synthesized HDR from Hyprland SDR capture
Hyprland KMS rejected every HDR stream before distinguishing a native HDR capture request from RTX HDR conversion. Gate on the required source format so opted-in TrueHDR sessions can use a physical SDR output; retain the virtual-display and native HDR restrictions.
Co-authored-by: Codex <noreply@openai.com>
fix(release): preserve Linux display restores and gate RTX HDR controls
Keep inventory reads from replacing a pending physical restore baseline. Show Linux RTX HDR controls only when the built host reports TrueHDR support, including global settings and both UI generations.
Require an explicit separate-state attestation before preparing auxiliary reset candidates, because zero-filled offline copies cannot prove their configured origin. Record that assertion in the manifest and update the operator guide and coverage.
Co-authored-by: Codex <codex@openai.com>
Merge pull request #333 from Nonary/dot/issue-658-suspend-gamepad
fix(input): recover owned VHF controllers after device removal
test(display): Cover pending restore after terminal removal
Align the terminal composition fixture with the merged idle shutdown policy.
Require clean idle shutdown to avoid topology reapply, and retain the failure
check for a removed display that still has pending physical restore work.
Co-authored-by: Codex <noreply@openai.com>
Merge Hyprland HDR capture admission before publication
Preserve synthesized HDR admission for SDR Hyprland capture alongside
PyroWave RTX HDR and the measured Linux encode optimizations.
Co-authored-by: Codex <noreply@openai.com>
perf(pyrowave): Keep Linux TrueHDR synchronization on the GPU
Replace intermediate CPU fence and CUDA stream waits with an external
timeline semaphore, retaining the synchronous compatibility path and explicit
GPU ownership transfers. Reuse unchanged cursor and gamma textures.
Add a complete 4K HDR 4:4:4 benchmark and exercise both synchronization paths
against independent native TrueHDR output.
Co-authored-by: Codex <noreply@openai.com>
Merge concurrent release and controller recovery fixes
Keep the published Linux display restore, RTX HDR capability gating and
Windows controller recovery corrections in the final validated installation.
Co-authored-by: Codex <noreply@openai.com>
fix(linux): Keep TrueHDR CUDA dispatch layouts consistent
FFmpeg bundled headers overrode the pinned SDK in the TrueHDR library,
so native HEVC HDR initialization called unrelated CUDA entry points and
could segfault during cleanup. Apply pinned-header precedence after the
bulk include paths and verify layouts using production compiler commands.
Co-authored-by: Codex <noreply@openai.com>
ci: Build nightly prereleases from the canary branch
Allow contributors to share changes through canary while master remains the stable review lane. Resolve and pin the confirmed remote canary tip, retain workflow parity and qualification checks, and include canary pull requests in CI.
Co-authored-by: Codex <noreply@openai.com>
Merge pull request #338 from Nonary/dot/issue-644-dmabuf-alignment
Bring reviewed VAAPI fallback into canary
fix(ci): Run nightly portable validation with host Python
The Windows package step completed but MSYS2 could not find Python, so qualification stopped before checking the ZIP. Run the same validator in PowerShell after packaging and permit an exact canary-ref manual nightly while the source lane is canary.
Co-authored-by: Codex <noreply@openai.com>
fix(ci): Give PR package builds a valid version
PR checks previously passed 0.0.0 into CMake, so native validation failed before compiling even though production rightly rejects that version. Derive a commit-bound validation prerelease from the latest merged stable tag and keep the zero-version safety gate intact.
Co-authored-by: Codex <noreply@openai.com>
fix(ci): Keep PR validation installers below stable
Use the current stable numeric base for commit-bound PR prereleases so validation packages cannot supersede the corresponding stable MSI. Keep candidate versions inside the supported WiX patch range.
Co-authored-by: Codex <noreply@openai.com>
Revert "fix(ci): Keep PR validation installers below stable"
This reverts commit a6ae1ad9b1978334cb14c783e24da405cc0993e6.
Revert "fix(ci): Give PR package builds a valid version"
This reverts commit be41524b0c4a91a2fa9241b2bec4ac3d5dc36049.
Merge pull request #339 from Nonary/fix/nightly-portable-python
Fix nightly portable validation on canary
ci: run common lint only on manual dispatch
Merge pull request #332 from Nonary/dot/issue-315-https-guidance
docs: clarify HTTPS-only Web UI access from LAN devices
fix(windows): load Winsock headers before Windows SDK
MinGW rejects pyrowave_encode.cpp when D3D headers include windows.h before winsock2.h. Put winsock2.h first so the native release build can compile with warnings treated as errors.
Co-authored-by: Codex <noreply@openai.com>
Merge pull request #340 from Nonary/release/fix-pyrowave-winsock-order
Fix PyroWave Windows SDK include order