Skip to content

v0.4.0

Latest

Choose a tag to compare

@github-actions github-actions released this 05 Nov 13:31
6dd9880

0.4.0 uses one H.264 viewer for Android emulators and iOS simulators. Android still uses scrcpy and the device encoder. iOS now uses the simulator helper's native H.264 encoder; the proxy converts AVCC records to Annex-B without decoding or re-encoding video on the host.

Changed

  • Video buffers stay bounded. After dropping dependent frames, playback waits for a keyframe rather than decoding an incomplete sequence.
  • Decoder setup, playback, reset, and terminal disposal have explicit states. Obsolete codec checks and decoder outputs cannot revive a stopped viewer.
  • Capture recovery keeps the device handle and automation session attached. If the capture helper exits, the next stream request restarts capture and rotates the viewer proxy's credentials.
  • Device ownership records now include reservation, attachment, retirement, rollback, and failed cleanup. Failed cleanup keeps ownership reserved, and retries only unfinished steps.
  • Cancelling queued work prevents dispatch. Cancelling running native commands terminates the command before the queue advances; input already sent to the device cannot be undone.
  • Native operations have a 120-second deadline. The RPC deadline allows another 15 seconds for cancellation, cleanup, and returning an outcome. Failures retain whether the action may have executed.

Fixed

  • A capture helper that exits between readiness and publication is rejected instead of being returned as active.
  • Failed initial state publication closes the desktop connection so a fresh connection can retry. Late readiness completion cannot resurrect a closed connection.
  • Failed or ended session-event subscriptions reconnect with cancellable backoff, capped at five seconds.
  • Cleanup after session deletion or movement remains retryable and does not block another session's cleanup.
  • Shutdown intent survives failed cleanup when the retry omits the flag. Explicit shutdown: false releases the attachment without another power-off attempt. Physical-device aliases cannot bypass ownership or cause rollback to shut down another session's device.
  • Disposal cancels pending discovery and recovery. Destroyed viewers cannot reconnect or retain decode timers.

Overlapping old tests were consolidated into transition tables, and the previous all-in-one desktop test was split into focused cases. Production function complexity is limited to nine. No runtime dependency or FSM framework was added.

Update

Update the plugin pin in your global OpenCode configuration, preserving other settings:

{
  "$schema": "https://opencode.ai/config.json",
  "plugins": ["github:viralcodex/opencode-demul#v0.4.0"]
}

Plugin exports and tool names are unchanged. Android still requires SDK Platform-Tools, Emulator, and a configured AVD. iOS requires Xcode and an iOS Simulator runtime on macOS. Both require Node 22.19+ on the 22.x line, or Node 24+, with npm.

Full changelog: v0.3.0...v0.4.0